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通信,并验证数据的完整性和正确性。
热门推荐
无人机飞手培训校企合作特训技术详解
玩机搞机基本常识:安卓机型各种root方式面面观,选择适合自己机型的root方式
马斯克的权力基础:他的盔甲和软肋
秋冬之季,儿童健康“保卫战”!常见疾病防范秘籍
山东东明黄河河务局:法治护航 大河滔滔润东明
聚焦算力资源!上海重磅新政打造全球算力新高地
低功耗国产单片机有哪些
双胞胎是怎么形成的?双胞胎多久能查出来
双胞胎的分类与诊断
【丁兰尺】发明者考辨
综艺争议背后:观众理性反思与自我成长
《GMP无菌附录(征求意见稿)》关于“洁净区的确认和监测”更新
黄金恐迎"震荡杀"?技术指标全面超买,挑战3200后或迎回调
“太阳花”马齿苋:不仅可以当盆栽,还有珍贵价值,正适合夏季
揭秘光伏测控装置,智能监控,助力绿色能源发展
医保卡怎么绑定家人的信息?
SQL Server中数值数据类型的理解
三元催化器使用与维护指南:如何确保尾气处理系统高效运行?
租赁保函的分类及作用详解
首次公开侵华日军731部队最新罪证!该部队老兵将赴中国忏悔
【船机帮】电-液舵机液压锁简介
漫威电影全系列观影顺序:从钢铁侠到复仇者联盟4的完整指南
哪些因素影响银行的薪资待遇?
没到退休年龄人死了养老金怎么返还?
短歌、俳句与川柳:日本传统诗歌形式的区别与规则
短歌、俳句与川柳:日本传统诗歌形式的差异与规则
越来越多人放弃“不粘锅”,现流行这3种,实用又健康
萝卜汤放冰箱可以放多久 喝白萝卜汤有什么好处
办公室午休椅瑜伽:6个改善圆肩驼背的隐秘动作
如何分析黄金指数的趋势情况?这种趋势反映了怎样的市场趋势?