打印
[学习笔记]

浅谈MDK下AC781x调试之ITM跟踪

[复制链接]
927|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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哦

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

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



AC781x_ITM_Debug.rar

412.3 KB

使用特权

评论回复

相关帖子

沙发
zeshoufx| | 2020-9-26 18:44 | 只看该作者
谢谢分享,,【AC781x调试之ITM跟踪】

使用特权

评论回复
板凳
marginer| | 2020-9-27 10:44 | 只看该作者
不明觉厉,顶

使用特权

评论回复
地板
nbiot| | 2020-9-27 11:38 | 只看该作者
电机调试时可以用这种吗?

使用特权

评论回复
5
GrootBrain|  楼主 | 2020-9-27 11:57 | 只看该作者
nbiot 发表于 2020-9-27 11:38
电机调试时可以用这种吗?

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

使用特权

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

90

帖子

2

粉丝