位域在linux驱动中的妙用

2017年05月17日 11:43    发布者:huangmeifang

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