我在嵌入式目標上工作,並想定義內存池。內存地址表示爲void*
。但是,在特定情況下,這些地址會被緩存,我想解壓縮它們以直接獲取「真實」硬件地址。如何將遮罩應用於const 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上使用
gcc
V4.9(與-std=gnu99
和很多-Wxxx
標誌)。 - 摘錄來自
.h
文件,變量是「全局」。
這裏它可能並不重要,你知道你的拱是32位的,但通常你應該使用'uintptr_t'來將指針轉換爲整數。 (因爲你把你的東西移植到64位的那一天,你會後悔:) – 2014-10-02 12:38:39
對,謝謝你的提示! – Coconop 2014-10-02 12:48:03
我不認爲「緩存」意味着你認爲它在這裏。這聽起來好像你在談論虛擬地址*,這不是一個緩存概念。緩存不會更改地址。 – unwind 2014-10-02 13:01:54