我正在编写一个带有结构化架构的头文件。我的目标是定义一个在调用另一个宏后会递增的基地址。这样做的目的是保持新基地址的运行计数,并在编译时检查它是否超过最大物理地址。
我之前曾想过使用全局变量来计算地址,但这将在运行时解决,我需要在编译时,在输出任何二进制文件之前这样做,以防止可能的内存损坏。
这就是我的例子:
以下是我希望头文件在检查时也看起来像(或等效的东西):
#define DRAM_DEFINE_PTR 0x30000000
#define DRAM_DATA1_BASE 0x30000100
#define DRAM_DATA1_SIZE 0x050
#define DRAM_DATA2_SIZE 0x400
#define DRAM_DATA3_BASE 0x30000600
#define DRAM_DATA3_SIZE 0x300
#define DRAM_DEFINES(x,y) (...)
// store base 'x' and size 'y' in a structure and increment DRAM_DEFINE_PTR accordingly
1. DRAM_DEFINES (DRAM_DATA1_BASE, DRAM_DATA1_SIZE)
2. DRAM_DEFINES (0x0, DRAM_DATA2_SIZE) //base is previous base + size
3. DRAM_DEFINES (DRAM_DATA3_BASE, DRAM_DATA3_SIZE)
// more DRAM_DEFINES
实际上,下面的代码块会将第 1 行和第 2 行扩展为:
1. DRAM_DEFINES (0x30000100, 0x50)
// DRAM_DEFINE_PTR now equals 0x30000150
2. DRAM_DEFINES (0x30000150, 0x400)
// DRAM_DEFINE_PTR now equals 0x30000550
3. DRAM_DEFINES (0x30000600 , 0x300)
// DRAM_DEFINE_PTR now equals 0x30000900
and so on
然后在文件末尾进行#error 检查以确保我们没有越界
#if (DRAM_DEFINE_PTR > 0x40000000)
#error "\nCAPACITY EXCEEDED by ", DRAM_DEFINE_PTR - 0x40000000, " bytes"
#endif
正如我们从上面看到的,并不是每个内存区域都被完全使用。就像 2 和 3 之间一样,有 50 个字节的缓冲区。所以这意味着基地址可以是
- 使用#define OR 硬编码值
- 从前一个区域的基数偏移 + 前一个区域的大小
这在我使用的编译器(ARMCC RVCT 5.03)中是否可行?
提前致谢