#define REG32(addr) (*(volatile unsigned long * const)(addr))是什么意思?其中addr是寄存器地址?

时间:2021-06-08 01:29:38
#define REG32(addr)     (*(volatile unsigned long  * const)(addr))是什么意思?其中addr是寄存器地址?

8 个解决方案

#1


int a;
int *pa = &a;
char *p = *((char *)pa);

这个你能理解吗?
跟这个差不多;

#2


将I/O内存资源的物理地址映射成核心虚地址

#3


引用 2 楼 iu_81 的回复:
将I/O内存资源的物理地址映射成核心虚地址


别误倒别人,这哪有映射关系啊,就是读一个寄存器的值而已嘛,当然这个也可以认为是访问外围设备的一个地址

#4



unsigned long a;
a = REG32(addr); // 读addr这个地方的值
REG32(addr) = a; // 往addr这个地方写值

(*(volatile unsigned long * const)(addr))
将addr这个地址转化成一个指针(*),该指针不能改变它的指向(const),该指针会指向一unsigned long,该unsigned long会以“意想不到”的方式被改变,所以请编译器不要做优化(volatile)
最后最前面的那个*解应用,即上面两行code的意思。

#5


1. addr是个内存地址
2. 一般用这个宏定义一个端口, 一般是用来读写控制字的...

#6


转换为指针再取值

#7


引用 6 楼 zzhprogram 的回复:
转换为指针再取值

用个简单的话来说就是取ADDR这个寄存器的值是吧,但是这个寄存器还没有赋值,那么就是取它的默认值是吧?

#8


转化为unsigned long类型的指针然后再取值。

#1


int a;
int *pa = &a;
char *p = *((char *)pa);

这个你能理解吗?
跟这个差不多;

#2


将I/O内存资源的物理地址映射成核心虚地址

#3


引用 2 楼 iu_81 的回复:
将I/O内存资源的物理地址映射成核心虚地址


别误倒别人,这哪有映射关系啊,就是读一个寄存器的值而已嘛,当然这个也可以认为是访问外围设备的一个地址

#4



unsigned long a;
a = REG32(addr); // 读addr这个地方的值
REG32(addr) = a; // 往addr这个地方写值

(*(volatile unsigned long * const)(addr))
将addr这个地址转化成一个指针(*),该指针不能改变它的指向(const),该指针会指向一unsigned long,该unsigned long会以“意想不到”的方式被改变,所以请编译器不要做优化(volatile)
最后最前面的那个*解应用,即上面两行code的意思。

#5


1. addr是个内存地址
2. 一般用这个宏定义一个端口, 一般是用来读写控制字的...

#6


转换为指针再取值

#7


引用 6 楼 zzhprogram 的回复:
转换为指针再取值

用个简单的话来说就是取ADDR这个寄存器的值是吧,但是这个寄存器还没有赋值,那么就是取它的默认值是吧?

#8


转化为unsigned long类型的指针然后再取值。