Man*_*ada 5 c embedded gcc arm
我试图在编译时检查8的数组对齐.这是代码:
// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 8) == 0;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:初始化元素在加载时不可计算.但是,当我检查4的数组对齐时,我没有得到错误.代码如下:
// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 4) == 0;
Run Code Online (Sandbox Code Playgroud)
语言:C
工具链:arm-none-eabi-gcc
编译器选项:-mcpu = cortex-m3 -mthumb
为什么会这样?
如果您需要强制执行特定的对齐,则报告这适用于"arm-none-eabi-gcc"工具链:
uint32_t pool[1024] __attribute__((aligned(8)));
静态变量的地址在编译时是未知的,只有稍后由链接器决定。对于编译器可以发出的“符号地址以任意数字为模的地址”,没有合适的重定位作为链接器要修复的初始化值,因此它放弃了。正如 Tom 在评论中所说,它至少可以假设链接器不会违反类型所需的最低对齐方式,因此在这种情况下能够优化表达式。
我认为按原样实现此目的的唯一方法是将其声明为extern bool aligned,然后使用一些链接器脚本黑魔法在链接时使用适当的值定义它。
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |