【问题标题】:Array not crossing 256 byte boundary数组未跨越 256 字节边界
【发布时间】:2010-10-13 12:05:33
【问题描述】:

是否可以创建一个不跨越 256 字节边界的数组?也就是说,各个数组项的地址仅在低字节上有所不同。这比保持数组对齐到 256 字节的要求更弱。我能想到的唯一解决方案是与next_power_of_two(sizeof(array)) 对齐,但我不确定以这种方式出现的差距。

它是用于 AVR 微控制器的库,这将在中断处理程序中为我节省一些宝贵的指令。在库使用的大约 80 个字节的总静态内存中,应该具有此属性的数组是 54 个字节长.我正在寻找一种不会增加内存需求的方法。

我正在使用 avr-as gnu 汇编器和 avr-ld 链接器。

示例:如果数组从地址 0x00f0 开始,那么在遍历数组时,高位字将从 0x00 变为 0x01。

我并不关心它是从地址 0x0100 还是从 0x0101 开始,只要它不越界。

【问题讨论】:

  • 你需要保持数组的地址对齐吗?既然您已经知道数组是
  • 我不需要保持对齐。请参阅我添加的示例。
  • 请注意,保持数组与 64 字节边界对齐将满足您的要求 - 您的链接器应该能够对这些分配进行排序,以便你不会浪费内存。

标签: memory assembly alignment avr-gcc


【解决方案1】:

您只需要 64 字节对齐即可满足此要求,例如这应该工作:

uint8_t a[54] __attribute__ ((aligned(64)));

【讨论】:

  • 这可能会增加内存占用,因为我认为链接器不够聪明,无法将 .bss 条目重新排序以节省内存
【解决方案2】:

我对 AVR 微控制器一无所知,但一般来说,静态变量通常放在可执行文件的数据部分,而且,由于您的静态内存要求很低,您只需要确保数据部分是 256 字节对齐的。 (默认情况下可能是。在 x86 上,通常是。)检查链接器选项...

【讨论】:

  • 当链接到我的库的其他代码分配更多静态内存时会发生什么?这一切都转到了.bss,我的小数组在整个部分中的任何地方都移动了,不是吗?
  • 你可以做的是把它放在它自己的部分,并确保在链接器命令文件的特殊部分中对齐。但可能只有在您需要调整它以节省内存时才值得。
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2012-06-02
  • 2015-09-09
相关资源
最近更新 更多