ARM学习随笔(2)关于位域的一些事
2014-07-19 18:16
211 查看
在LPC2134.h头文件中经常会看到这种定义:
/* PLL feed register */ typedef struct{ __REG32 FEED : 8; __REG32 :24; } __pllfeed_bits;
我当时不甚理解,一直不理解为啥FEED后面跟了冒号和8.后来想起了C语言中位域,检索了一下才明白。
下面解释一下位域:
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct 位域结构名 { 位域列表 };其中位域列表的形式为: 类型说明符 位域名:位域长度例如:struct bs { int a:8; int b:2; int c:6; };位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:struct bs { int a:8; int b:2; int c:6; }data;说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 }在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:struct k { int a:1 int :2 /*该2位不能使用*/ int b:3 int c:2 };从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。位域的使用:位域的使用和结构 体的使用相同,其一般形式为:位域变量名.位域名 另外,位域的存储顺序与编译器有关,大部分是先申请的放在低位。 如struct bits{ unsigned a:4; unsigned b:6; unsigned c:4; unsigned d:4; unsigned e:14;} data;data.a=1;data.b=19;data.c=1;data.d=2;data.e=0;则 data=高地址 低地址|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|1|0|0|1|1|0|0|0|1|
(unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int)。
回到最开始的地方,PLL feed 寄存器中FEED占8位,其余24位不使用。
相关文章推荐
- 关于ccna的一些学习笔记
- 学习ARM高级应用的一些感想
- 关于Linux中动态库的一些学习
- 关于学习的一些建议
- 关于如何继续深入学习arm+linux(转)
- 自制的日历控件,可以在日历上DIY事情,相关于记一些随笔的文字之类的话题,如“1/28 是新年啊”
- 关于学习DIV CSS的一些精妙问答
- 关于学习与创业——给大学生的一些建议
- 关于ARM的一些概念
- 关于学习Windows和Linux的一些感言.
- 初学Asp.net关于GridView的一些学习记录
- java学习笔记,关于java的一些基础知识,适用于初学者,第一节
- 关于RDLC报表的一些总结,希望对正在学习使用它的朋友有所帮助
- 收集一些关于Visio二次开发经典的文章,共同学习
- 关于Flex的一些学习资料
- 关于学习DWR的一些注意要点
- 关于学习操作系统编程的一些建议
- 关于ARM的一些认识
- 关于编码、开发、分析、设计、项目管理的一些随笔