1. 程式人生 > >微控制器,struct ,union定義標誌,節約RAM

微控制器,struct ,union定義標誌,節約RAM

微控制器的RAM是非常少的,像新唐,STC,合泰等一些國產的51微控制器,RAM 512 byte,1k,2k,非常常見,

有時候我們的串列埠接收一串資料,或AD連續採集,這些資料是不能放到 flash 裡的,沒辦法,只能想法節約一些變數空間了.

標誌位很多時候只有兩種狀態,就像bool型一樣,真/假,這樣的話,我們可以用下面的方式定義,

 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的值也被改變了,這在某些情況下會變得很方便,

Flg1~Flg8都只佔用一個bit位,所以它們的值只能是0或1,這用來做標誌位是足夠了,如果改變了它們的值,相應的,char Flg的值也被改變了,

比如改變了Flg3的值,那麼char Flg的第3位也被改了,這是對應的,因為他們共享同一個位元組的RMA.

也可以這樣定義:

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空間,

對應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這麼長了.