W twoim IDE będzie dostępna mapa pamięci dostępna poprzez jakiś plik linkera. Będzie zawierał wszystkie adresy w programie. Przeczytaj podręcznik MCU, aby zobaczyć, w których adresach znajduje się ważna pamięć dla twojego celu, a następnie zarezerwuj część tej pamięci dla swojej zmiennej. Musisz przeczytać dokumentację swojej konkretnej platformy programistycznej.
Następnie należy pamiętać, że nie ma większego sensu mapowanie zmiennych pod określonymi adresami, chyba że są to rejestry sprzętowe lub nielotne zmienne rezydujące w pamięci flash lub EEPROM.
Jeśli zawartość takiej lokalizacji pamięci zmieni się podczas wykonywania, ponieważ jest to rejestr, lub ponieważ twój program zawiera algorytm programujący bootloader/NVM zmieniający komórki pamięci NVM, to zmienne muszą być zadeklarowane jako zmienne. W przeciwnym razie kompilator całkowicie złamie kod po optymalizacji.
Poszczególny kompilator najprawdopodobniej ma niestandardowy sposób przydzielania zmiennych pod konkretnymi adresami, na przykład #pragma lub czasami dziwnym, niestandardowym operatorem @
. Jedyny sensowny sposób można przydzielić zmiennej w stałym miejscu w standardowej C, to:
#define MY_REGISTER (*(volatile uint8_t*)0x12345678u)
gdzie 0x12345678 jest adres gdzie 1 bajt, który jest położony. Raz masz makro deklarację takiego, można go używać tak, jakby to była zmienna:
void func (void)
{
MY_REGISTER = 1; // write
int var = MY_REGISTER; // read
}
Najczęściej chcesz tego rodzaju zmiennych do przebywania w globalnej przestrzeni nazw, stąd makro. Ale jeśli z jakiegoś powodu chcą zakres zmiennej zostać zmniejszona, a następnie przejść makro i dostępu do adresu ręcznie wewnątrz kodu:
void func (void)
{
*(volatile uint8_t*)0x12345678u = 1; // write
int var = *(volatile uint8_t*)0x12345678u; // read
}
To wspólne dla systemów wbudowanych mieć rejestrów sprzętowych w określonych adresów. Jednak na normalnym komputerze nie można przewidzieć, gdzie znajdą się zmienne, i podobnie nie można umieszczać zmiennych w określonych lokalizacjach pamięci, ponieważ mapa pamięci programu nie jest naprawiona. Czy jest to system wbudowany lub zwykły komputer? –
Dlaczego adres ma znaczenie? W każdym razie jest to ** wirtualna ** pamięć. – UmNyobe
Witam, muszę wykonać następujące czynności. Wykonaj swoistą platformę testową dla 32-bitowego uC, ale po flashowaniu przez OCD, platforma powinna mieć (działać) na komunikacji UART. I powiedzmy, że mam licznik, który policzy, ile czasu uruchomił program, lub licznik czasu, w którym program działa bezbłędnie, potem mój profesor, co podać jako wejście przez Hyper Terminal adres, w którym znajduje się ten licznik zmiennych, w celu uzyskania jego wartości. Właśnie tego potrzebuję .. wszelkie pomysły: – Laurentiu