为何你的IDE全速仿真可实时看变量变化,而我的却不行~

张开发
2026/6/4 21:47:48 15 分钟阅读
为何你的IDE全速仿真可实时看变量变化,而我的却不行~
正文大家好我是bug菌~前段时间有个客户想在几百年前出的机器上加一个小功能因为这款产品早就停产了说实在对于这样的需求基本没几个人想接主要是万一一个升级后出现了问题那叫一个说不清不过这个客户实在是给得太多了风险似乎也就没那么打了跟他安排上了。因为主控是一款老的ARM9片子用起来似乎没有现在的cortex系列那么顺手其中一个明显的差别就是仿真在全速运行模式下两眼一抹黑不像cortex这种支持Real-Time Transfer(RTT可能你会问RTT是啥了直接翻译就是实时传输专业一点说就是一种高效的低侵入的调试方法在芯片在全速的运行状态下你都可以看到芯片内的各种状态基本上不会影响程序的运行你应该经常看到jlink用来当做调试助手printf效果的文章或者是自己用keil等这些IDE工具的时候watch监控串口的变量会实时变化其实底层就是使用的RTT传输。以前的我遇到这样的差异并不会过多的深究还在心想全速运行的时候看不了就看不了呗打个断点停下来调试就好估计是jlink的问题~但随着自身的技术认知的变化会发现这些差异点都是为更加方便的技术手段服务的所以有必要究一究你收获的就不再是所谓的更换jlink驱动而是更加深入的技术变革~1调试架构局限以前这些主流的ARM7/ARM9内核如ARM7TDMI、ARM9TDMI他们都是基于ARMv4T/ARMv5TE架构虽然说ARM7/ARM9内核比较老了但其实现在一些厂家还是有利用这些老家伙做一些性价比较高的芯片比如ARM926EJ-S其调试功能大部分都是由EmbeddedICE-RT模块提供而这套调试机制的设计思想是调试器通过JTAG操纵CPU让CPU替调试器执行内存访问。当我们调试程序的时候大致是这样一个过程:当调试器需要读写内存时1、首先通过JTAG扫描链将CPU切换到调试状态此时被调试的程序被暂停2、向CPU的指令流水线注入一条LDR或STR指令通过扫描链插入3、CPU内核执行该指令完成实际的内存访问调试器通过扫描链读取指令结果数据或状态4、最后当绕就恢复CPU运行了。所以这样看起来每次内存访问都会打断CPU的正常执行干扰了CPU的运行专业一点就是属于典型的侵入式调试。对于需要实时性保证的系统这种暂停会造成不可预测的时序影响也无法在程序全速运行的同时持续获取数据了。当然如果你说你的ARM9可以全速持续读取数据那芯片厂家还是蛮贴心的跟你用了更好的调试功能。2Cortex的调试变革现在ARM推出的新架构什么ARMv7-M/ARMv8-M引入了全新的调试架构——CoreSight也是为了解决之前老架构的调试痛点。CoreSight调试系统的核心是一个叫DAPDebug Access Port东西DAP这个名字应该大家挺熟悉的只要是制作什么ARM调试器都是DAP什么的没错就是这个东西。DAP包含多个访问端口AP其中最常用的是AHB-AP也称作MEM-AP。AHB-AP是一个独立的总线主控设备直接连接到芯片的系统总线如AHB总线上。从图上看AHB-AP与CPU内核在总线上处于同一层次都具备发起总线读写事务的能力。这样这条bus总线大家都可以走了你别管我我也别管你所以现在无需CPU介入调试器自己就可以通过DAP控制AHB-AP进而可以在CPU全速运行的同时直接对内存RAM、外设进行读写操作了进而根据map文件与程序中的变量也就对应上了几乎对CPU的工作不会有太大的影响而且基本上cortex-M的单片机都是标配。3实时传输聊到这里如果不介绍下RTT实在是说不过去因为RTT需要借助CoreSight架构引入的DAP和AHB-AP。其实RTT就是基于RAM环形缓冲区来达到实时通信。基本原理就是在MCU的RAM中预先分配一个环形缓冲区程序运行时通过标准C库函数如printf将数据写入缓冲区而调试器则通过后台访问实时读取这些数据实现类似printf的终端输出同时还能接收输入如下图所示当然printf算是最初级的玩法了还有更多其他玩法你都可以自定义设计的。这下你应该知道为何有时候你的IDE为何不像别人那样可以实时看内存了吧~记得三连关注标星别错过我的信息~最后好了今天就跟大家分享这么多了如果你觉得有所收获一定记得点个赞~bug菌唯一、永久、免费分享嵌入式技术知识平台~推荐专辑 点击蓝色字体即可跳转☞MCU进阶专辑☞嵌入式C语言进阶专辑☞“bug说”专辑☞专辑|Linux应用程序编程大全☞专辑|学点网络知识☞专辑|手撕C语言☞专辑|手撕C语言☞专辑|经验分享☞专辑|电能控制技术☞专辑 | 从单片机到Linux

更多文章