我正在使用 ARM 编译器并有一个硬件外围设备(具有直接内存访问),它需要对传递给它的内存缓冲区进行特定对齐(32 字节对齐)。aligned
当缓冲区是全局/静态的并且可以使用编译器支持的属性来定义时,这不是问题。只要需要在本地传递某个函数中定义的缓冲区,即具有自动存储类,就会出现问题。我试图做类似以下的事情:
typedef struct __attribute__((aligned(32)))
{
char bytes[32];
} aligned_t;
_Static_assert(sizeof(aligned_t)==32, "Bad size");
void foo(void)
{
aligned_t alignedArray[NEEDED_SIZE/sizeof(aligned_t)];
//.... use alignedArray
}
这很高兴地编译并在x86编译器上工作。但不是在armcc,这是抱怨:
警告:#1041-D:自动对象的对齐方式不得大于 8
所以这种方法行不通。还有一个,我认为很丑:
void foo(void)
{
char unalignedBuffer[NEEDED_SIZE + 32 - 1];
char pAlignedBuffer = ALIGN_UP_32(unalignedBuffer);
//.... use pAlignedBuffer
}
虽然ALIGN_UP_32
是一个宏,用于返回其中的第一个对齐地址unalignedBuffer
(我猜这里的实现细节并不重要)。
正如我所说,我不喜欢这种方法,想知道是否有更优雅的方法来实现同样的效果?