微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 位域在linux驱动中的妙用

位域在linux驱动中的妙用

时间:10-02 整理:3721RD 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top