来自access宏的硬件寄存器的地址

时间:2015-06-10 07:43:24

标签: c

我有一个使用通常格式

定义的寄存器列表
#define REG_NAME (*(volatile unsigned int *) 0x1000)

在我的代码中的某个地方,我想使用0x1000switch case中获取REG_NAME
我该如何处理?

我尝试使用switch(&REG_NAME)switch(*REG_NAME)但没有成功,它会抛出编译错误:

  

表达式必须具有整数类型

2 个答案:

答案 0 :(得分:2)

你的宏必须这样定义:

#define REG_NAME (*(volatile unsigned int *) 0x1000)

然后您可以使用REG_NAME来获取存储在寄存器中的值。如果您想将寄存器地址(此处为0x1000值)作为整数(例如,int),则必须使用(int) &REG_NAME。此处需要强制转换,因为&REG_NAME是指针类型。

您如何定义宏是不正确的,因为强制转换操作符需要围绕类型名称的括号。

答案 1 :(得分:1)

这里,REG_NAME是一个解除引用的指针 - 即它是一个包含在寄存器中的值,应该在整个代码中对其进行处理。尝试将相同的定义用于多个目的(值和地址)最多会让人感到困惑!

你最好有以下几点:

#define REG_TYPE(x)      (*(volatile unsigned int*)x)
#define REG_NAME_ADDR    (0x1000)
#define REG_NAME         REG_TYPE(REG_NAME_ADDR)

如果寄存器已在处理器制造商提供的头文件中定义,则您必须创建自己的定义来解决问题。