我正在将实时内核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,因此有一些宏可以应对这两种工具。