STM32串口中断中使用printf打印遇到的问题及分析
创作时间:
作者:
@小白创作中心
STM32串口中断中使用printf打印遇到的问题及分析
引用
CSDN
1.
https://blog.csdn.net/xieliru/article/details/141572115
在STM32单片机的串口中断处理中,使用printf函数进行数据打印可能会导致数据接收异常。本文详细分析了这一问题的原因,并提供了具体的解决方案和改进建议。
问题描述
在串口中断函数中使用printf函数打印接收到的数据时,发现只收到了一个字节的数据,而预期应该是16字节数据。以下是相关的串口中断代码:
void DEBUG_USART_IRQHandler(void) //里面不要用printf函数,会导致每次只收到一个字节
{
HAL_UART_Receive(&UartHandle, (uint8_t *)UART1_RxBuff, 2, 400); //收不到这么多长度就会等待足额时间,如果收到这个数量数据就直接返回;但数据长度超过了也不好,比如长度设为5会导致收到的是后面的5个byte
__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE); //必须有,否则就会只收到一次
printf("%d %d %d\r\n", UART1_RxBuff[0], UART1_RxBuff[1],UART1_RxBuff[2]);
}
结论与快速解决方法
不要在单片机中断函数中加入printf函数,如果加入会导致不可预知的错误。解决方法是将printf函数放到中断函数外面。
在嵌入式软件及驱动开发中,需要牢记一条铁律:中断服务程序里不能调用printf和malloc函数。
原因分析
- 阻塞行为:
- printf函数通常是阻塞的,特别是在使用newlib-nano等标准C库时。在中断服务例程中使用printf可能会导致中断服务时间过长,从而阻塞其他中断或主循环的执行。
- 如果printf的缓冲区没有足够快地被清空(例如,通过UART发送),它可能会填满并导致进一步的阻塞。
- 重入性和中断安全:
- printf及其相关的标准C库函数可能不是重入安全的,这意味着它们不能安全地在中断服务例程中调用,特别是当它们访问共享资源(如UART)时。这可能导致数据损坏或不可预测的行为。
- 优先级反转:
- 如果printf在中断服务例程中执行,并且它涉及比当前中断更高优先级的任务(例如,通过操作系统任务调度),则可能导致优先级反转,这会影响系统的实时性能。
- UART缓冲区冲突:
- 如果printf和串口中断都使用相同的UART缓冲区(尽管这通常不是printf的默认行为,但取决于你的配置),则可能会发生冲突,导致数据丢失或覆盖。
改进建议
- 避免在ISR中使用printf:
- 将printf调用移出ISR。可以使用一个简单的环形缓冲区或FIFO来在ISR中存储接收到的数据,并在主循环或另一个低优先级任务中处理这些数据。
- 使用HAL库函数:
- 如果需要在ISR中处理接收到的数据,请使用HAL库提供的非阻塞或中断驱动的UART接收函数,如HAL_UART_Receive_IT。
- 实现自定义的日志系统:
- 如果需要记录调试信息,可以实现一个自定义的、轻量级的日志系统,该系统使用环形缓冲区或FIFO来存储日志消息,并在主循环中异步地将其发送到UART。
- 使用DMA进行UART传输:
- 如果可能,使用DMA(直接内存访问)来加速UART的发送和接收过程。这可以显著减少CPU的负载,并允许在传输过程中执行其他任务。
- 检查中断优先级:
- 确保UART中断的优先级设置得当,以避免优先级反转或其他中断冲突。
- 调试和测试:
- 使用调试工具(如JTAG/SWD调试器)和串口调试助手来监视UART通信,并验证数据的完整性和正确性。
热门推荐
天才儿童的学业成绩之谜:50%的天才为何成绩平平?
皮亚杰教你读懂11岁孩子的智力发展
DHA助力11岁孩子智力飞跃:科学补充指南
环保洗衣液,温和守护你的健康
人越简单,就越不简单!
上下九步行街,广州小吃你尝过哪些?
狮头鹅:中国独有的巨型鹅种
海南文昌:探索绿岛风情,领略椰乡旅游新篇章
时隔两年,童妈又出现了缺铁性贫血!孩子最容易缺的不是钙和锌,而是...
中华蚊母的养殖方法和注意事项(养蚊母树盆景的知识点)
中华蚊母的养殖方法和注意事项(养蚊母树盆景的知识点)
《陆总夫人她罪不至死》:一部展现现代企业家精神的短剧佳作
揭秘飞行模式:从航空安全到智能生活的演变
手机飞行模式完全指南:不止是坐飞机时才用得到!
宝应旅游景点推荐
晋升少将军衔,难度有多难?
欧阳询楷书教你写春联
北京春联里的年味儿
朱元璋与春联的普及:一段被遗忘的推广史
证婚人发言稿大全:三个实用范例助你完美致辞
红色钥匙指示灯亮起的原因是什么?如何解决这一问题?
苹果手机隐私保护全攻略:从系统设置到最佳实践
鹅绒产量高的大鹅品种有哪些,有哪些养殖技巧?
中国最美的10个6A景区,展现大地的壮丽与秀美
中秋国庆北京各大景点预约规则最新汇总
孩子咳嗽去诊所,3天花了近千元,医生怒批:违规雾化、滥用中药注射液
小儿肺炎吃什么药效果好
海龟汤最新题目揭秘:《工作》背后的惊人真相
一条废旧轮胎的“重生”之路
废旧轮胎回收:污染秒变“黑色黄金”,冷门暴利行业正在中国崛起