我在嵌入式目标上工作,并且想要定义内存池。
内存地址表示为void*。但是,在特定情况下,这些地址将被缓存,我想对其进行缓存以直接获取“真实”硬件地址。
我想定义memory_area(只是一个标记)的开始地址:
#define UNCACHE_MASK 0xABCDEF12UL // Value of the mask to apply extern uint32_t memory_area; // Global, defined somewhere else const void * virtual_address = &memory_area; // OK const void * real_address = (void*)(virtual_address | UNCACHE_MASK); // guilty line
不幸的是,GCC不允许我这样做:
error: invalid operands to binary | (have 'const void *' and 'long unsigned int')
无奈之下我尝试了:
const void * real_address = (void*)(((uint32_t)virtual_address) | UNCACHE_MASK); // guilty line
徒然:
error: initializer element is not constant
我真的很想保持const安全性:这是可以实现的吗?
[编辑]
我在Linux上使用gccv4.9(带有-std=gnu99很多-Wxxx标志)。摘录来自.h文件,变量为“全局”。