2

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

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

然后我检查了向量表:是的,在偏移处0x2c我有我的地址SVC_Handler,但是 LSB 被清除了:0x8013c40。因此,CPU 进入 ARM 状态也就不足为奇了。令人惊讶的是为什么我清除了 LSB?

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

因此,GCC 生成了错误的向量表。

目前我使用 CooCox IDE 和arm-none-eabi-gcc4.8.4 版本;提供给 GCC 的选项是:

-mthumb -mcpu=cortex-m4

让 GCC 知道 CPU 不支持 ARM 状态似乎已经足够了,那么,这是 GCC 中的错误吗?或者,我应该给它更多的键,让它生成正确的向量表吗?

UPD:这是 bitbucket 上的源文件tn_arch_cortex_m.S。我在.thumb那里有指示;请注意,此文件旨在与 GCC 和 ARMCC 一起使用,因此有一些宏可以同时处理这两种工具。

4

0 回答 0