【问题标题】:Declare an array so that the address is aligned on 16 byte boundaries声明一个数组,使地址在 16 字节边界上对齐
【发布时间】:2020-04-07 14:17:24
【问题描述】:

我有一个 uint8 数组,我需要将此数组的指针传递给 DMA,它一次传输 16 个字节。因此,要求是数组地址是 16 字节对齐的,例如 32'hxxxxxx00 - 最后两个地址编号为 0。 我声明一个全局数组如下:

u8 R00_PRO_ADDR[0x64000]    __attribute__ ((aligned(16)));// 16 bytes address aligned

但是,在运行时,我看到数组的地址是 32'hxxxxxxx0。我也尝试过 (aligned(128)) 但得到相同的结果。

这是 Vivado SDK Cortex A53 特有的

【问题讨论】:

  • 如果你使用alignas(16) u8 R00_PRO_ADDR[0x64000];会发生什么?

标签: c++ sdk vivado cortex-a


【解决方案1】:

声明一个数组,使地址在 16 字节边界上对齐

您可以使用标准关键字alignas。无需使用语言扩展:

alignas(16) u8 R00_PRO_ADDR[0x64000];

因此,要求数组地址是 16 字节对齐的,例如 32'hxxxxxx00 - 最后两个地址编号为 0。

您的要求参差不齐。如果你需要这个,那么地址需要在 256 字节的边界上对齐:

alignas(256) u8 R00_PRO_ADDR[0x64000];

请注意,语言实现可能不一定支持任意严格的对齐方式。如果没有,它应该告诉你。

【讨论】:

  • Ups,那是我的错。不敢相信我算错了,所以我做的一切都是正确的,而且奏效了。
  • 您建议的语法给出了错误“预期的声明说明符或数字常量之前的'...'”。我的问题中的原始语法可以正常工作。
  • @Nazar 您可能正在使用古老版本的 C++ 语言。 alignas 是在 C++11 中引入的。如果是这样,请继续使用语言扩展。
  • @eerorika 或者他只是缺少一些类似-std=c++11 的标志(不知道 vivado 提供的编译器,但它可能基于 gcc 或 clang,我怀疑它不支持 c++至少语言级别为 11,因为 A53 架构比编译器中的 C++11 支持更新)。
  • @DanM。好吧,如果他们缺少 -std=c++11 并且他们的编译器默认使用较旧的标准,那么他们使用的是古老版本的 C++ 语言。即使他们的编译器没有那么古老。
猜你喜欢
  • 2016-12-19
  • 2023-03-25
  • 1970-01-01
  • 2016-08-24
  • 2017-06-25
  • 2014-05-27
  • 2012-03-05
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多