STM32F4 + UCOSIII 关于使能FPU导致HardFault的问题

最近在工作过程中 使用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) =

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值