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

[复制链接]
发表于 2025-9-11 19:57:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        最近移植软件到差异平台的单片机上时,遇到了软件概率性跑飞的题目,分析后缘故原由均指向和printf相干的库函数(包括sprintf, vsnsprinft),在任务里调用这些函数就有概率在ucos切换任务时跑飞(中断)。增长堆栈大小等各种方法都不行。
        后来各种查资料发现,大概是va_list功能不支持重入,被中断打断后,再次返回时无法规复现场(也大概是任务切换函数写的有题目),继续运行printf时list中的内容被破坏,导致跑飞。
        解决方法是自己实现printf函数,并在调用va_list功能时先关闭中断,退出va_list功能时再打开中断。sprintf等相干函数用同样方法处置处罚即可。
  1. int my_printf(char* fmt, ...)
  2. {
  3.         va_list ap;
  4.     int RetLen = 0;
  5.     OS_CPU_SR cpu_sr;
  6.     OS_ENTER_CRITICAL(); // 这里屏蔽中断
  7.    
  8.         va_start(ap, fmt);
  9.     ...... // 实现代码
  10.         va_end(ap);
  11.     OS_EXIT_CRITICAL();
  12.     return RetLen;
  13. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表