STM32F439的浮点运算功能

2019-07-21 04:48发布

我最近在用STM32F439这款芯片的时候,发现只要是用到了浮点运算的话,
就会出现HardFault异常,有哪位老兄碰到过这种情况吗。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
xiaoyan
1楼-- · 2019-07-21 05:52
 精彩回答 2  元偷偷看……
fzhYou
2楼-- · 2019-07-21 10:32
回复【2楼】xiaoyan:
---------------------------------
找到了一点线索。
M4的FPU单元是一个独立于CPU的浮点运算单元,FPU单元的功能
在大多数厂家的芯片中都是可以被使能和关闭的。
fzhYou
3楼-- · 2019-07-21 14:03
使能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
fzhYou
4楼-- · 2019-07-21 16:53
我自己又试了一下,在没有RTOS的环境里,FPU功能没有问题,
但是在RTOS环境里,确实只要一有涉及到FPU的情况,就会发
生HardFault异常,把设计到浮点运算的地方屏蔽掉就不会出现
这个异常,看来还有其他的原因。
fzhYou
5楼-- · 2019-07-21 21:45
这个问题的原因已经找到了,M4的用户指南里面说了,
当你使用了浮点函数时,Cortex-M4处理器在进入异常时
会自动把浮点运算相关的状态压入堆栈。Cortex-M4处理器
在进入异常时,自动压栈的格式有两种,一种是不带浮点寄存器
状态的格式,一种是带浮点状态的格式,而且这些寄存器压栈都是
CPU进入异常时自动完成的,不是人为能够干预的。所以在RTOS环境
里面,在进入CPU异常时经常发生线程切换,A线程执行时,发生异常,
进入异常处理,是以带浮点寄存器的格式压栈的,在异常处理的过程中,
发生了线程切换,切换到B线程的堆栈,但是B线程的堆栈是不带浮点
寄存器的格式压栈的,在异常处理退出时,用B线程的堆栈来出栈就会
发生出栈错误,产生HardFault异常。
正点原子
6楼-- · 2019-07-22 00:03
 精彩回答 2  元偷偷看……

一周热门 更多>