;CPACR is lacated at address 0xE000Ed88 LDR.W R0,=0xE000Ed88 ;Read CPACR LDR R1,[R0] ;Set bits 20-23 to enable CP10 and CP11 coprocessors ORR R1,R1,#(0xF << 20) ;Write back the modified value to the CPACR STR R1,[R0] ;wait for store to complete DSB ;reset pipeline now the FPU is enabled ISB
---------------------------------
找到了一点线索。
M4的FPU单元是一个独立于CPU的浮点运算单元,FPU单元的功能
在大多数厂家的芯片中都是可以被使能和关闭的。
;CPACR is lacated at address 0xE000Ed88
LDR.W R0,=0xE000Ed88
;Read CPACR
LDR R1,[R0]
;Set bits 20-23 to enable CP10 and CP11 coprocessors
ORR R1,R1,#(0xF << 20)
;Write back the modified value to the CPACR
STR R1,[R0] ;wait for store to complete
DSB
;reset pipeline now the FPU is enabled
ISB
但是在RTOS环境里,确实只要一有涉及到FPU的情况,就会发
生HardFault异常,把设计到浮点运算的地方屏蔽掉就不会出现
这个异常,看来还有其他的原因。
当你使用了浮点函数时,Cortex-M4处理器在进入异常时
会自动把浮点运算相关的状态压入堆栈。Cortex-M4处理器
在进入异常时,自动压栈的格式有两种,一种是不带浮点寄存器
状态的格式,一种是带浮点状态的格式,而且这些寄存器压栈都是
CPU进入异常时自动完成的,不是人为能够干预的。所以在RTOS环境
里面,在进入CPU异常时经常发生线程切换,A线程执行时,发生异常,
进入异常处理,是以带浮点寄存器的格式压栈的,在异常处理的过程中,
发生了线程切换,切换到B线程的堆栈,但是B线程的堆栈是不带浮点
寄存器的格式压栈的,在异常处理退出时,用B线程的堆栈来出栈就会
发生出栈错误,产生HardFault异常。
一周热门 更多>