最近在工作过程中 使用stm32f4 + ucosiii开发
在使用sqrt的时候 发现总会跑进hardfault
一开始以为是没有使用FPU 导致浮点运算不了 后来单独实验 在不使能FPU 的情况下 浮点也可正常运算
然后发现裸机的话可以正常运行 跑系统就不行
将问题定位到ucos端 寻找资料 是ucosiii 代码问题 现mark一下
UCOSIII版本为V3.03
主要修改3个点,红色为修改内容。
1.stm32f4的启动文件
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0,=0xE000ED88 ;使能FPU CP10 CP11
LDR R1,[R0]
ORR R1,R1,#(0XF << 20)
STR R1,[R0]
DSB
LDR.W R0,=0xE000EF34
LDR R1,[R0]
AND R1,R1,#(0x3FFFFFFF)
STR R1,[R0]
ISB
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
2.修改os_cpu.c
CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,
void *p_arg,
CPU_STK *p_stk_base,
CPU_STK *p_stk_limit,
CPU_STK_SIZE stk_size,
OS_OPT opt)
{
CPU_STK *p_stk;
(void)opt; /* Prevent compiler warning */
p_stk = &p_stk_base[stk_size]; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
//#if (__FPU_PRESENT==1)&&(__FPU_USED==1) /* Registers stacked as if auto-saved on exception */
*(--p_stk) = (CPU_STK)0x00000000u; //No Name Register
*(--p_stk) = (CPU_STK)0x00001000u; //FPSCR
*(--p_stk) = (CPU_STK)0x00000015u; //s15
*(--p_stk) = (CPU_STK)0x00000014u; //s14
*(--p_stk) = (CPU_STK)0x00000013u; //s13
*(--p_stk) = (CPU_STK)0x00000012u; //s12
*(--p_stk) = (CPU_STK)0x00000011u; //s11
*(--p_stk) = (CPU_STK)0x00000010u; //s10
*(--p_stk) = (CPU_STK)0x00000009u; //s9
*(--p_stk) = (CPU_STK)0x00000008u; //s8
*(--p_stk) =