【发布时间】:2017-05-24 13:46:15
【问题描述】:
我原以为 8 位 AVR 平台不需要任何对齐。但是,我在an LLVM commit 中发现了以下评论:
以前的数据布局在处理原子时会出现问题。
例如,加载小于 16 位的 16 位值是非法的 对齐方式。
这会更改数据布局,以便所有类型至少对齐 他们自己的宽度。
很遗憾,the original author of this commit isn't sure if that is right either:
自从我最初从 SourceForge 导入旧的 SVN 存储库以来,大部分对齐内容都没有受到影响。我没有处理太多,所以我的知识很差。
最安全的假设是,如果某件事看起来是故意的,那么它可能不是;P
(8 位)AVR 的对齐故事到底是什么?
【问题讨论】:
-
我不知道 LLVM 的 AVR ABI,但 gcc 会在寄存器和堆栈中对函数参数进行一些填充,请参阅 gcc.gnu.org/wiki/avr-gcc#line-124
-
@JimmyB:但该链接不是只讨论 register number 对齐方式,与他在回答中解释的方式相同吗?
-
@JimmyB:具体来说,它说“如果当前参数在内存中传递,则停止该过程:所有后续参数也将在内存中传递。”但是它有没有说过内存中传递的参数是否对齐?
-
注意 AVR 寄存器也被内存映射到寄存器文件中。因此,寄存器编号对齐也可以显示为内存对齐,以防你通过RAM的低32字节内存实现寄存器访问。对于编译器,这可能是一个限制。
标签: avr memory-alignment abi