【发布时间】:2010-10-19 17:15:20
【问题描述】:
我必须在基于 ARM9 的微控制器中对外围寄存器进行编程。
例如,对于 USART,我将相关的内存地址存储在 enum 中:
enum USART
{
US_BASE = (int) 0xFFFC4000,
US_BRGR = US_BASE + 0x16,
//...
};
然后,我在函数中使用指针来初始化寄存器:
void init_usart (void)
{
vuint* pBRGR = (vuint*) US_BRGR;
*pBRGR = 0x030C;
//...
}
但是我老师说我最好用#defines,比如:
#define US_BASE (0xFFFC4000)
#define US_BRGR (US_BASE + 0x16)
#define pBRGR ((vuint*) US_BRGR)
void init_usart (void)
{
*pBRGR = 0x030C;
}
他说,就像这样,你没有在堆栈中分配指针的开销。
就个人而言,我不太喜欢#defines,也不喜欢其他预处理器指令。
所以问题是,在这种特殊情况下,#defines 真的值得使用而不是 enums 和堆栈分配的指针吗?
相关问题:Want to configure a particular peripheral register in ARM9 based chip
【问题讨论】:
-
如果在非调试版本中编译器生成的代码有任何不同,我会感到惊讶。
-
我讨厌那些只说:“用这个”的老师,所以学生们以后还要自己挖掘原因。通常这些老师自己都不知道答案。
-
如果您将指针定义为静态,它们将不会在堆栈上分配。如果您还声明它们为 const,那么它们甚至可能不会导致在数据区域中分配内存(但这取决于您使用的特定编译器)
-
我想你可能误解了你的导师。枚举很好,没有理由使用指向 int 的指针而不是 int。你可以做
int i = *(int *) some_thing;
标签: c enums arm embedded c-preprocessor