单片机,struct ,union定义标志,节约RAM

单片机的RAM是很是少的,像新唐,STC,合泰等一些国产的51单片机,RAM 512 byte,1k,2k,很是常见,spa

有时候咱们的串口接收一串数据,或AD连续采集,这些数据是不能放到 flash 里的,没办法,只能想法节约一些变量空间了.code

标志位不少时候只有两种状态,就像bool型同样,真/假,这样的话,咱们能够用下面的方式定义,blog

 1 typedef union uFLG{
 2     char Flg ;     //定义整形数据           联合体成员
 3     struct FLAG{        //位域定义
 4         u8   Flg1   : 1;
 5         u8   Flg2   : 1;
 6         u8   Flg3   : 1;
 7         u8   Flg4   : 1;
 8         u8   Flg5   : 1;
 9         u8   Flg6   : 1;
10         u8   Flg7   : 1;
11         u8   Flg8   : 1;
12     }tFlg;  
13 }uFlg;
14 
15 uFlg uF1;  //定义联合体变量

定义一个联合体产FLG类型,包含一个char变量和一个结构体,内存

在RAM中,联合体(union)只占用一个字节,编译器

也就是说char Flg和struct FLAG在单片机的内存中,共用一个字节,改变了FLAG的值,Flg的值也被改变了,这在某些状况下会变得很方便,flash

Flg1~Flg8都只占用一个bit位,因此它们的值只能是0或1,这用来作标志位是足够了,若是改变了它们的值,相应的,char Flg的值也被改变了,it

好比改变了Flg3的值,那么char Flg的第3位也被改了,这是对应的,由于他们共享同一个字节的RMA.io

也能够这样定义:编译

1 typedef union uFLG{
2     char Flg ;     //定义整形数据           联合体成员
3     struct FLAG{        //位域定义
4         u8   Flg1   : 1;
5         u8   Flg2   : 2;
6         u8   Flg3   : 5;
7     }tFlg;  
8 }uFlg;
9  uFlg ;  //定于联合体变量

这个时候,Flg1占8个bit中的1个bit,也就是和char Flg中8个bit(一个字节)的第1个bit共享RAM空间,class

对应Flg2占8个bit中的2个bit,也就是和char Flg中8个bit(一个字节)的第2个和第3个bit共享RAM空间,

一样的, 对应Flg3占8个bit中的5个bit,也就是和char Flg中8个bit(一个字节)的第4,5,6,7,8bit共享RAM空间,

改变Flg1,Flg2,Flg3,的值,char Flg的值也会作出相应的改变.

Flg1,Flg2,Flg3这是位域变量名,你能够随意起名,只要不违反编译器的相应规则就能够了.

怎么使用那?

1.先定义一个uFlg(咱们在上文本身定义的联合体)变量

 1 uFlg uF1,; 

2.给变量赋值

若是咱们定义了一个char 变量,应该是这样的:

char p;
p=65;

同理:

 uF1.tFlg.Flg1 =1; 

这样,咱们就给Flg1赋值了,由于他只占用一个bit,因此只能是1或0,

若是想把Flg1,Flg2,Flg3都赋值为0;

1 uF1.tFlg.Flg1 =0;
2 uF1.tFlg.Flg2 =0;
3 uF1.tFlg.Flg3 =0;

uF1.Flg =0;

结果是同样的,由于他们共享同一个字节的RAM空间,这样能够一次性清除全部的标志位.

这样写会有些麻烦,必竟名字太长了.能够用#define

   #define time_2s uF1.tFlg.Flg1   

这样咱们直接用time_2s就能够了,不用再写uF1.tFlg.Flg1这么长了.

相关文章
相关标签/搜索