输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用。
最常用的是通过串口输出uart log,例如51单片机,只要实现串口驱动,通过串口输出就可以了。
串口这种方法实现简单,大部分嵌入式芯片都有串口功能。但是这样简单的功能有时候却不是那么好用,比如:
一款新拿到的芯片,没有串口驱动时如何打印log?
某些应用下对时序要求比较高,串口输出log占用时间太长怎么办?比如usb枚举。
某些bug正常运行时会出现,当打开串口log时又不再复现怎么办?
一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log?
本文介绍单片机没有串口时,如何打印调试信息。1 输出log信息到SRAM 准确来说这里并不是输出log,而是以一种方式不使用串口就可以看到log。在芯片开发阶段都可以连接仿真器调试,可以使用打断点的方法调试,但是有些操作如果不能被打断就没法使用断点调试了。这时候可以考虑将log打印到SRAM中,整个操作结束后再通过仿真器查看SRAM中的log buffer,这样就实现了间接的log输出。
本文使用的测试平台是stm32f407 discovery,基于usb host实验代码,对于其他嵌入式平台原理也是通用的。
首先定义一个结构体用于打印log,如下:
typedef struct { volatile u8 type; u8* buffer; /* log buffer指针*/ volatile u32 write_idx; /* log写入位置*/ volatile u32 read_idx; /* log 读取位置*/}log_dev; 定义一段SRAM空间作为log buffer
static u8 log_buffer[LOG_MAX_LEN]; log buffer是环形缓冲区,在小的buffer就可以无限打印log,缺点也很明显,如果log没有及时输出就会被新的覆盖。Buffer大小根据SRAM大小分配,这里使用1kB。
为了方便输出参数,使用printf函数来格式化输出,需要做如下配置。 |