把一个地址强制转换成结构体指针的作用分析
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语言的变量的操作。
希望同仁能发表意见,说明这种强制把一个地址转换成一个结构体类型的指针发生了什么?编译器如何看待这个问题的?
问题的起源是这样的,现在的单片机随着结构的复杂,直接操作寄存器变成了很麻烦的事情,需要一种好的方法来解决。硬件软件化显然是一个好的解决办法。比如对于一个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语言的变量的操作。
希望同仁能发表意见,说明这种强制把一个地址转换成一个结构体类型的指针发生了什么?编译器如何看待这个问题的?
相关文章推荐
- 访问一个绝对地址把一个整型数强制转换 (typecast)为一个指针是合法的
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- C语言中不同类型的结构体的指针间可以强制转换
- 强制转换为结构体指针的例程
- Little-endian的一个好处:在变量指针转换的时候地址保持不变
- 出于数据保护的结构体指针强制转换和字段截断
- C++结构体中关于结构体变量,指针,地址之间的转换
- ucos中OSMemXX分析-----指向指针的的指针--强制转换
- 数组强制转换成结构体指针,结构体内部指针的指向问题
- 数组强制转换成结构体指针
- 指针类型强制转换及地址打印
- char*指针强制转换成一个指向结构体的指针
- 结构体相关的计算(结构体指针加一以及强制类型转换后加一)
- 强制类型(结构体)转换NULL-----C指针的黑科技
- 通过malloc动态申请整形大小的内存,把地址强制转换成整形指针
- 一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换
- 一个函数分析(s3c2410_gpio_setpin),浅析ARM GPIO地址转换
- 数组指针强制转换成结构体指针
- C++强制转换不同声明或类型的函数指针隐患
- 结构体与字节流之间转换的一个小例子