單片機,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這麼長了.

相關文章
相關標籤/搜索