【问题标题】:does the Keil cortex-m C compiler always compile functions address 4-byte align?Keil cortex-m C编译器总是编译函数地址4字节对齐吗?
【发布时间】:2018-02-01 22:55:03
【问题描述】:

我正在尝试将一个函数从 FLASH 复制到内存中,如果我使用 word 复制它会更快,但是他 STM 和 LDM 指令要求地址是 4 字节对齐的,所以我想知道一般 comtex-m C 编译器这样因为 Keil/IAR 或 GNU 总是将函数编译为 4 字节对齐?

【问题讨论】:

  • 一般来说是的,但是编译器会按照你告诉它的去做,并且有办法告诉它错误,它无法弄清楚。理想情况下,您想使用 4 字 stm/ldms 并在汇编中自己完成。 8 甚至更好,具体取决于大小,但您必须将它们全部存储在堆栈中,并且循环/复制代码只剩下几个寄存器。所以每个 stm/ldm 4 个字是你在 memcpy 库和其他地方看到的常见平衡。我有/知道一个手臂核心,即使您执行超过 4 个字,它也会将指令分成 4 个字传输以进行写入,但会执行 8 个或更多的读取...
  • 我不相信 arm 调用约定要求函数位于单词边界上,ISR 处理程序除外。有关完整详细信息,请参阅 arm 文档以了解您感兴趣的架构修订版的调用约定。

标签: arm keil iar cortex-m


【解决方案1】:

没有。由于 Cortex-M 处理器使用 16 位 Thumb 指令,子程序的标签将仅 2 字节对齐。

在您的情况下,如果您想强制 4 字节对齐以提高数据传输速度,您可以将函数放在单独的部分中。默认情况下,该部分将是 4 字节对齐的。具体操作方法请参考Placement of code and data with attribute((section("name")))attribute((section("name"))) function attribute

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2015-12-15
    • 2015-01-10
    • 1970-01-01
    • 2017-08-27
    • 2018-04-23
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多