单片机调用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;
}
相关推荐
xyx-3v1 天前
ESP32-C3开发板简单介绍
单片机·嵌入式硬件
刻BITTER1 天前
在TRAE 上安装PlatformIO
c++·单片机·嵌入式硬件·arduino
mastercoder--1 天前
速通51单片机————按键控制LED流水灯与定时器闹钟
单片机·嵌入式硬件·51单片机
西城微科方案开发1 天前
智能打气泵方案开发设计
单片机·嵌入式硬件·方案公司推荐
硅农深芯1 天前
ARM Cortex-M系列的内核型号有什么区别,该怎么选择
arm开发·单片机·芯片
jencepan1 天前
【3C拓展坞】40V20A同步四开关升降压控制器 太矽TX9575
单片机·嵌入式硬件
qq_411262421 天前
用MCU一个GPIO自锁PMOS就能实现按键开关机
单片机·嵌入式硬件
q_30238195561 天前
RK3588 + YOLOv8 田块分割实战指南:从环境搭建到部署落地全流程
人工智能·单片机·深度学习·神经网络·物联网·yolo
创界工坊工作室1 天前
DPJ-148 基于Arduino六自由度机械手设计(源代码+proteus仿真)
stm32·单片机·嵌入式硬件·51单片机·proteus
金色光环1 天前
裸机stm32移植双串口modbus从机(附源码)
stm32·单片机·嵌入式硬件