单片机编程之联合体(union)的妙用
文章轉載自:https://www.eemaker.com/us_union.html
在單片機軟件編程中,結構體和枚舉類型都很常用到,聯合體相對來用的就比較少。那么結構體和聯合體的區別到底在哪里?我們先列舉一個結構體如下:
struct test
{
? ? ?int ?office;
? ? ?char teacher[5];
};
struct test a;
我們再定義一個聯合體,如下:
union test
{
? ? ?int office;
? ? ?char teacher[5];
};
union test b;
假如在該變量都定義在stm8的單片機編程中,那么一個int變量占用4個字節,一個char變量占用一個字節。這樣結構體a占用的就是4+5=9個字節。聯合體b占用的是5個字節。這樣就很清晰的看出來結構體和聯合體的區別到底在哪里。結構體中每一個成員都要占用相應的空間,聯合體總得空間就是看占用最大空間的那個成員。char teacher[5] ?占用5個字節,office占用4個字節。所以最終b結構體就占用5個字節。當然聯合體還有一個特性就是office和teacher[5]的空間是共享的,簡單理解就是操作office就會改變teacher的前四個字節的值。
好了,現在聯合體的概念搞明白了。那么他在單片機軟件里面到底有什么妙用?正如開頭所述,使用聯合體定義變量可以讓你進行位操作。請看下面一段簡單的代碼:
union test
{
? ? ?unsigned char ODR;
? ? ?struct?
? ? ?{
? ? ? ? ? unsigned char bit0:1,
? ? ? ? ? ? ? ? ? ? ? ? bit1:1,
? ? ? ? ? ? ? ? ? ? ? ? bit2:1,
? ? ? ? ? ? ? ? ? ? ? ? bit3:1,
? ? ? ? ? ? ? ? ? ? ? ? bit4:1,
? ? ? ? ? ? ? ? ? ? ? ? bit5:1,
? ? ? ? ? ? ? ? ? ? ? ? bit6:1,
? ? ? ? ? ? ? ? ? ? ? ? bit7:1;
? ? ?};
};
union test c;
可以看到union c 里面有兩個成員一個是char ODR,另一個是包含一個unsigned char型變量的結構體,這里面的unsigned char型變量被分成了8個1bit。這樣這個結構體和ODR就是共用同一個空間。相對整個字節操作就直接操作ODR。例如:c.ODR=0xff; ? ?如果相對某一位操作就可以c.bit0=1;所以假如ODR是個控制io口輸出的寄存器,就可以簡單的使用c.bitx=x(0或者1);這樣來對每一位進行直接賦值。
在有的ram資源少的單片機,能節省ram空間也是很重要的。那么union有時候同樣可以發揮作用。在寫代碼的時候會經常遇到開關型變量(開關型變量也就是只有0或者1),一般在stm8里面就是這么定義的:
uint8_t flag1=0;
uint8_t flag2=0;
uint8_t flag3=0;
…………
?這樣每一個flag都會占用一個字節的ram空間。假如這樣的flag變量很多我們就可以使用union來節省空間。代碼如下:
union uflag
{
? ? ?unsigned char flag;
? ? ?struct?
? ? ?{
? ? ? ? ? unsigned char flag0:1,
? ? ? ? ? ? ? ? ? ? ? ? flag1:1,
? ? ? ? ? ? ? ? ? ? ? ? flag2:1,
? ? ? ? ? ? ? ? ? ? ? ? flag3:1,
? ? ? ? ? ? ? ? ? ? ? ? flag4:1,
? ? ? ? ? ? ? ? ? ? ? ? flag5:1,
? ? ? ? ? ? ? ? ? ? ? ? flag6:1,
? ? ? ? ? ? ? ? ? ? ? ? flag7:1;
? ? ?};
};
union uflag flg;
總結
以上是生活随笔為你收集整理的单片机编程之联合体(union)的妙用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据通讯拆分包算法
- 下一篇: 第一课--EFM32GG11系列--点亮