本帖最后由 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"。
2. 启用ITM调试宏ITM_DEBUG_OUT
3. 使用printf函数,记得包含<stdio.h>文件哦。这里测试每500ms输出一次“Hello, this is a ITM sample demo.\r\n”,并在调用printf前拉高PB9,调用后拉低PB9,测试整个printf调用时间。
#include "system_ac78xx.h"
#include "ac78xx_debugout.h"
#include <stdio.h>
#include "ac78xx_gpio.h"
int main(void)
{
InitDebug();
InitDelay();
GPIO_SetDir(GPIO_PB9, 1); /* PB9 为输出 (LED2位置)*/
while (1) {
GPIOB_OUT(9) = 1; /* PB9 输出高 */
printf("Hello, this is a ITM sample demo.\r\n");
GPIOB_OUT(9) = 0; /* PB9 输出低 */
mdelay(500);
}
return 0;
}
4. debug设置项
不懂ITM stimulus Ports 各个参数含义,懂的大神可以给我解答一下
5. 仿真,打开串口下的printf view 串口,查看log
在printf view串口下,将看见我们的调试信息。
这是每500ms打印一次“Hello, this is a ITM sample demo.\r\n”,我们来测量一下这个函数的调用时间
我们可以看见调用printf输出“Hello, this is a ITM sample demo.\r\n”的时间是84us,可以说是很快的了。
再次提醒一下,要接SWO引脚,要使用SWD方式debug哦
温馨提示:此函数跟输出字符长度以及格式化数据有关,请勿在实时性要求很高的中断函数内调用。
最后,代码虽然很简单,但也把源码打包上传,提供参考。
|