"); //-->
硬件开发过程中经常需要操作的对象是按bit来存储的,也就是我们经常所说的单片机或者ARM中某一个寄存器的某一位或者某几位是需要操作的对象。但是C语言中最小的存储单元是以char也就是字符型为最小的标准的,也就是1个字节即8个bits。
硬件中的寄存器在C语言中实质就死一个个的结构体,8051中的寄存器通常为1个字节,也就是8个bits,通常称为8位。比如51单片几种的TCON 寄存器如下图所示:其中每一位比如IE1、IE0在内存中实质是以位域的形式存在的具体的形式如下:
D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
struct TCON_BIT{ //位域的基本使用
unsigned char IT0:1;//也就是占用uchar中的第一个bit
unsigend char IE0:1;//也就是占用uchar中的第二个bit
unsigend char IT1:1;
unsigend char IE1:1;
unsigend char TR0:1;
unsigend char TF0:1;
unsigend char TR1:1;
unsigend char TF1:1;//占用uchar的第8个bit
};
union TCON
{
unsigned char all;
struct TCON_BIT;
};
其中struct TCON_BIT就是采用了位域的形式定义的。位域还存在很多其他的限制条件,具体的问题问问gooogle吧。对做个Nios2开发的朋友就会意识到位于操作的优势,能够大大减小内存的使用。很适合硬件操作。
位域的基本定义形式为:
基本类型(int,char...) 位域变量名(IE0,IT0,....) :number
其中基本类型就是C语言中的基本类型。
位域名就是该位的名字,比如IT0等
:number 就是占有的位宽,最小为1,最大为8,其中“:”是一定要有的,这是位域的标示。
位域操作相比传统的#define有较大的优势,比较直接,便于控制。同时TI官方提供的资源中很多都采用位域
定义新的MCU,这也说明了位域操作越来越得到重视。因此作出自己学习的总结。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。