0

我正在使用 CodeWarrior 为MCU v10.6 IDE. 它是来自 NXP 的基于 Eclipse 的 IDE。该项目以 NXP 的 K21 SoC 为目标(确切地说是 a MK21FN1M0M12,它嵌入了 a cortex-m4armv7-m)。CodeWarrior 配置为使用 ARM 工具链。

我遇到了与拇指交互相关的崩溃。此功能由 IDE 启用,无法停用。

由于armv7-m只支持 thumb2,所以一开始使用 thumb-interwork 似乎没有意义。但我可能在这里遗漏了一些东西。所有代码都在拇指指令中正确生成。

通过指针进行间接函数调用时遇到麻烦。功能代码在链接阶段得到一个奇数地址,这没关系(这表明它是拇指代码)。但是,当通过指针调用它时,会生成一条 BLX 指令(我想链接器在这里将原始 BL 更新为 BLX)并且函数指针的值保持不变!由于指针的值是偶数,跳转指示内核切换到 ARM 模式。因此崩溃。

我认为链接器将 BL 升级为 BLX,因为拇指交互功能被激活。在 CodeWarrior for 上MCU v10.6,这是强制的,我无法禁用它。我被告知这是该工具“处理器所必需的”,并且无法单击相关复选框(Properties->C/C++ Build->SettingsARM CPU。处理器设置为"cortex-m4")。

我不明白为什么,因为这是armv7-m. 此外,它似乎给我带来了麻烦。我想我在这里遗漏了一些东西。

您能否帮助我了解发生了什么和/或告诉我是否有办法在 CodeWarrior 上禁用拇指互通?

谢谢和最好的问候,

皮埃尔

4

1 回答 1

1

@Notlikethat 是对的,我的问题有点 XY 问题。

我的问题源于使用 GCC 构建的库,其中 CodeWarrior 配置为使用飞思卡尔的工具链(ARM 工具)。

设置LSB 的函数指针来自这些库之一,并由 CodeWarrior 在链接阶段进行了评估。由于链接器正确地将这些库中的每个函数放在奇数地址,我猜想它应该错过一些信息来检测错误指针实际上是一个函数指针。

长话短说,图书馆被剥夺了,尤其是--strip-unneeded旗帜。我删除了那个标志,链接器做得很好!

于 2016-12-13T16:50:04.583 回答