单片机调用printf概率性跑飞解决方法

最近移植软件到不同平台的单片机上时,遇到了软件概率性跑飞的问题,分析后原因均指向和printf相关的库函数(包括sprintf, vsnsprinft),在任务里调用这些函数就有概率在ucos切换任务时跑飞(中断)。增加堆栈大小等各种方法都不行。

后来各种查资料发现,可能是va_list功能不支持重入,被中断打断后,再次返回时无法恢复现场(也可能是任务切换函数写的有问题),继续运行printf时list中的内容被破坏,导致跑飞。

解决方法是自己实现printf函数,并在调用va_list功能时先关闭中断,退出va_list功能时再打开中断。sprintf等相关函数用同样方法处理即可。

复制代码
int my_printf(char* fmt, ...)
{
	va_list ap;
    int RetLen = 0;
    OS_CPU_SR cpu_sr;

    OS_ENTER_CRITICAL(); // 这里屏蔽中断
    
	va_start(ap, fmt);

    ...... // 实现代码

	va_end(ap);

    OS_EXIT_CRITICAL();

    return RetLen;
}
相关推荐
mini_nine18 分钟前
DSP28335 串口中断收发及FIFO使用
单片机·dsp开发
走错路的程序员2 小时前
stm32测频率占空比最好的方案
stm32·单片机·嵌入式硬件
Ronin-Lotus4 小时前
嵌入式硬件篇---SPI
单片机·嵌入式硬件
白天学嵌入式4 小时前
STM32f103 标准库 零基础学习之按键点灯(不涉及中断)
stm32·单片机·学习
Ronin-Lotus5 小时前
嵌入式硬件篇---陀螺仪|PID
单片机·嵌入式硬件
小智学长 | 嵌入式5 小时前
单片机-STM32部分:12、I2C
单片机·嵌入式硬件
四夕白告木贞5 小时前
stm32week15
stm32·单片机·嵌入式硬件·学习
Ronin-Lotus6 小时前
嵌入式硬件篇---TOF|PID
单片机·嵌入式硬件·c·pid·tof
weixin_452813097 小时前
如何根据HardFault中断抛出的寄存器值排查数组越界
单片机·嵌入式硬件·嵌入式软件