Kod: Markera allt
typedef union
{
dword DW;
word WO[2];
byte BY[4];
} T_ALL_ACCESS;
Ovanstående är en "typedef", alltså en definition av en "egen sort" variabel, den kallas T_ALL_ACCESS precis som någon kallas char, int osv.
Men den är definierat som en "union" vilket betyder att alla variabler som är definierat ligger på samma adress(er).
om vi låtsas att de alla ligger på adress 20h bara för att ta ett värde:
DW ligger på 20h-23h.
WO[0] ligger på 20h-21h, WO[1] ligger på 22h-23h.
BY[0] ligger på 20h, BY[1] ligger på 21h, BY[2] ligger på 22h, BY[3] ligger på 23h
Ser du ett mönster?
Pulse_Now.BY[0] = CCPR1L;
Pulse_Now.BY[1] = CCPR1H;
Pulse_Now.BY[2] = Overflow;
Ovanstående överför alltså 3 bytes av tidvärdet till DW och
Pulse_Now.BY[3] = 0;
nollställer alltså högsta byten i DW, på den vis har du ett 32-bitars tidvärde skapat av det 16-bitars CCP-värde samt en overflow-räknare men att överföra värden görs på byte-nivå.
Sedan räknas tiden ut vid att räkna bort förra värdet mot nuvarande värde och detta då i 32-bitars storlek,
Difference = Pulse_Now.DW - Pulse_Previous.DW;
Pulse_Previous.DW = Pulse_Now.DW;
Dessa rader är alltså i 32-bitars "matte" vilket kompilern tar hand om, hade man gjort det i ASM hade man varit tvunget att subtrahera ett 4-byte tal från ett annat 4-bytes tal samt att kopiera över 4 bytes, i ASM hade man sannolikt begränsat sig till 3 bytes om det räckte men det är en akademisk fråga, lite kostar det ju att använda C.