2012-01-19 11 views
5

Ho un microcontrollore con cui sto lavorando. Quando si esegue il debug è necessario chiamare una funzione da quella codificata nella ROM. Riferimento tecnico mostra come eseguire questa operazione:Puntatore per funzionare nella ROM

# define Device_cal (void(*)(void))0x3D7C80 

e chiamando procedura è simile al seguente:

(*Device_cal)() 

non riesco a capire cosa succede in realtà qui, quindi la mia domanda è: Come funziona?

risposta

3

Le cause #define(*Device_cal)() da espandere in questo immediatamente prima della compilazione:

(*(void(*)(void))0x3D7C80)() 

Il void(*)(void) è una dichiarazione di un puntatore a funzione che prende e restituisce voidvoid tipi. Lo (*()) rappresenta un cast per il token successivo nell'espressione (0x3D7C80). Quindi questo richiede di trattare i dati nella posizione 0x3D7C80 come una funzione. L'ultimo () chiama la funzione senza argomenti.

7

void (*) (void) è un tipo. È un puntatore a una funzione che non accetta parametri e restituisce void.

(void(*)(void)) 0x3D7C80 lancia il numero intero 0x3D7C80 a questo puntatore di funzione.

(*Device_cal)() chiama la funzione.

(Device_cal)() farebbe esattamente lo stesso.

Le parentesi intorno a *Device_cal e Device_cal sono obbligatorie perché altrimenti il ​​cast dell'intero non avrebbe la precedenza più alta.

2

bene, si "definisce" un puntatore alla funzione e lo si chiama. void(*)(void) significa un puntatore alla funzione, che non riceve argomenti e restituisce void. Se lanci 0x3D7C80 per quel tipo e lo chiami, in pratica chiami la funzione che il suo indirizzo è 0x3D7C80.

0

Il simbolo viene incollato nel quale crea un puntatore temporaneo (non denominato) a una funzione in una posizione di memoria fissa e quindi lo chiama tramite dereferenziazione.

2

Questa non è una risposta (che è già stato fatto in modo soddisfacente), ma un consiglio:

Vorrei suggerire il seguente metodo, invece:

typedef void (*tVOID_ROMFUNCTION_VOID)(void) ; 

tVOID_ROMFUNCTION_VOID Device_cal = (tVOID_ROMFUNCTION_VOID)0x3D7C80 ; 

Device_cal() ; 

questo modo è possibile creare un numero qualsiasi di globale puntatori di funzione sull'inizializzazione mentre le chiamate sembrano normali funzioni collegate staticamente. E eviti di confondere i macro pre-processore voodoo allo stesso tempo.

Creando diversi tipi di puntatori di funzione con diverse firme, il compilatore sarà in grado di eseguire anche il controllo del tipo di parametro.

+0

Sono sorpreso che questa risposta non abbia più voti positivi. È molto più pulito delle soluzioni macro. – tomlogic

+0

@tom: Grazie, ma per essere onesti, come ho detto, non è davvero una risposta alla domanda posta, solo un modo migliore di fare ciò che stava chiedendo. – Clifford

Problemi correlati