项目场景:
`通过STM32F407搭载UCOSIII的时候,在某一任务中使用了sprintf()转换浮点数
问题描述
程序会直接卡死在显示中
if(Timenum[0] == 0)
temptime = 0.0;
else
temptime = 666667/(Timenum[0]*1.0);
sprintf((char *)timestr,"%3.2f",temptime);
LCD_Fill(152,191,232,215,WHITE); //清除之前的显示
LCD_ShowString(155,191,80,24,24,timestr); //显示实时速度值
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
}
解决方案:
移值好的UCOSIII可以直接使用STM32F407的FPU功能,但需要设置两个步骤。
1、在该任务堆栈进行字节对齐
//任务优先级
#define TASK6_TASK_PRIO 8 //LCD显示实时值
//任务堆栈大小
#define TASK6_STK_SIZE 128
//任务控制块
OS_TCB Task6_TaskTCB;
//任务堆栈 字节对齐
__align(8) CPU_STK TASK6_TASK_STK[TASK6_STK_SIZE];
//任务函数
void task6_task(void *p_arg);
2、创建任务的时候在任务选项使用OS_OPT_TASK_SAVE_FP进行浮点数寄存器保存
//创建TASK6任务
OSTaskCreate((OS_TCB * )&Task6_TaskTCB,
(CPU_CHAR * )"task6 task",
(OS_TASK_PTR )task6_task,
(void * )0,
(OS_PRIO )TASK6_TASK_PRIO,
(CPU_STK * )&TASK6_TASK_STK[0],
(CPU_STK_SIZE)TASK6_STK_SIZE/10,
(CPU_STK_SIZE)TASK6_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_SAVE_FP, //任务选项选择OS_OPT_TASK_SAVE_FP
(OS_ERR * )&err);