CM3调试系统简析
CM3 调试系统简析
**“一直以来,单片机的调试一直不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接烧入片子,再根据错误症状来判断问题,然后修改程序重新烧,周而复始,直到问题解决或放弃为止。” **
—《Cortex-M3 权威指南》
大部分初学者在学习嵌入式软件时,往往只注重函数 API 的使用和功能的实现,对于调试工具的使用往往不求甚解,殊不知,熟练使用调试工具对嵌入式设备进行故障排查往往是必不可少的技能。
为什么我们需要使用单片机调试?你可能会问这个问题
畅想一下,当代码有好几个分支时,我们想知道当前代码执行的是哪个分支,或代码执行到某一步时,某个变量的值是多少,抑或是我们想知道某个函数被调用了几次、执行时间是多少?
你可能会说:诶,你看我可以用 LED 状态指示灯来判断当前代码的执行情况啊,我还能用这个串口通信输出变量的值,我看那个串口上位机软件接收时间不就能知道代码执行时间了嘛。
没毛病,这个方法的的确确可以,不过有十分大的限制性:
其一:代码分支复杂情况下无法判断代码执行情况;
其二:无法精确知道代码的执行时间,譬如要求精确到 us 级别;
其三:在功能无法正常运行时,无法进行调试,比如时钟初始化就有问题,后面代码都无法执行。
同时,想象一下如下情况,我们想要同时完成:
(1)使用 ADC 外设扫描八个通道电压值,采样率为 1KHz,我们想知道每个时间点上八个通道的电压值;
(2)与此同时,我们还使用了串口外设,我们想知道某个串口在某种情况下某个寄存器的值;
(3)在某个代码段的某种情况下总是出现 bug,我们想让单片机执行一次代码就暂停一下,同时查看代码中相关变量的值和相关寄存器状态;
(4)整套程序还使用了 RTOS,我们想知道每个任务的执行时间和执行顺序。
此时,你会发现基于串口通信数据输出的“调试方法”不再适用。
你:不慌,你看,我们可以创建一个定时器中断服务程序,利用串口外设,软件定时解析从 PC 端发送的各种指令,对指令进行解析输出寄存器或者变量的值,对各个任务也可以利用 CPU 主频和多个计数变量完成对任务的执行时间和执行顺序的解析。除了不能一步一步执行程序外,照样可以满足其他功能。
**确实,可以,但只限在 MCU 速率较低的情况下,实际上 51 单片机的调试工具 ISD51 在线调试模式下就是这么干的,ISD51 在 8051 系统里增加了一个串口中断函数 (ISD51 中断) 。当 ISD51 连接到 uVision 调试器时, 8051 输入 ISD51 的中断函数。只要到程序运行一被停止, 8051 就只运行 ISD51 中断服务程序。当 uVision2 调试器发出一个"Go"的指令, 8051 就脱离 ISD51 中断函数并且运行用户程序。 **
问题是,该方法会使得程序执行效率大大降低,对于 ISD51 在线模式来说,它的调试会使得程序运行速度将会比原来慢 100 倍,这将使得原本需要高速执行的程序无法正常工作,导致时序出现重大问题。
视频课程可以查看以下链接:
bilibili:https://www.bilibili.com/video/BV1bs4y1k7uT?t=2.2
原文档可以在以下链接下载: