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

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

查询资料,发现主要有以下2个原因:

1、任务堆栈过小,使用printf()格式化输出时,容易出现卡死的现象。此时需把堆栈大小改大点,推荐大小为128、256、512等。

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

解决如图:

/* 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 ];

参考:

https://blog.csdn.net/waitig1992/article/details/39319285

你可能感兴趣的:(ARM开发,stm32,单片机,arm,ucos系统)