8 位 AVR 需要什么对齐方式?

What alignment is needed on 8-bit AVR?

我原以为 8 位 AVR 平台不需要任何对齐。但是,我在 an LLVM commit 中发现了以下评论:

The previous data layout caused issues when dealing with atomics.

For example, it is illegal to load a 16-bit value with less than 16-bits of alignment.

This changes the data layout so that all types are aligned by at least their own width.

不幸的是,the original author of this commit isn't sure if that is right either

Most of the alignment stuff has been untouched since I originally imported the old SVN repository from SourceForge. I haven't dealt with it much and so my knowledge is pretty poor.

Safest to assume that if something looks intentional, it probably isn't ;P

(8 位)AVR 的对齐故事到底是什么?

这条评论对我来说没有任何意义。 AVR 本身并不知道 16 位类型,特别是 atomic 无法访问 16 位类型,无论任何对齐方式如何。

在经典 AVR CPU 上,不需要对齐 16 位数据,因为 16 位内存访问总是计算为对两个寄存器的两次 8 位提取。

有一种 "alignment restriction",但是,当使用某些 AVR 上可用的 movw 指令时,将数据从一个寄存器对移动到另一个寄存器对 - 这里是 寄存器号 个较低的寄存器必须是偶数。不过,这与内存对齐无关,但在构建编译器时可能会产生影响,并且在尝试通过寄存器文件访问寄存器内容作为内存(最低 32 个 RAM 地址)时可能会产生影响,具体取决于编译器的具体实现方式。编译器可能会通过 keepint 选项打开来限制自己,以便能够通过对寄存器文件的内存访问来访问寄存器中的 16 位值,这确实需要字对齐。

第二种"alignment restriction"在尝试写入到程序存储器(闪存)时适用——手册在"SPM instructions, the least significant bit of the address should be cleared"上明确说明了这一点。这是可以理解的,因为 AVR 的闪存是根据最小指令大小进行字寻址的。但是,您可以 读取 使用 LPM 指令字节寻址的程序存储器。由于并非所有 AVR 都支持直接访问 SPM,因此我不知道这是否相关。 SPM 和 "atomic types" 如何相互关联也逃脱了我 - 当写访问程序内存时,无论如何必须通过禁用中断使整个访问成为原子的。无论如何,gcc 都会处理库中的程序内存访问。

除了这些特定情况(寄存器文件、程序内存存储)之外,AVR 绝对没有任何问题可以访问奇数地址上的字值。