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