预到问题:
FreeRtos是一个实时系统,调试时经常遇到printf打印日志,一般都是将日志通过串口等发送出去,但是串口发送是一个比较慢的外设,一般使用串口都是采用fputc重定向,但是这个函数是
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到USART1 */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1 ,1000);
return (ch);
}
一个阻塞函数,这就导致printf不能用于中断函数,复杂的要求实时高的系统是不允许的,所以为了能在中断中使用printf函数,除了自己写一个printf,还可以将fputc写成非阻塞函数。
但是这个fputc在printf中是循环调用的只发送1个字节,当然有个办法就是先将挨个保存起来,最后直接整体输出,这就有个问题,咱们不知道printf内最后一次调用这个函数是啥时候,调用了几次整体保存后要整体发送的字节数不知道,所以要设置一个变量保存调用次数。还有就是针对多线程还要保证线程安全,中断安全。因为种种原因大佬开源了神器 LwRB 通用FIFO,它不仅支持线程安全(原子操作),而且还支持DMA