查看: 4796|回复: 1

MDK-ARm配合ulink的RealTime Trace功能使用

[复制链接]

该用户从未签到

发表于 2014-1-28 10:01:59 | 显示全部楼层 |阅读模式
分享到:
近期整理一些以前写的技术文档,分享给大家。
CortexM3 芯片通过SWJDP接口一般都支持SWJTAG两种调试总线协议, SWJDP接口已经将SWJTAG两种调试接口合二为一,SWJDP接口可以自动识别仿真器所用的调试协议(SWJTAG),并控制CortexM3 芯片在两种调试协议之间进行切换。CortexM3内嵌的ITM (Instrumentation Trace Macrocell) and DWT(Data Watchpoint and Trace) 调试组件可以输出一些实时跟踪信息,通过SW接口可将这些信息输出到芯片外部(JTAG不支持)ULINK2仿真器可以捕捉到这些数据并传输给keil软件进行分析。
一、目标调试阶段的配置
1.        调试器的选择
选择μVision->Debug ->Options forTarget –>Debug,并选择ULINK Cortex Debugger调试器。

4.jpg
2. 调试目标初始化文件
  在开始调试跟踪之前,有些芯片需要进行调试跟踪模块的一些初始化, 则需要选择相应的初始化文件,下图为调试STM32处理器需要加入的初始化文件示例。
按照路径\Keil\ARM\Startup\ST,将文件 STM32DBG.ini 拷贝到工程文件夹中。选择
μVision->Debug -> Options for Target –>Debug,同时在 InitializationFile 选项中选择该文件。
5.jpg
3.        Cortex-M 目标设备调试驱动配置
选择Options for Target – Debug – Settings,设置SWJ,端口选择SW(JTAG接口不支持trace数据输出)。

6.jpg
4.    Trace功能的配置
Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。为了获取正确的时间信息,Core Clock必须设置为目标板CPU的实际运行频率(有些处理器启动时运行于较低的频率,然后再切换为较高的频率,针对这种情况你可以先将Core Clock设置成较低的频率,然后再处理器切换频率前设置断点停止程序运行,然后手动将Core Clock设置为较高的频率,这样就能保证Core Clock始终和CPU实际的运行频率一样)。

7.jpg
二、实时跟踪
1.    μVision的状态栏信息
在μVision的状态栏中显示了实时跟踪的状态信息。

8.jpg
2.        实时跟踪窗口
调试时选择Peripherals – Trace。

9.jpg
1)  Trace Records窗口
该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。

10.jpg
2)  Exception Trace 窗口
该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。

11.jpg
3)  Event Counters窗口
这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。

12.jpg
3.    ITM Viewer窗口
可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。
l   在源代码中添加ITM激励端口寄存器的定义。
#define ITM_Port8(n)    (*((volatile unsigned char*)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsignedshort*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long*)(0xE0000000+4*n)))
#define DEMCR          (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA         0x01000000
l   在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
if (DEMCR & TRCENA) {
while (ITM_Port32(0) == 0);
ITM_Port8(0) = ch;
  }
return(ch);
}
l   在源代码中添加printf函数来显示调试跟踪信息。
printf("Serial Wire Output Debug Trace message");  
l   在Cortex-M TargetDriver Setup窗口中使能ITM激励端口0

13.jpg
l   在目标调试期,打开ITM Viewer窗口
选择μVision-> View -> SerialWindow -> ITM Viewer

14.jpg
完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。

15.jpg
ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。
4.    Logic Analyzer 窗口
在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。
l   在Cortex-M TargetDriver Setup窗口使能Timestamps并选择合适的Prescaler值。

16.jpg
要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。
l   添加准备观测的变量到逻辑分析器中
l   在调试过程中观测变量值的变化

17.jpg
5.    RTX Kernel Event Viewer 窗口
当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。
执行以下步骤来使能RTX Kernel Event Viewer。
l   在Cortex-M TargetDriver Setup窗口使能ITM 激励端口31
18.jpg
l   选择Trace Enable,设置正确的Core Clock。

19.jpg
l   核查Timestamps为enabled.
20.jpg
l   在目标调试过程中打开RTX Kernel窗口
选择Peripherals -> RTX Kernel
21.jpg
l   在RTX内核窗口选择Event Viewer标签      
22.jpg
在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。
回复

使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 4033 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    发表于 2014-1-29 13:45:00 | 显示全部楼层
    好文章,谢谢分享!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 10:50 , Processed in 0.134306 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.