利用dprintf为Cortex-M0/M0+添加类似SWO的调试输出口

M3/M4/M7都有SWO可以作为调试输出接口,而M0/M0+没有SWO,不过可以使用GDB的dprintf特性给M0/M0+添加类似SWO的调试输出能力。这在没有多余的串口可以用作调试输出口时就特别有用了。

mingdu.zheng at gmail dot com
http://blog.csdn.net/zoomdy/article/details/79251422

1、定义输出函数

定义一个空函数,该函数有一个字符串入参,函数体为空,啥也不用做,因为真正打印输出的工作是GDB来做的,这个函数提供一个接口即可。函数优化选项强制为O0,其它优化选项可能会导致str入参不可访问,访问不到str入参也就没发打印输出了。

void print_string(const char *str) __attribute__((optimize("O0")));
void print_string(const char *str)
{

}

2、调用print_string

在需要打印输出的位置调用print_string函数,如果需要格式化,可以先使用snprintf函数对数据进行格式化,再将所得的结果字符串传递给print_string。

char buffer[64];
snprintf(buffer, sizeof(buffer), "PC: %X", pc);
print_string(buffer);

3、dprintf定义输出

打开GDB开始调试流程,输入dprintf命令定义输出,然后开始执行程序,后续传递给print_string函数的字符串都可以在GDB调试控制台输出了。

dprintf print_string, "%s", str

4、工作原理

dprintf命令会在print_string函数设置特殊的断点,碰到这个断点,GDB会按照dprintf的后两个参数读取并格式化数据,然后打印出来,打印完成后继续执行程序,不会像普通断点那样停下来等待命令。所以看起来就像程序打印出来的一样。
不过要注意的是,它本质上仍然是个断点,仍然会暂停程序一小段时间(几十到几百毫秒),对有实时性要求的场合,或许这一小段时间也会引起异常。对于一般的传感器应用是没有问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值