单片机调用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;
}
相关推荐
不想学习\??!9 小时前
STM32-DMA
stm32·单片机·嵌入式硬件
WD1372980155711 小时前
WD5018 同步整流降压转换器核心特性与应用,电压12V降5V,2A电流输出
stm32·单片机·嵌入式硬件·51单片机
学不动CV了12 小时前
基于按键开源MultiButton框架深入理解代码框架(一)(指针的深入理解与应用)
c语言·arm开发·stm32·单片机·开源·51单片机
lyw20561912 小时前
GD32VW553-IOT LED呼吸灯项目
单片机·嵌入式硬件
weixin_5803820613 小时前
定时器ARR的作用
单片机·嵌入式硬件
芯岭技术15 小时前
MH32F103A单片机 可兼容替代STMCCT6/RCT6/RBT6,增强型
单片机·嵌入式硬件
S,D16 小时前
MCU进入低功耗模式前的引脚处理原则和方法 --> 以最小化低功耗电流
驱动开发·stm32·单片机·嵌入式硬件·mcu·standby·低功耗引脚处理
RaLi和夕20 小时前
单片机学习笔记.IIC通信协议(根据数据手册写IIC驱动程序,这里以普中开发板上的AT24C02为例)
c语言·笔记·单片机·嵌入式硬件·学习
Yuroo zhou20 小时前
MEMS IMU如何赋能无人机与机器人精准感知?
人工智能·单片机·嵌入式硬件·机器人·硬件架构·无人机
菜菜why1 天前
详细解析单片机启动汇编文件:以startup_stm32f407xx.s为例
汇编·单片机·嵌入式硬件·嵌入式软件