Memory 数组未跨越256字节边界

Memory 数组未跨越256字节边界,memory,assembly,alignment,avr-gcc,Memory,Assembly,Alignment,Avr Gcc,是否可以创建不跨越256字节边界的数组?也就是说,单个数组项的地址仅在低位字节中不同。这比将阵列对齐到256字节的要求要低。我能想到的唯一解决方案是与下一个\u-power\u-of-two(sizeof(array))对齐,但我不确定这样会出现什么差距 它适用于AVR微控制器库,这将在中断处理程序中为我节省一些宝贵的指令。在库使用的大约80字节的总静态内存中,应该具有此属性的阵列有54字节长。我正在寻找一种不会增加内存需求的方法 我使用avr作为gnu汇编程序和avr ld链接器 示例:如果数

是否可以创建不跨越256字节边界的数组?也就是说,单个数组项的地址仅在低位字节中不同。这比将阵列对齐到256字节的要求要低。我能想到的唯一解决方案是与
下一个\u-power\u-of-two(sizeof(array))
对齐,但我不确定这样会出现什么差距

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

我使用avr作为gnu汇编程序和avr ld链接器

示例:如果数组从地址0x00f0开始,则在遍历数组时,较高的字将从0x00更改为0x01


我真的不在乎它是从地址0x0100还是0x0101开始,只要它不跨越边界。

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

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

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

是否需要保持数组地址对齐?既然您已经知道数组是一个数组,那么这将如何减少指令数?我不需要保持数组对齐。请参阅我添加的示例。但是,请注意,保持数组与64字节边界对齐将满足您的要求-您的链接器应该能够对这些分配进行排序,这样您就不会浪费内存。当链接到我的库的其他代码分配更多静态内存时,会发生什么情况?所有这些都转到了.bss,我的小数组在整个节中的任何位置都会被移动,不是吗?您可以做的是将它放在自己的节中,并确保在链接器命令文件的特殊节中对齐。但可能只有在需要调整它以节省内存时才值得。这可能会增加内存占用,因为我认为链接器不够聪明,无法重新排序.bss条目以节省内存