War*_* P 4 embedded debugging arm cortex-m3 jtag
我的主板上的JTAG连接器上连接了一个Keil ULINK2 USB仿真器盒,它与板载Cortex-M3 CPU(TI/Stellaris/LuminaryMicro LM3S系列)配合使用.似乎JTAG和SWJ-DP端口在这些CPU上共享相同的引脚(以及板上的连接器).一个似乎没有ITM(printf)功能,另一个则没有.
以前的固件人员一直使用stdio到UART(串口),但我需要释放串口,这样调试消息不会干扰串口发送/接收的其他数据,因此我需要跟踪消息去其他地方.可悲的是,我在这块板上只有一个串口.我认为这个CPU中的ITM(跟踪)功能意味着我可以将调试printf消息直接发送到我的调试器/ IDE(Keil uVision).TI/Stellaris CPU文档将此功能称为"串行线JTAG调试端口(SWJ-DP)",我已经阅读过该支持,肯定是Keil uVision IDE中实现的功能.
在我的代码中添加printf消息会导致我的代码在我开始调试时锁定.锁定似乎在RTL库中,这些库链接到我的应用程序,在函数_sys_open中,在BKPT指令处:
_sys_open:
0x00009D7A B50E PUSH {r1-r3,lr}
0x00009D7C E9CD0100 STRD r0,r1,[sp,#0]
0x00009D80 F7FFFC0F BL.W strlen (0x000095A2)
0x00009D84 9002 STR r0,[sp,#0x08]
0x00009D86 4669 MOV r1,sp
0x00009D88 2001 MOVS r0,#0x01
>>0x00009D8A BEAB BKPT 0xAB
0x00009D8C BD0E POP {r1-r3,pc}
Run Code Online (Sandbox Code Playgroud)
以上似乎是被调用的代码的一部分__rt_lib_init_stdio_1.
到底是怎么回事?我不知道BKPT做了什么.我假设它引发了一个软件断点,然后由调试器处理?是否应该为此配置Keil/ARM ULINK2软件和硬件?是否有一些技巧使调试printf与Keil JTAG/sw端口一起工作?
我不确定sw和JTAG端口之间的区别是什么.SW单元究竟,相信它指的是用于在基板上,其中,JTAG是无痕迹支撑一个典型的但更有限的模式中的JTAG物理连接器的两个可能模式中的一个,和SW模式增加了跟踪支持不添加任何引脚连接到JTAG连接器布局?但这是嵌入式系统,其中含糊不清是常态.我是Cortex-M3开发的新手,自从旧的ARM7TDMI时代以来,很多这些东西对我来说都是新的.但Keil uVision打印出这条消息:"ITM仅适用于SW端口,而不适用于JTAG".SW是否是您必须在电路板上设计的不同物理端口?(我使用的是定制设计的应用板,而不是开发启动板.)
[谷歌搜索让我了解的事实是_sys_open,一些pragma __use_no_semihosting_swi和其他东西密切参与这个难题,ROM中的BRKPT指令可能是SWI('软件中断')ARM指令中的某些ARM变体.
War*_* P 6
这个是我无法理解stdio没有实现,而是你必须提供自己的实现,通常在一个名为"retarget.c"的文件中完成.文件名是纯粹的约定,但在Keil的uVision/RTLIB文档中有详细记录(事实证明)