基于UCOSiii计算浮点数卡死问题

项目场景:

`通过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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值