0

我正在编写一个带有结构化架构的头文件。我的目标是定义一个在调用另一个宏后会递增的基地址。这样做的目的是保持新基地址的运行计数,并在编译时检查它是否超过最大物理地址。

我之前曾想过使用全局变量来计算地址,但这将在运行时解决,我需要在编译时,在输出任何二进制文件之前这样做,以防止可能的内存损坏。

这就是我的例子:

以下是我希望头文件在检查时也看起来像(或等效的东西):

#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)中是否可行?

提前致谢

4

3 回答 3

1

为什么不使用全局变量来存储地址?

于 2014-10-03T00:02:55.467 回答
1

您可以使用 Boost Preprocessor 库的评估槽功能在翻译一个单元的过程中更新宏的值。它定义了几个可以被预处理器代码视为可变全局变量的“槽”,这将允许您在进行过程中添加一个值,而不是使用单个固定表达式永久定义它。它是纯标准兼容的 C(或 C++)。

主要的语法麻烦是你必须给更新操作两行给它自己,因为它是由#define/#include对驱动的。

#define DRAM_PTR_SLOT 2    // any slot
#define DRAM_DEFINE_PTR BOOST_PP_SLOT(DRAM_PTR_SLOT)
#define SET_DRAM_DEFINE_PTR BOOST_PP_ASSIGN_SLOT(DRAM_PTR_SLOT)

#define BOOST_PP_VALUE 0x30000100 + 0x50
#include SET_DRAM_DEFINE_PTR    // DRAM_DEFINE_PTR now evals to 0x30000150

#define BOOST_PP_VALUE DRAM_DEFINE_PTR + 0x50
#include SET_DRAM_DEFINE_PTR    // DRAM_DEFINE_PTR now evals to 0x300001A0

它不是非常优雅-无法将指令打包到另一个宏中,因此您无法将其隐藏在问题中的语法中-但您至少可以在某些特定于域的情况下隐藏 Boost 名称您自己的包装宏。

于 2014-10-11T02:32:41.107 回答
0

这可能无法使用 CPP 来完成,因为它的设计并未考虑到这种情况。我将研究 ARM 汇编器及其宏功能,看看是否可以使用它。

于 2014-10-08T00:09:05.803 回答