对于嵌入式系统来说,软件细节较多,任何一条语句都可能引入问题,因此软件问题定位的技巧尤其的重要。前面讲了如何定位嵌入式系统的硬件问题,本次我聊一下,使用什么技巧来定位碰到的软件问题。
软件问题,具有一定复杂性,表现也千奇百怪,很难一概而论有哪些具体的分类。因此,我以调试手段,来切入讨论怎么解决软件问题。
硬件仿真调试工具对于嵌入式平台,最好的调试手段,是在线仿真器。“在线”即连接到目标板,“仿真器”是最早的仿真硬件的延续叫法,现在多是调试器,不仅可以配MCU来完成运行、停止、断点、烧写,还能完成变量读写、寄存器访问等功能。因为调试工具的强大功能,所以我们通常强烈建议使用调试工具,这样可以高效率地排查问题。最重要的是,实时参与,效率很高。
ARM芯片常用的调试器
串口打印消息如果没有仿真器,那该如何定位问题呢。可供后备选择的是串口,即UART。通过串口,我们可以将感兴趣的数据,从串口打印出来,然后在PC机上使用软件接收数据,来分析是否正确。例如,程序进了哪个函数、哪个分支、参数是什么值等,都可以从串口发送出去。这样就可以间接替代仿真器,实现内部关键信息的掌握。需要注意的是,打印的数据最好和代码模块及位置可以一一对应,方便准确提供定位问题的信息。
利用串口打印变量和分支信息
屏幕、按键、LED等对于极简的单片机系统,如何调试软件呢?那我们只能就地取材,系统有什么资源,那就用什么。比如,我们可以先调通硬件的屏幕或LED显示。然后,可以在屏幕上显示感兴趣的信息,或者用LED的闪烁与组合,来表示不同的含义。利用按键来模拟断点,触发停止或运行。这种方法,是不得已而为之,效率较低,是没有其他手段的最后选择。
总结尽管软件问题各式各样,但大部分的错误,都发生在逻辑判断、数值计算这两个方面。我们可以利用有效的资源,尽量掌握程序实际执行到的分支,来推断逻辑和计算是否有问题。各种手段基本都是围绕这个目的来开展问题定位。