您的位置:首页 > 其它

把一个地址强制转换成结构体指针的作用分析

2017-03-27 15:38 260 查看
最近,我在做嵌入式编程研究,其中一个重要问题就是把一个地址强制转换成一个结构体指针的意义。

问题的起源是这样的,现在的单片机随着结构的复杂,直接操作寄存器变成了很麻烦的事情,需要一种好的方法来解决。硬件软件化显然是一个好的解决办法。比如对于一个ARM单片机来说,我们可以用一个结构体来描述一个模块,用结构体里的成员来描述模块里的寄存器。

比如模块的物理结构如下:

模块的地址:0x4001000100

模块有8个寄存器,每个寄存器都是32位的。每个寄存器顺序排列,地址数值顺序加1。

0x4001000100

0x4000000101

0x4000000102

0x4000000103

0x4000000104

0x4000000105

0x4000000106

0x4000000107

    模块的地址是固定的。我们设想,如果把这个地址强制转换成一个结构体指针,那么就相当于是把一个结构体指针指向了这里。如果这个结构体内部有8个成员,每个成员的数据类型也是32位的。那么,我们就可以使用这个结构体来表达这个模块。当然,此时我们可以通过这个指针来操作这个结构体内部的成员。这也就相当于是对这个模块内部的寄存器进行操作。

struct{
uint32 a;

uint32 b;

uint32 c;

uint32 d;

uint32 e;

uint32
f;

uint32 g;

uint32 h;

}GPIOx,*Pa;

我们这样做:

#define GPIOA     ((Pa*)0x4001000100))

这个表达式的意思是:把这个地址转换成一个Pa*结构体类型的指针,并用GPIOA 来代表这个指针。

此时我们如果通过指针来操作这个结构体的成员,比如:

GPIOA->d=0x0F;

这个对结构体成员的操作实际上就相当于在操作0x4000000103这个寄存器。

一个对于硬件的操作转化成为了对于一个C语言的变量的操作。

希望同仁能发表意见,说明这种强制把一个地址转换成一个结构体类型的指针发生了什么?编译器如何看待这个问题的?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐