2010年4月16日 星期五

共用空間(Union) 與 結構子(Structure) 與MSB , LSB

== Union ==
我在學習 Microchip PIC 的程式設計時才開始接觸到, 坦白說,一開始不是很懂實際的應用好處.
經過"首席"的細心講解後,才晃然明白... (原來當年學校教的資料結構還可以用在這裡... 真是"自幼失學讀書少"

在這面的例子裡頭,可以這樣來用.

假設, 我有一個資料為 myResult = 0x40;
如果要拿到Hi byte 與 Lo Byte 時,可以直接用Union 很容易的就能取到要的資料.

((BYTE_ODR_T) myResult)->msb_u16.hi8; //這樣當myResult被轉型成BYTE_ODR_T 型別後,便可以直接取到要取的資料 (這裡是以LSB 的方式呈現)
((BYTE_ODR_T) myResult)->msb_u16.lo8;

typedef union
{
struct
{
unsigned char hi8;
unsigned char lo8;
}msb_u16;

struct
{
unsigned char lo8;
unsigned char hi8;
}lsb_u16;
}BYTE_ODR_T;

我發現透過這樣的方式進行資料的存取會變得很容易.
當然,因為我目前用的是Microchip PIC 的microcontroller 所以是以LSB方式.(Little Endian)
但相信很容易可以發現,如果遇到的環境是MSB方式時,則只需要更動Union裡頭Structure的順序便可完成.
以上述的例子來說,我己經將 msb與lsb的順序都己經定議在這個BYTE_ODR_T 的Union裡頭.
所以未來在使用時,只需要選擇所需要的格式即可.

LSB的資料的存放順序如下:

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

MSB的資料存放順序如下:
Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7




資料的差異?
如果要放進去的資料為 0x74 那麼...
LSB的資料的存放順序如下:
Hi Byte Low Byte
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
0 1 1 1 0 1 0 0
7 4

MSB的資料的存放順序如下:
Low Byte Hi Byte
Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7
0 0 1 0 0 1 1 1
4 7

沒有留言:

張貼留言