我有一个函数:

void testfunction() {
 static char_t theChar1 = 1;
 static unsigned char smallArray[1];
 static unsigned char largeArray[135];
    ...
}

和接头文件:

  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  .bss (NOLOAD) :
  {
    __bss_start = . ;
    __bss_start__ = . ;
    *(.bss)
    *(.bss.*)
    *(COMMON)
    . = ALIGN(4);
  } > ramEXT

  . = ALIGN(4);
  __bss_end__ = . ;
  PROVIDE (__bss_end = .);

我需要静态数组(的.bss数据)到4个字节边界对准,但它似乎阵列拒绝这样做。结构和原始类型对准罚款(见填充线),但阵列全部结束。这是我的映射文件:

 .data.firstTimeFlag.7295
                0xa000098c        0x4 output/file1.o
 .data.theChar1.5869
                0xa0000990        0x1 output/file2.o
 *fill*         0xa0000991        0x3 00
 .data.debounce
                0xa0000994      0x270 output/file3.o

...

 .bss.initialized.5826
                0xa000812c        0x1 output/file2.o
 *fill*         0xa000812d        0x3 00
 .bss.allocator.5825
                0xa0008130       0x34 output/file2.o
 .bss.largeArray.5869
                0xa0008164       0x87 output/file2.o
 .bss.smallArray.5868
                0xa00081eb        0x1 output/file2.o
 .bss.initialized.5897
                0xa00081ec        0x1 output/file2.o
 *fill*         0xa00081ed        0x3 00
 .bss.allocator.5896

任何人都知道如何对齐阵列?

有帮助吗?

解决方案

我不知道,你可以用链接脚本做到这一点,我很困惑的是你的目标;连接到每个汇编声明对准属性推测符合ABI和机的要求。你们是不是要提高缓存命中率是多少?补偿在源代码中的非贴合型双关?

一两件事就可以“容易”做是GNU对准扩展添加到C源。

static unsigned char smallArray[1] __attribute__ ((aligned (4)));

更新:嗯,这产生明显较大的第三方宏库不符合要求的代码? (如果是符合标准的代码,它大概会很好地工作。:-)好吧,这是一个可怕的杂牌,但我几乎可以保证,将“工作”,FSDO“工作”,而不是需要调试宏lib中。 。你可以后处理,编译器的汇编语言输出。局部静态BSS符号不敏感布局,并在单个.comm.lcomm指令,为此,最后一个参数是可能的对准量通常声明。

此参数是什么__attribute__变化。你可以使用某种类型的脚本的构建过程中改变他们... ...

其他提示

在我制作系统,所述接头参数可以被控制来设置每个部分的开始的对准 - 但不是部分内的各个变量的对准。单个变量的取向是由编译器根据变量的类型来确定。

您可能能够使用某种编译器编译,当然特定平台的。

另一种方法是定义阵列的需要的任何类型的对准,如uint32_t的阵列。

我很好奇,想知道你想达到什么样的 - 这听起来好像你正在做的事情有点不寻常和特定于平台的,如果你有这样的对齐要求。最好在所有可能建立的过程独立于平台的代码,如果,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top