gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:28:31 25 4
gpt4 key购买 nike

我原以为 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 位类型,特别是不能原子访问 16 位类型,无论任何对齐方式。

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

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

第二种“对齐限制”适用于尝试 时写 到程序存储器 (Flash) - 手册明确指出,在“SPM 指令中,地址的最低有效位应该被清除”。这是可以理解的,因为 AVR 的闪存是根据最小指令大小进行字寻址的。但是,您可以 阅读 使用 LPM 指令进行字节寻址的程序存储器。不过,由于并非所有 AVR 都支持直接访问 SPM,因此我根本不知道这是否相关。 SPM 和“原子类型”如何相互关联也很好地转义 - 当写访问程序存储器时,无论如何都必须通过禁用中断来使整个访问成为原子。无论如何,gcc 处理库中的程序内存访问。

在这种特殊情况(寄存器文件、程序存储器)之外,AVR 在访问奇地址上的字值时绝对没有任何问题。

关于avr - 8 位 AVR 需要什么对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44160271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com