Czytam trochę kodu C i natknąłem się na tę deklarację w programie:
unsigned char serv_ctr @0x0002;
Czy ktoś może skierować mnie do dokumentacji lub wyjaśnić, po co jest „@ 0x0002” w kompilatorze Mplab XC8 v1.35 C?
Czytam trochę kodu C i natknąłem się na tę deklarację w programie:
unsigned char serv_ctr @0x0002;
Czy ktoś może skierować mnie do dokumentacji lub wyjaśnić, po co jest „@ 0x0002” w kompilatorze Mplab XC8 v1.35 C?
Odpowiedzi:
Ma to na celu podanie adresu bezwzględnego, na który należy umieścić zmienną.
Ze strony podręcznika kompilatora XC8 strona 27, rozdział 2.5.2 Adresowanie bezwzględne :
Zmienne i funkcje można umieszczać pod adresem bezwzględnym za pomocą
__at()
konstrukcji
......
2.5.2.2 RÓŻNICE
8-bitowe kompilatory wykorzystały symbol @ do określenia adresu bezwzględnego
@
jest powszechnym niestandardowym rozszerzeniem języka C, który pozwala zadeklarować zmienną pod określonym adresem. Może być używany do rejestrów sprzętowych odwzorowanych w pamięci itp. W takim przypadku zmienną należy również zadeklarować volatile
, aby twój przykład był niepoprawny.
Inne kompilatory używają czegoś podobnego __attribute__(section...
lub #pragma ...
niestandardowego C.
Jedynym racjonalnym powodem (jeśli w ogóle), dlaczego łańcuchy narzędzi to robią, jest umożliwienie debugowania rejestru na kiepskich debuggerach. Niestandardowa składnia zapewni, że rejestr stanie się częścią danych wyjściowych linkera i informacji o debugowaniu. Co z kolei pozwala oglądać rejestr w gównianym debuggerze, podobnie jak dowolną inną zmienną.
Jeśli masz dobry debugger, będzie on miał wsparcie i świadomość twojego MCU. Wtedy nie potrzebujesz niestandardowych bzdur w kodzie C, ale możesz zamiast tego napisać czysty, przenośny standardowy C:
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
platform docelowych z wieloma notacjami pamięci lub innymi problemami, aby większość rzeczy zadeklarowanych za pomocą @
notacji zachowywała się inaczej niż wszystko, co można by zrobić bez rozszerzeń.
Krótkie rozszerzenie:
To nie działa już od wersji Xc8 2.0 i nowszych. Teraz musiałeś napisać:
unsigned char serv_ctr __at(0x0002);
umieścić zmienną ( serv_ctr
) pod adresem bezwzględnym ( 0x0002
).
W XC8 2.0 możliwe jest skompilowanie starego kodu przy użyciu @
składni, jeśli ustawienia kompilatora zostaną ustawione na format „C90”. Ustawienie wygląda tak, znajduje się w „XC8 Global Options” i nazywa się „C standard”.
@
Jednak wiele innych kompilatorów systemów wbudowanych obsługuje również składnię, nie tylko Mplab.