嵌入式C语言中printf函数的使用(二)——SWO引脚的巧妙应用

来源:互联网 发布:独角仙 数码兽数据库 编辑:程序博客网 时间:2024/06/05 09:44

Cortex-M3\M4系列MCU中,内核的调试组件都有一个仪器化跟踪单元(ITM)。ITM的一个主要的用途,就是支持调试信息的输出(例如,printf格式输出)。ITM包含了32个刺激端口,允许不同的软件把数据输出到不同的端口,从而让调试主机可以把它们的信息分离开。每个端口都可以独立的使能/除能,还可以允许或禁止用户进程对它执行写操作。那么这些与MCUSWO引脚有什么关系呢?刚才我们有说ITM包含了32个端口,其中SWO引脚,就是ITM模块的端口0,我们可以直接用它来输出一些调试信息。那么现在就看看如何使用它吧。

MCU连接好J-link之后,我们在工程中的主函数起始处添加stdio.h文件,如下所示。

#include <stdio.h>

接下来为了能直接调用printf函数格式化输出,又需要用到我们之前提到的重定向技术了,只是这次不是重定向到串口,而是ITM模块的0通道,即SWO引脚。如程序清单 1所示。

int fputc(int ch, FILE *f) {   ITM_SendChar(ch);   return(ch);}

其中ITM_SengChar函数是core_cm4.h内核文件里定义的内联函数,我们可以直接调用。

完成重定向之后,我们写了个定时打印HelloWorld的程序。打开Keil工程的【Options for Target->debug->settings->Trace】,对Trace选项卡进行如图 3所示的配置。

 

图 3  Trace选项卡配置

点击确定之后进入调试模式打开【View->Serial Windows->Debug(printf) Viewer这时我们就可以看到MCU通过J-link向编译器输出的打印信息了图 4所示。打印速度还很快哦。

 

图 4  Debug Viewer窗口

 

到此我们算是学会了使用SWO引脚来调试输出了,是不是很酷哦。细心的网友可能会发现为什么Cortex-M0\M0+内核的MCU没有找到SWO引脚呢?这是因为它们采用的还是ARM-V6的老架构,内核的调试组件没有ITM模块。

0 0