GCC ARM Cortex-M3 / M4:由于Vector表中的值错误,SVC指令将CPU从Thumb置于ARM状态

时间:2014-11-17 16:29:28

标签: gcc arm thumb svc

我正在将实时内核TNeoKernel移植到Cortex-Mx处理器,它在使用ARMCC编译时有效,但在使用GCC编译时不起作用:在调用SVC指令后, PC更新为SVC_Handler,在下一个(任意)指令中,UsageFault异常发生。

检查CFSR表明INVSTATE位已设置:即处理器处于ARM状态,这在Cortex-M CPU上是非法的。我已经检查过xPSR:是的,T位被清除。

然后我检查了Vector表:是的,在偏移0x2c我有SVC_Handler的地址,但是LSB被清除:0x8013c40。因此,将CPU置于ARM状态并不奇怪。令人惊讶的是我为什么要清除LSB?

我在使用ARMCC编译时重新检查了SVC_Handler的地址,是的,在那里设置了LSB:SVC_Handler的实际地址是0x0800297a,但是Vector表包含0x0800297b }。

因此,GCC会生成错误的Vector表。

目前我使用的是CooCox IDE和arm-none-eabi-gcc版本4.8.4;给予GCC的选项是:

-mthumb -mcpu=cortex-m4

让GCC知道CPU不支持ARM状态似乎足够了,所以,这是GCC中的一个错误吗?或者,我应该给它一些更多的键,使它生成正确的Vector表吗?

UPD:这是bitbucket上的源文件tn_arch_cortex_m.S。那里有.thumb指令;请注意,此文件适用于GCC和ARMCC,因此有一些宏可以应对这两种工具。

0 个答案:

没有答案