im Embedded-Bereich sollte man sich für den direktn Zugriff mit anderer
Bitbreite entsprechende Routinen bereithalten. Verschiedene Arten sind
möglich, ich gebe mal Beispiele für den 16-Bit-Zugriff (Word).
Entscheide Dich für eine Art, die in Deinem Projekt am sinnvollsten ist
und implementiere sie dann für alle benötigten Breiten als Inline oder
als #define
1 | /* direkter Zugriff auf angegebene Adresse */
|
2 | uint16 word_access1(void *p)
|
3 | {
|
4 | return *((uint16 *)p);
|
5 | }
|
6 | /* mit offs = 0: Byte 0,1; offs=1: Byte 2,3 */
|
7 | uint16 word_access2(void *p, int offs)
|
8 | {
|
9 | return *(((uint16 *)p)+offs);
|
10 | }
|
11 | /* angabe der Variable im Makro, nicht die Adresse! */
|
12 | #define word_access3(a) (*(((uint16 *)&(a)))
|
13 |
|
14 | /* in Deinem Beispiel */
|
15 | uint16_t u_value = 0x1337;
|
16 | uint8_t c_array[5] = {0x13,0x37,0x15,0x16,0x17};
|
17 |
|
18 | if(u_value == word_access1(c_array)) ..
|
19 | if(u_value == word_access1(&c_array[0])) ..
|
20 | if(u_value == word_access2(c_array, 0) ..
|
21 | if(u_value == word_access3(c_array[0]) ..
|
Mit dem Makro kannst Du an der Adresse mit 16 Bit lesen und schreiben!
1 | word_access3(c_array[0]) = 0xdead; /* ueberschreibt c_array[0] und [1] */
|
Wenn Du es nicht willst, caste auf (const uint16 *).