查看: 2345|回复: 0

位域在linux驱动中的妙用

[复制链接]
发表于 2017-5-17 11:43:34 | 显示全部楼层 |阅读模式

c语言里规定的位域的方式进行比特位操作,可以对某一位进行操作;一般情况下,比如普通的存储数据的区域,位域没有任何意义。通常,位域可以用来进行对一些要进行比特位操作的场合,比如标志寄存器的标志位清零,或者配置寄存器功能设置等。
我们在单片机裸机调试的时候,常常是用这样一种方式进行置位设置:
DDRA|=0X01<<10|0X3<<8|0X2<<6|............;
这种方式虽然没有问题,但容易写错,而且每次设置的时候都会写很多,不方便,由于考虑到当移位操作时要对地位数据进行冲刷。
所以现在我们换种方式,这就是位域的妙用。
struct MYSTRUCT
{
int menber0 :width;
int menber1 :width;
int menber2 :width;
int menber3 :width;
int menber4 :width;
int menber5 :width;
int menber6 :width;
int menber7 :width;
}name1;
当你要对一类这样的寄存器位单独操作的时候,把寄存器变量的地址映射为这样的一个结构体,例如
#define           REGISTER0        (*(volatile struct MYSTRUCT *) 0x48000000)
这样就把寄存器实地址映射为一个MYSTRUCT的结构体。
调用某一比特位,以这样的格式例如,把第一比特位置高:
REGISTER0->menber0=1;
不能用REGISTER0.menber0=1,这种格式是错的。
同样,在Linux内核以及驱动源代码里也可以这样用,比较巧妙。

技术交流可以加黄工QQ2685896890
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表