2011-07-18 17 views
8

Zastanawiam się, czy istnieje dyrektywa kompilatora GCC C, która pozwala mi określić kolejność bitów do pakowania struktury? Coś pokroju:Jak wymusić kolejność bitów struktury za pomocą kompilatora GCC?

#pragma bit_order left 

Uzasadnieniem takiej potrzeby jest, że mam następującą strukturę:

struct { 
     union { 
      unsigned char BYTE; 
      struct { 
       unsigned char B0: 1; 
       unsigned char B1: 1; 
       unsigned char B2: 1; 
       unsigned char B3: 1; 
       unsigned char B4: 4; 
      }BIT; 
     }ITEM; 
} myStruct; 

Przy takiej strukturze, chciałbym kompilator opakować to w ten sposób:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B0 B1 B2 B3 B4 B5 B6 B7 | 

Zamiast jak GCC robi:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B7 B6 B5 B4 B3 B2 B1 B0 | 

Mam do czynienia z MCU, które mają ogromne pliki nagłówkowe, które mają struktury obliczające przesunięcia bitów zgodnie z ustalonymi adresami sprzętowymi. Mam nadzieję, że istnieje kompilator w kompilatorze GCC C, który wykonuje zamiennik bitów dla mnie, zanim spróbuję odwrócić wszystkie pola w pliku dostarczonym przez producenta.

+0

wielkość i kolejność i kompilator rozszerzeniem https://stackoverflow.com/questions/1490092/cc-force-bit-field-order-and-alignment robi 'packed' podzbiór pracy: https://stackoverflow.com/questions/1756811/does-gccs-attribute-packed-retain-the-original-ordering –

Odpowiedz

12

Którą wersję GCC używasz i którą platformę? Pragmy istnieje, że może załatwić sprawę, ale to nie działa na x86 zaczynając GCC 4.

#pragma reverse_bitfields on 

Więcej szczegółów na stronie:

http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/747918655affa5c0?pli=1

Jeśli nie przeszkadza odbudowy GCC wszystkie istotne ustawienia budować tutaj (szukaj bitfield):

http://gcc.gnu.org/onlinedocs/gccint/Storage-Layout.html

Niektóre szczegóły bitfields jest zły:

C/C++: Force Bit Field Order and Alignment

+1

Dzięki alot mate! To było naprawdę pouczające! Oddział, który usunęli GCC, to wersja 4.3.0. Dokumentacja kompilatora GCC C, który mam dla tego docelowego MCU, jest dość skromna i staram się z tego jak najlepiej. Wygląda na to, że jedynym wyjściem jest ponowne zamówienie samych struktur. Jeszcze raz dziękuję za pomoc w przyspieszeniu procesu znalezienia możliwego rozwiązania :) – Vern

+1

+1 za link do zlecenia i link w polu Force Bit –

Powiązane problemy