搜索

[学习笔记] 浅谈MDK下AC781x调试之ITM跟踪

[复制链接]
145|5
 楼主 | 2020-9-26 14:54 | 显示全部楼层 |阅读模式
本帖最后由 GrootBrain 于 2020-9-27 11:54 编辑

M3内核的MCU一般会有以下3种调试方式:
    1. 使用调试工具(ATC Link/ JLink等)在debug模式下调试;
    2. 使用串口调试,打印一些log、数据等;
    3. debug模式下ITM跟踪调试。

    使用第一种方式,想看看软件跑哪里去了,就必须设置断点,使软件暂停下来。在某些场合下这种调试方法就是很好用,比如调试UDS,在接收过程中打断点,就很有可能因为没有发送流控帧而导致发送端终止发送,导致整个数据流调试失败。
    第二种方式,就是必须使用一个串口(比如官方里程中使用的UART2), 这里推荐使用DMA+fifo的方式实现日志打印,好处是不用阻塞程序运行,牛扳
    第三种方式是使用内核ITM跟踪,此方式的缺点是必须要在调试方式下,必须使用SWD方式,且占用一个IO口,SWO口。但好处也是显而易见的,不需要占用串口,速度快实时性高,直接在调试窗口显示。

------------------------------------------------------------我是分隔符-----------------------------------------------------------------------------
下面开始讲解AC781x的ITM使用方法
1. 使用官网提供的ac78xx_debugout.c,文件包含#include "ac78xx_debugout.h"。
将debugout文件添加至工程.jpg

2. 启用ITM调试宏ITM_DEBUG_OUT
启用ITM调试宏.jpg

3. 使用printf函数,记得包含<stdio.h>文件哦。这里测试每500ms输出一次“Hello, this is a ITM sample demo.\r\n”,并在调用printf前拉高PB9,调用后拉低PB9,测试整个printf调用时间。
  1. #include "system_ac78xx.h"
  2. #include "ac78xx_debugout.h"
  3. #include <stdio.h>
  4. #include "ac78xx_gpio.h"

  5. int main(void)
  6. {
  7.     InitDebug();
  8.     InitDelay();
  9.    
  10.     GPIO_SetDir(GPIO_PB9, 1);       /* PB9 为输出 (LED2位置)*/
  11.    
  12.     while (1) {
  13.         GPIOB_OUT(9) = 1;                      /* PB9 输出高 */
  14.         printf("Hello, this is a ITM sample demo.\r\n");
  15.         GPIOB_OUT(9) = 0;                      /* PB9 输出低 */
  16.    
  17.         mdelay(500);
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码
4. debug设置项
仿真设置.jpg
不懂ITM stimulus Ports 各个参数含义,懂的大神可以给我解答一下

5. 仿真,打开串口下的printf view 串口,查看log
printf view 串口.jpg
在printf view串口下,将看见我们的调试信息。

这是每500ms打印一次“Hello, this is a ITM sample demo.\r\n”,我们来测量一下这个函数的调用时间

printf 调用时间

printf 调用时间

我们可以看见调用printf输出“Hello, this is a ITM sample demo.\r\n”的时间是84us,可以说是很快的了。
再次提醒一下,要接SWO引脚,要使用SWD方式debug哦

温馨提示:此函数跟输出字符长度以及格式化数据有关,请勿在实时性要求很高的中断函数内调用。

最后,代码虽然很简单,但也把源码打包上传,提供参考。



AC781x_ITM_Debug.rar

412.3 KB, 下载次数: 1

使用特权

评论回复
| 2020-9-26 18:44 | 显示全部楼层
谢谢分享,,【AC781x调试之ITM跟踪】

使用特权

评论回复
| 2020-9-27 10:44 | 显示全部楼层
不明觉厉,顶

使用特权

评论回复
| 2020-9-27 11:38 | 显示全部楼层
电机调试时可以用这种吗?

使用特权

评论回复
 楼主 | 2020-9-27 11:57 | 显示全部楼层
nbiot 发表于 2020-9-27 11:38
电机调试时可以用这种吗?

用起来,遇到问题一起学习,一起进步

使用特权

评论回复
| 2020-10-10 10:13 | 显示全部楼层
使用第一种方式,想看看软件跑哪里去了,就必须设置断点,使软件暂停下来。在某些场合下这种调试方法就是很好用,比如调试UDS,在接收过程中打断点,就很有可能因为没有发送流控帧而导致发送端终止发送,导致整个数据流调试失败。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表