日志打印是常用的调试手段, 然而在线程中调用日志打印函数, 可能会引起栈深度变化导致栈溢出. 为了保证栈不溢出每个线程都需要增加一定的深度给日志打印预留, 内存小的项目可能难以提供.
以SEGGER_RTT_printf为例
函数调用很深, 每个函数都有大量的自动变量, 甚至还定义了缓冲区
char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE];
因此各个线程在调用的时候, 根据调用的位置会有不同的影响, 也可能完全无影响.
这部分内存的使用并不对产品功能有帮助, 且每个线程都会多占用一点, 如果线程较多, 那么对内存的消耗也比较可观.
利用软中断来打印, 则可以利用MSP栈, 一个打印结束就释放了内存, 另一个再打印可以共用, 可以节省较多内存.
采用SVC可以很方便地传递传递参数, 但是SVC通常设置为较高的中断优先级, 可能会阻塞其他重要的中断. 这里用一个不用的中断作为软中断来实现.
static va_list ParamList; // 参数列表
static char