GD32F450II移植ucosIII浮点运算错误

[复制链接]
1455|7
 楼主| jiangnenghui 发表于 2022-5-21 20:11 | 显示全部楼层 |阅读模式
本帖最后由 jiangnenghui 于 2022-5-21 20:19 编辑

GD32F450II移植ucosIII时,在.s文件里面增加了
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                                
         IF {FPU} != "SoftVFP"; Enable Floating Point Support at reset for FPU
          LDR.W   R0, =0xE000ED88         ; Load address of CPACR register
          LDR     R1, [R0]                ; Read value at CPACR
          ORR     R1,  R1, #(0xF <<20)    ; Set bits 20-23 to enable CP10 and CP11 coprocessors
                                                ; Write back the modified CPACR value
          STR     R1, [R0]                ; Wait for store to complete
          DSB
                                                ; Disable automatic FP register content
                                                ; Disable lazy context switch
           LDR.W   R0, =0xE000EF34         ; Load address to FPCCR register
           LDR     R1, [R0]
           AND     R1,  R1, #(0x3FFFFFFF)  ; Clear the LSPEN and ASPEN bits
           STR     R1, [R0]
           ISB                             ; Reset pipeline now the FPU is enabled
           ENDIF
                                 
            LDR     R0, =SystemInit
            BLX     R0
            LDR     R0, =__main
            BX      R0
            ENDP
增加这些代码后,使用浮点运算的时候会出现错误:
        TempTestDouble = fabs(rand()* 0.00699123);
        TempTestDoubleMax = fabs(MaxValue);//判断绝对值的时候,MaxVuale为15005106.67759,但是返回值是0
        if(TempTestDoubleMax < TempTestDouble) //
        {
           MaxValue = TempTestDouble;
        }
以上使用fabs时返回值是错误的,然而并不是每次都是错误,为什么会出现这样的问题?如果将.s里面增加的代码去掉,裸机运行时,不会出现浮点运算错误的问题,但是使用ucosIII,浮点运算时马上就会出现HardFault_Handler(__FPU_PRESENT已经定义为1,KEIL5也已经选择Use Single precision);
STM32F429的芯片移植ucosIII的时候都是这样在.s里面添加这段代码,GD32F450做为替代F429的芯片,移植ucosIII的时间需要怎么处理HardFault_Handler问题?
CharryW 发表于 2022-5-23 20:16 | 显示全部楼层
RTOS的代码里port中的文件有m3、m4、m4f版本,开fpu的话需要用m4f版本,不然任务调度会进hardfault,因为开了fpu后栈会不一样。
另外在复位函数里执行浮点,这个时候应该还没开启浮点控制位,浮点开关一般在systeminit函数里
typeof 发表于 2022-6-6 12:48 | 显示全部楼层
变量类型不统一吗
wangdezhi 发表于 2022-6-7 10:43 | 显示全部楼层
报错什么呢?
wilhelmina2 发表于 2022-6-7 13:37 | 显示全部楼层
原因可能是小数点后面数据取舍导致计算结果出现积累性数值偏差造成
skyred 发表于 2022-6-7 21:25 | 显示全部楼层
具体错那了呢
mattlincoln 发表于 2022-6-20 15:59 | 显示全部楼层
个数值已经超过float能够存储的有效数字
deliahouse887 发表于 2022-6-20 16:33 | 显示全部楼层
有逻辑错误吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部