你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】IAR 下使用 J-Trace 进行指令跟踪

[复制链接]
STMCU小助手 发布时间:2022-3-1 13:13
一. STM32 调试特性简介
STM32 的 CPU 采用的是 Cortex-M 系列的内核(M3 或 M4),CM3 和 CM4 的调试技能较之普通的单片机有了质的飞跃。一般情况下,CM3 的调试功能可被分为两类,

1. 侵入式调试
    停机以及单步执行程序
    硬件断点
    断点指令(BKPT)
    数据观察点,作用于单一地址、一个范围的地址,以及数据大的值
    访问寄存器的值
    调试监视器异常
2. 非侵入式调试
    在内核运行的时候访问存储器
    指令跟踪,需要通过可选的嵌入式跟踪宏单元(ETM)
   通常情况下,我们采用的是侵入式调试,这种调试会打破程序的全速运行。非侵入式调试则可以再保证在程序全速运行的情况下,了解程序运行的情况,当调试大型软件和多任务系统时,非侵入式调试有着不可比拟的作用。

二. IAR 下使用 J-Trace 进行指令跟踪
1. 使能 ETM 接口
   两种方法,文件见附件:
    通用方法在初始化代码中添加
  1. static void JTrace_Init(void)
  2. {
  3. #define ETM_LockAccess (*(uint32_t *)0xE0041FB0)
  4. #define ETM_Control (*(uint32_t *)0xE0041000)
  5. #define ETM_Status (*(uint32_t *)0xE0041010)
  6. #define ETM_TriggerEvent (*(uint32_t *)0xE0041008)
  7. #define ETM_TraceEnControl (*(uint32_t *)0xE004101C)
  8. #define ETM_TraceEnEvent (*(uint32_t *)0xE0041020)
  9. #define ETM_TraceStartStop (*(uint32_t *)0xE0041024)
  10. #define ETM_TraceID (*(uint32_t *)0xE0041200)
  11. #define DBGMCU_CR (*(uint32_t *)0xE0042004)
  12. #define DEMCR (*(uint32_t *)0xE000EDFC)
  13. DBGMCU_CR |= 0xE0;
  14. GPIO_InitTypeDef GPIO_InitStructure;
  15. // Enable GPIOE clocks
  16. __GPIOE_CLK_ENABLE();
  17. // Set PE.2~6 as Output push-pull, used as Trace
  18. GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |
  19. GPIO_PIN_5 | GPIO_PIN_6;
  20. GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  21. GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
  22. //GPIO_InitStructure.Pull = GPIO_NOPULL;
  23. GPIO_InitStructure.Alternate = GPIO_AF0_TRACE;
  24. HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
  25. // unlock the write access to the ETM registers
  26. ETM_LockAccess = 0xC5ACCE55;
  27. ETM_Control = 0x00001D1E;
  28. ETM_TriggerEvent = 0x0000406F;
  29. ETM_TraceEnEvent = 0x0000006F;
  30. ETM_TraceStartStop = 0x01;
  31. ETM_Control = 0x0000191E;
  32. // config DEMCR's TRCENA bit(bit 24)
  33. DEMCR |= 1L << 24;
  34. }
复制代码
利用 IAR 的 Macro (Project -> Debugger -> User Marcos)
  1. execUserReset()
  2. {
  3. __message("-I- execUserReset");
  4. __writeMemory32(0x00000010, 0x40023830, "Memory"); //Enable GPIOE clock
  5. __writeMemory32(0x00002AA0, 0x40021000, "Memory"); //Configure PE2, PE3, PE4, PE5, and
  6. PE6 as AF
  7. __writeMemory32(0x00001550, 0x4002100C, "Memory"); // Configure GPIOE as pull-up
  8. __writeMemory32(0x00001550, 0x40021008, "Memory"); // Configure GPIOE speed as 25Mhz
  9. __writeMemory32(0x00000000, 0x40021020, "Memory"); //Enable AF0 in GPIOE_AFRL register
  10. }
复制代码


2. ETM Trace Settings


T15XWX7V$T@IY2{Q`}176RT.png

   Trace port width: CM3 和 CM4 内核支持 1 位,2 位,4 位数据输出,具体的数据宽度需考虑实际硬件设计情况。
   Trace buffer size:J-Trace 内部的缓冲区大小为 2Mbytes,FIFO 结构。
   Stall processor on FIFO full: FIFO 在 CM3 内核中,建议开启。
3. ETM Trace 窗口


T3(G7M8R%@8O1%}MB1CHWI1.png

   工具栏从左到右依次是:
    使能 ETM Trace
    清空 PC 端 Trace 记录
    在 Trace 中嵌入源码,上图中的灰色代码 int main(void)
    浏览 Trace 所对应的源码
    搜索
    存储
    ETM Trace Setting
   使能 ETM Trace 后,缺省情况下 Trace 已被触发,此时就可以对程序进行指令跟踪了。
4. 利用 Trace 断点跟踪关心的代码
   非侵入式调试时,往往会对某一段代码的运行状况更敢兴趣。这里所采用的例子是 Cube 中 FreeRTOS_SemaphoreFromISR,所关心的就是程序中运行程序后,通过外部中断释放信号量,从而唤醒被阻塞的任务(涉及任务系统调度)。利用 Trace 功能可以捕获RTOS 是如何进行任务调度的。
   通过在相关的设置 Trace Star/Stop 的断点,就可以实现此项功能,需要注意的是断点条件可以设置,数据断点:Read/Write
   指令访问断点:Fetch
   只有在正确的设置触发条件后才可以实现调试目的。

UENDR}69$QE)OJ5@K)KEOZM.png

   IAR 下的 Trace 还具有其他功能,比如函数运行统计等,这里就不一一列举了。

收藏 评论0 发布时间:2022-3-1 13:13

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版