【发布时间】:2019-05-01 17:17:00
【问题描述】:
我正在使用 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 内的第一个对齐地址(我猜这里的实现细节并不重要)。
正如我所说,我不喜欢这种方法,并且想知道是否有更优雅的方法来实现同样的效果?
【问题讨论】:
-
动态分配是一种选择吗?
-
@dbush 不是真的。我想我应该提到这一点。
-
你能解释一下为什么首先需要自动存储类(你需要重入)吗?
-
@user694733 我正在尝试为我正在开发的特定 HAL 提供一种限制最少的使用方式。最后(一些)缓冲区将由调用者提供,我正在尝试提出通用约定,这将是透明的(理想情况下)或有据可查的。
-
您可以使用静态缓冲区进行硬件访问,并根据需要复制到/从未对齐的自动缓冲区中复制
标签: c arm memory-alignment armcc