STM32 CubeMX FreeRtos系统 基于lwRB通用环形缓冲区的串口非阻塞发送

本文介绍了在STM32 FreeRTOS系统中,如何解决printf函数在中断中阻塞串口发送的问题。通过引入LwRB(通用环形缓冲区)实现非阻塞的串口发送,详细阐述了移植过程和必要的修改,确保线程安全和中断安全,以提高系统的实时性。
摘要由CSDN通过智能技术生成

预到问题:

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

移植

嵌入式开源组件——LwRB(RingBuffer)的移植和应用-CSDN

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_43175613

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值