为什么我们在这样的微控制器编程中寻址寄存器

时间:2016-07-08 23:02:12

标签: c arm embedded microcontroller

为什么当我们为寄存器写地址时,我们会向基地址添加偏移量?

另外我们为什么要写下面这样的语法

#define CGPIO  (*((volatile unsigned long*)0x400FE608));

我的意思是仅指针部分语法

2 个答案:

答案 0 :(得分:6)

(volatile unsigned long*)0x400FE608语法将内存中的硬件特定地址(可能是寄存器)转换为指向volatile unsigned long的指针。指针的类型volatile unsigned long基于寄存器的大小,并且需要将其视为无符号。指针定义为指向volatile,以确保编译器不优化多次读写操作,每次代码需要时执行操作。

前面的星号和整个表达式的括号是这样的,你可以将CGPIO看作是一个可赋值的全局变量,然后写

CGPIO = 123;

unsigned long val = CGPIO;

CGPIO前没有添加星号。

答案 1 :(得分:1)

这是一种技巧或副作用或有意识的语言部分,允许您创建可用于访问(读取或写入)物理地址的指针。通常这种方式用于外设的控制和状态寄存器。如果它是一个记忆库,你当然也可以做同样的事情。

这不是唯一的方法,而且我已经无法生成合适大小的转移,但它的工作方式往往比它没有。在芯片供应商的开源裸机驱动程序中找到它是非常普遍的事情。