本帖最后由 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问题?
|