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