8 个解决方案
#1
int a;
int *pa = &a;
char *p = *((char *)pa);
这个你能理解吗?
跟这个差不多;
int *pa = &a;
char *p = *((char *)pa);
这个你能理解吗?
跟这个差不多;
#2
将I/O内存资源的物理地址映射成核心虚地址
#3
别误倒别人,这哪有映射关系啊,就是读一个寄存器的值而已嘛,当然这个也可以认为是访问外围设备的一个地址
#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. 一般用这个宏定义一个端口, 一般是用来读写控制字的...
2. 一般用这个宏定义一个端口, 一般是用来读写控制字的...
#6
转换为指针再取值
#7
用个简单的话来说就是取ADDR这个寄存器的值是吧,但是这个寄存器还没有赋值,那么就是取它的默认值是吧?
#8
转化为unsigned long类型的指针然后再取值。
#1
int a;
int *pa = &a;
char *p = *((char *)pa);
这个你能理解吗?
跟这个差不多;
int *pa = &a;
char *p = *((char *)pa);
这个你能理解吗?
跟这个差不多;
#2
将I/O内存资源的物理地址映射成核心虚地址
#3
别误倒别人,这哪有映射关系啊,就是读一个寄存器的值而已嘛,当然这个也可以认为是访问外围设备的一个地址
#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. 一般用这个宏定义一个端口, 一般是用来读写控制字的...
2. 一般用这个宏定义一个端口, 一般是用来读写控制字的...
#6
转换为指针再取值
#7
用个简单的话来说就是取ADDR这个寄存器的值是吧,但是这个寄存器还没有赋值,那么就是取它的默认值是吧?
#8
转化为unsigned long类型的指针然后再取值。