搜索
bottom↓
回复: 8

请求对于ARM配置文件以及C语言的理解 _REG32 NUMBER : 5

[复制链接]

出0入0汤圆

发表于 2011-2-14 15:28:06 | 显示全部楼层 |阅读模式
在<LPC2102.h>里的一小段代码的理解
/* VIC Vector Control Registers */

typedef struct{

__REG32 NUMBER   : 5;
__REG32 ENABLED  : 1;
__REG32          :26;

} __vicvectcntl_bits;

///////////////////////////
编程的时候,有人写
VICVectCntl0_bit.NUMBER = 14;
VICVectCntl0_bit.ENABLED = 1;
可以肯定这样的写法是正确的
////////////////////////////

我就想问问 配置文件中的 _REG32 NUMBER : 5 后面的‘5’是什么意思?
_REG32 ENABLED : 1; 后面的‘1’又是什么意思?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-2-14 15:37:31 | 显示全部楼层
定义一个可以位操作的变量,该变量共有32位(4个字节),其中number占其中5位;enabled占1位;余下26位未定义。

出0入0汤圆

 楼主| 发表于 2011-2-14 15:45:02 | 显示全部楼层
回复【1楼】mydows  
-----------------------------------------------------------------------

我可以这么理解么?
如果是
__REG32 NUMBER   : 5;
__REG32 ENABLED  : 1;
那么就为 NUMBER 占 第0~4位 , ENABLED 占第5位

如果是
__REG32 ENABLED  : 1;
__REG32 NUMBER   : 5;
那么就为 NUMBER 占 第1~5位 ENABLED 占 第0位
/////////////////////////////////////////////////
是这么理解的么?

出0入0汤圆

发表于 2011-2-14 16:02:28 | 显示全部楼层
我想是,你可以搜索“结构体 位域”就会看到详细介绍。
首先摘一段《C语言编程宝典》上关于位结构体的说明:

/*************以下文字摘自《C语言编程宝典》********************/

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
    位结构定义的一般形式为:
     struct位结构名{
          数据类型 变量名: 整型常数;
          数据类型 变量名: 整型常数;
     } 位结构变量;
    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
    变量名是选择项, 可以不命名, 这样规定是为了排列需要。
    例如: 下面定义了一个位结构。
     struct{
          unsigned incon: 8;  /*incon占用低字节的0~7共8位*/
          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
          unsigned blink: 1;  /*blink占用高字节的第7位*/
     }ch;
    位结构成员的访问与结构成员的访问相同。
    例如: 访问上例位结构中的bgcolor成员可写成:
      ch.bgcolor

    注意:
    1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字
节。
    4. 位结构成员可以与其它结构成员一起使用。
    例如:
     struct info{
          char name[8];
          int age;
          struct addr address;
          float pay;
          unsigned state: 1;
          unsigned pay: 1;
          }workers;'
    上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

/******************************************************/

补充说明一点,如果要定义超过两个字节的位结构体,需要注意,按字节填充!!!即:

比如定义一个4字节的位结构体,应该这样定义:

struct bitstruct {

          unsigned a: 8;

          unsigned b: 1;

          unsigned c: 2;

          unsigned d: 5:

          signed int e:16;

}data;

而不要这样定义:

struct bitstruct {

          unsigned a: 8;

          unsigned b: 1;

          unsigned c: 2;

          signed int e:16;

          unsigned d: 5:

}data;

因为C语言在填充的时候,最小的填充方式是按字节填充的,所以要以字节为单位。

出0入0汤圆

发表于 2011-2-14 16:04:43 | 显示全部楼层
还要知道不同的编译器对齐方式是不同的。参考http://topic.csdn.net/u/20081007/10/edd1f99f-b948-4734-8c7c-ceca263b3294.html

出0入0汤圆

 楼主| 发表于 2011-2-14 16:08:41 | 显示全部楼层
回复【5楼】mydows  
-----------------------------------------------------------------------

哈哈,谢谢你啊。我实在谢ARM程序时遇到的这个问题。采用的时最小端对齐方式

出0入0汤圆

发表于 2011-2-14 16:17:34 | 显示全部楼层
不谢,就知道这点,还是现学现卖!比我强啊,我还不会用arm呢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表