1 printf存在的问题
1.1 打印错乱
由于任务被切换执行,导致了打印错乱的发生。
1.2 printf函数的不可重入
printf()不能同时被多个任务调用,属于不可重入函数。
解决方式:调用printf之前进行上锁,使用完之后再开锁。
1.3 printf重映射串口打印耗时
原因:
在以115200波特率进行计算,打印200byte需要耗时约19ms。串口打印影响了程序运行的实时性。
解决办法:
把串口阻塞发送改为先存入buffer中,然后通过中断或者DMA发送出去。
2 自定义调试打印组件的实现思路
debug_printf实现思路:
debug_printf代码实现流程:
3 代码实现
代码实现其实也很简单,没什么需要注意的地方,如下:
app_debug.h:
#ifndef __APP_DEBUG_H
#define __APP_DEBUG_H
#include "Freertos.h"
#include "task.h"
#define DEBUG(fmt, arg...) debug_printf("[%lu][%s:%d]" fmt "\r\n", xTaskGetTickCount()/1000, __func__, __LINE__, ##arg)
void debug_init(void);
void debug_uart_handler(void);
void debug_printf(const char *fmt,...);