Keil开发STM32,跑ucos操作系统时,printf()函数打印小数(float)异常原因分析

        最近使用keil开发STM32,跑ucos操作系统时,串口使用printf()函数打印浮点型(float)数值,总是出错,无法打印等,但是没有加载操作系统时候,printf()函数正常。

        查询资料,发现主要有以下2个原因(第二个原因尤其需要注意):

        1、μcos操作系统是使用自己的任务堆栈来管理任务的上下文切换,堆栈空间可能不足以支持printf()函数所需要的堆栈帧大小,这可能导致堆栈溢出或者堆栈损坏,并导致异常。

       解决方法:增加任务的堆栈大小。可以在创建任务时使用OSTaskCreate()函数的第二个参数来指定堆栈大小。增加堆栈大小可能会占用更多的RAM,因此需要权衡资源利用率和堆栈要求。一般推荐堆栈大小为128、256、512等。

        2、当没有操作系统时,系统堆栈是8字节对齐的;但是使用ucos系统时,用户任务不一定是8字节对齐,故需要使用__align(8)将任务堆栈按照8字节强制对齐。

        作用是:着每个任务堆栈单元都将按照8字节边界对齐存储。这样做的目的是满足某些数据类型(如浮点数,64位整数等)的对齐要求。

解决如图:

/* stack size define */
#define  APP_TASK_START_STK_SIZE                    512
#define  APP_TASK_1_STK_SIZE                     	512
#define  APP_TASK_2_STK_SIZE                     	512
#define  APP_TASK_3_STK_SIZE                     	512
#define  APP_TASK_4_STK_SIZE                     	512
#define  APP_TASK_5_STK_SIZE                     	512
#define  APP_TASK_6_STK_SIZE                     	512


/* STACKS stack define */
__align(8) static  CPU_STK  AppTaskStartStk[ APP_TASK_START_STK_SIZE ];
__align(8) static  CPU_STK  AppTask1Stk [ APP_TASK_1_STK_SIZE ];
__align(8) static  CPU_STK  AppTask2Stk [ APP_TASK_2_STK_SIZE ];
__align(8) static  CPU_STK  AppTask3Stk [ APP_TASK_3_STK_SIZE ];
__align(8) static  CPU_STK  AppTask4Stk [ APP_TASK_4_STK_SIZE ];
__align(8) static  CPU_STK  AppTask5Stk [ APP_TASK_5_STK_SIZE ];
__align(8) static  CPU_STK  AppTask6Stk [ APP_TASK_6_STK_SIZE ];

参考:

(keil MDK)ucos浮点数支持不正常的解决方案_Liu-_--的博客-CSDN博客

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小波门下走狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值