IAR和KEIL环境下打印调试信息的方法一、Semihosting技术
Semihosting技术将应用程序中的IO请求通过一定的通道传送到主机(host),由主机上的资源响应应用程序的IO请求,而不是像在主机上执行本地应用程序一样,由应用程序所在的计算机响应应用程序IO请求,也就是将目标板的输入/输出请求从应用程序代码传递到远程运行调试器的主机的一种机制。
简单来说,目标开发板上通常不会有输入/输出这些外设,开发板运行的代码想要将结果打印出来,或者获得用户的输入,可以通过请求远程主机IO设备来实现,如:显示器,键盘等。目标开发板执行代码中加入对输入/输出设备进行访问函数,如printf,scanf等,这些函数并不是目标开发板的库函数,而是远程主机交叉编译器中带有的库函数,这些库函数被编译时,编译成一条软件中断指令。当目标开发板上电运行之后,执行到请求访问输入/输出设备指令时,产生特定中断号的软件中断SWI,与开发板相连的调试器会先截获目标板SWI请求,由于开发板程序中也可能存在用户自定义软件中断,为了区分二者,调试器会根据SWI的软中断号来判断是不是semihosting模式IO请求,如果是,则取出R0寄存器里代表的具体请求号,然后使用远程主机来响应目标板具体IO请求,而不是开发板本身去处理setmihosting请求。
semihosting仅仅是一种调试手段,它的工作原理就是利用调试
器捕捉目标环境运行过程中产生SWI中断,然后向远程主机调试环境发送对应的调试信息。也就是说目标开发板通过特定的软件中断指令,借用了远程主机的输入输出设备实现IO请求的访问。
Semihosting半主机调试模式,只能使用在开发板和调试主机通过仿真器连接的情况下,也就是说脱离了主机调试环境上述代码不能正常运行。目标开发板上执行的IO实际上是交给了远程主机来处理实现,正是因为如此,这种方式只适合在调试模式下,真正的嵌入式系统不可能依赖于主机实现IO处理的,嵌入式系统要想独立出来实现IO请求的处理,这就需要将输入输出库函数的底层相关硬件实现重定向。使用ITM机制实现调试,实现printf与scanf, ITM是ARM 在推出semihosting之后推出的新一代调试机制。
二、IAR输出调试信息方法
IAR EWARM Printf via SWO Stdout and stderr of the application can be redirected to ITM stimulus port #0. It means that stdout/stderr messages (e.g. strings sent by printf) can be transferred from the target application to the C-SPY Terminal]
Requirements:
Cortex-M3/M4 board;
printf怎么实现的J-Link/J-Trace;
IAR Embedded Workbench for ARM, V5.50.5 or later.
1. plus rerouting stdout/stderr messages via SWO (library low-level interface implementation, see the figure below).
2. except for enabling ITM stimulus port #0 and using it for routing data to the C-SPY Terminal I/O window.
3. Open the Terminal I/O window from the View menu. Start executing the application to collect Software Trace information. Stdout messages sent by printf( ) in the application will be displayed here via SWO Trace.
在IAR 选项卡内General Options /LibraryConfiguration/下Library 选项Full, Stdout/stderr 选项 viaSWO,仿真模式下设定SWO选项卡勾选Enable Ports To Terminal I/o Window Bit0,打开View下的Terminal IO 显示。
基本步骤:
a. 启动J-link SWO viewer,设置选择的MCU型号,自动检测频率;
b.设置IAR工程的General option的Library configure中选中Via SWO。
c.添加stdio.h头文件,并在程序中需要的地方添加printf函数,实现了信息的打印功能。
三、IAR虚拟的串口来实现交互和打印
这里稍微提一句,我测试的是KE驱动库的代码,但是实际上只要你看懂了我下面的解决方法(授之以渔而不是鱼),其他代码都是类似的。
1)打开KE02 platinum的IAR工程,进入到platinum.c文件,到main函数如下图1,可以看到其调用了printf打印函数,而该工程是默认调用底层串口的,我们跳转到该函数的定义如图2,再继续跳转到out_char的函数定义如图3,这下就屡清楚了,我们可以很直观的看到工程默认是调用UART底层的,下面我们就要动手改造它对printf进行重定向;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。