如上图所示,系统调试管理模块为整个调试系统的核心,具备平台无关性,可迅速移植至各类平台。当调试系统需迁移至不同平台时,我们仅需实现调试信息输出通道即可。
所以,我们所需要探讨的核心问题是,如何通过特定通道将调试信息传输至终端设备以实现展示。因此,我们并非关注调试信息在何种终端设备上展示,而是关注调试信息的输出通道。那么,调试信息可以通过哪些输出通道进行传输呢?其中包括 FLASH、RAM、蓝牙、网络、串口等手段。接下来,我们将分别详细分析上述几种输出渠道在实际工程项目中的具体应用。
几种调试信息输出通道介绍
1、FLASH
实际上,单片机的FLASH存储器与文件系统中的文件具有相似性,只是单片机资源有限且对实时性要求更高,因而FLASH无法完整记录所有调试信息。但由于FLASH掉电后数据不会丢失的特点,使其适合于已量产并交互客户的产品问题的定位。为了能够定位到已交付客户的设备问题,我们可以让FLASH仅记录等级较高的调试信息,如错误、警告以及关键信息等。
2、RAM
其实,对于小资源的芯片来说,一般RAM资源是很紧缺的,因而一般不会使用RAM去存储调试信息。特别是对于低功耗设备来说更是如此。
3、蓝牙
对于配备蓝牙外设功能的芯片,我们能够通过蓝牙传输调试信息,并且可以在多种终端设备上进行展示。例如:蓝牙转串口输出到PC串口工具显示、手机APP等。对于利用蓝牙来作为调试信息的传输通道,有个很大的好处是,对于已交互客户的设备,我们不用拆机焊线,就可以直接读取到调试信息。但是相对来说,单片机带有蓝牙不是很常见。
4、网络
对于配备Wi-Fi或有线网卡的设备而言,获取调试信息相对较为简便,并且有多种展示终端可供选择。然而,相应的,具备网络接口资源的单片机并不常见。
5、串口
相对于以上讨论的传输通道,我们更常用的其实是串口,因为几乎所有单片机都配有串口。而且其拥有较高的输出速率及稳定性。
使用模拟串口输出调试信息存在的问题
那么,当单片机的串口资源不足时,我们应采取何种措施?较为常见的解决方案是通过普通IO口模拟串口输出,并将调试信息传输至PC串口工具。然而,在模拟串口输出过程中,存在一个棘手的问题,即传输速率与稳定性之间的平衡。当模拟串口的波特率设置过高时,误码现象较为严重。产生误码的主要原因有两个:一是定时器不准确,二是调试信息传输过程中会产生中断从而导致模拟串口误码。那么,我们是否可以在输出调试信息时屏蔽中断呢?答案是否定的,因为调试信息需要实时输出,频繁地屏蔽中断会导致整个系统运行异常。既然波特率过高不合适,我们是否可以将波特率降低呢?答案同样是否定的,因为降低波特率会导致系统大部分运行时间消耗在调试信息输出上,从而严重降低整个系统的运行效率。
那么有什么办法可以既能调高波特率,又不影响系统效率的方法吗,这就是下面章节要讨论的内容。
硬件串口的时分复用
在实际工程项目中,单片机上的串口与模块间的通信频率通常较低。这意味着,在大部分时间里,该串口处于闲置状态。因此,我们可以利用时分复用技术将该串口用于调试信息的输出。那么,如何对单片机的串口进行时分复用呢?要实现单片机串口的时分复用,首先需要满足两个条件:第一,芯片的串口TX和RX引脚可以重新分配到不同的IO端口上;第二,在进行原理图设计时,需要将模拟TX口的引脚设置到支持串口重定位的TX引脚上。在满足上述两个条件的基础上,我们就可以对单片机的串口进行时分复用处理。
串口的时分复用,简而言之,是指在串口TX与模块进行通信时,采用模拟串口输出调试信息;在串口TX不与模块通信时,则使用硬件串口输出调试信息。因此,关键在于确定单片机串口何时开始与模块进行通信,以及何时与模块结束通信。假设单片机串口在与模块开始和结束通信时会调用以下两个接口,我们就可以对这两个接口进行如下处理:
相应的我们对printf最终的调用接口puts做如下处理:
通过上述对3个接口的处理,我们就可以克服串口资源不够的瓶颈,较大的提升我们的开发效率。