Nel tuo IDE ci sarà una mappa di memoria disponibile attraverso qualche file linker. Conterrà tutti gli indirizzi nel programma. Leggi il manuale della MCU per vedere a quali indirizzi c'è una memoria valida per il tuo scopo, quindi riservane parte della memoria per la tua variabile. Devi leggere la documentazione della tua piattaforma di sviluppo specifica.
Successivamente, si noti che non ha molto senso mappare le variabili su indirizzi specifici a meno che non si tratti di registri hardware o variabili non volatili residenti in flash o EEPROM.
Se il contenuto di una tale posizione di memoria cambieranno durante l'esecuzione, in quanto si tratta di un registro, o perché il programma contiene un algoritmo di programmazione bootloader/NVM cambiando celle di memoria NVM, quindi le variabili deve essere dichiarata come volatile. Altrimenti il compilatore interromperà completamente il codice dopo l'ottimizzazione.
Il particolare compilatore ha probabilmente un modo non standard per allocare le variabili su indirizzi specifici, ad esempio #pragma o talvolta l'operatore strano, non standard @
. L'unico modo sensato è possibile assegnare una variabile in una posizione fissa nella norma C, è questo:
#define MY_REGISTER (*(volatile uint8_t*)0x12345678u)
dove 0x12345678 è l'indirizzo in cui si trova 1 byte di questo. Una volta che avete una dichiarazione macro come questo, è possibile utilizzarlo come se fosse una variabile:
void func (void)
{
MY_REGISTER = 1; // write
int var = MY_REGISTER; // read
}
Il più delle volte si desidera questo tipo di variabili di risiedere nel namespace globale, da cui il macro. Ma se per qualche motivo si desidera che il campo di applicazione della variabile di ridurre, quindi saltare la macro e accedere manualmente l'indirizzo all'interno del codice:
void func (void)
{
*(volatile uint8_t*)0x12345678u = 1; // write
int var = *(volatile uint8_t*)0x12345678u; // read
}
E 'comune sui sistemi embedded per avere registri hardware a indirizzi specifici. Tuttavia, su un normale PC non è possibile prevedere dove finiranno le variabili e non è possibile posizionare le variabili su posizioni di memoria specifiche in quanto la mappa di memoria di un programma non è fissa. È per un sistema embedded o per un normale PC? –
Perché l'indirizzo è importante? È comunque ** memoria virtuale **. – UmNyobe
Ciao, devo fare quanto segue. Esegui una sorta di piattaforma di prova per un UC a 32 bit, ma dopo aver lampeggiato tramite OCD, la piattaforma dovrebbe avere (eseguito) sulla comunicazione UART. E diciamo che ho un contatore che conta quante volte il programma è stato eseguito, o un contatore che memorizza quante volte il programma viene eseguito senza errori, quindi il mio professore cosa dare come input tramite Hyper Terminal l'indirizzo in cui si trova quel contatore variabile, per ottenere il suo valore Questo è quello che mi serve ... qualsiasi idea: – Laurentiu