为什么当我们为寄存器写地址时,我们会向基地址添加偏移量?
另外我们为什么要写下面这样的语法
#define CGPIO (*((volatile unsigned long*)0x400FE608));
我的意思是仅指针部分语法
答案 0 :(得分:6)
(volatile unsigned long*)0x400FE608
语法将内存中的硬件特定地址(可能是寄存器)转换为指向volatile unsigned long
的指针。指针的类型volatile unsigned long
基于寄存器的大小,并且需要将其视为无符号。指针定义为指向volatile
,以确保编译器不优化多次读写操作,每次代码需要时执行操作。
前面的星号和整个表达式的括号是这样的,你可以将CGPIO
看作是一个可赋值的全局变量,然后写
CGPIO = 123;
和
unsigned long val = CGPIO;
在CGPIO
前没有添加星号。
答案 1 :(得分:1)
这是一种技巧或副作用或有意识的语言部分,允许您创建可用于访问(读取或写入)物理地址的指针。通常这种方式用于外设的控制和状态寄存器。如果它是一个记忆库,你当然也可以做同样的事情。
这不是唯一的方法,而且我已经无法生成合适大小的转移,但它的工作方式往往比它没有。在芯片供应商的开源裸机驱动程序中找到它是非常普遍的事情。