Questione : L'indicatore di funzione ha corrotto/sfalsato una volta passato alla funzione

Così sto avendo più divertimento con il mio AT91SAM9261.  Sto provando ad inizializzare un'interruzione del sistema per installare un alimentatore ad un temporizzatore perioidic di interruzione. Praticamente sto copiando il codice di esempio per fare questo.   Sto ottenendo a risultati differenti bizzarri quando faccio funzionare il mio codice, dal campione code.

On la buona sequenza nel progetto che è venuto con IAR EWARM, esso del campione denomino:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); il
where AT91C_ID_SYS=1 (interruzione del sistema) e ISR_Pit è una funzione con il

and del prototype

void ISR_Pit a posizione di memoria 0x200011B8.  

And seguo la chiamata di funzione con quanto segue:

void IRQ_ConfigureIT (fonte senza firma di int, modo senza firma del
int, vuoto del
(*handler) (vuoto))
{Disable del
// il first
di interruzione AT91C_BASE_AIC->AIC_IDCR = 1 << fonte; il

// configura il modo e il handler
AT91C_BASE_AIC->AIC_SMR [source] = il modo;
AT91C_BASE_AIC->AIC_SVR [source] = alimentatore (int senza firma); interrupt
del

// AT91C_BASE_AIC->AIC_ICCR = 1 << fonte;


and del
} sul line

AT91C_BASE_AIC->AIC_SVR [source] = alimentatore (int senza firma); il

I vede il cambiamento del registro AIC_SVR_1 a 0x200011B8, che è tutto il

On del *** di good.

alla sequenza difettosa.  Quando faccio la stessa chiamata dal mio programma (io hanno tagliato ed incollano lo stesso inizio e le procedure di ISR):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit); il

I verifica che AT91C_ID_SYS sia il valore 1 e ISR_Pit è una funzione di prototype

void ISR_Pit (vuoto) all'indirizzo 0x200000A4

And allora che lo seguo nel

void IRQ_ConfigureIT2 (fonte senza firma di int, modo senza firma del
int, vuoto del
(*handler) (vuoto) di chiamata)
{Disable del
// il first
di interruzione AT91C_BASE_AIC->AIC_IDCR = 1 << fonte; il

// configura il modo e il handler
AT91C_BASE_AIC->AIC_SMR [source] = il modo;
AT91C_BASE_AIC->AIC_SVR [source] = alimentatore (int senza firma); interrupt
del

// AT91C_BASE_AIC->AIC_ICCR = 1 << fonte;

And del
} controllo il valore “dell'alimentatore„ ed è indirizzo 0x200000A5 (!!!), un byte più dell'indicatore passato.  E vedo il registro cambiare al valore errato 0x200000A5, quando lo voglio indicare al mio indirizzo di ISR_Pit del

So che del *** di 0x20000A4.

il mio indicatore di funzione ottenuto ha toccato col gomito da uno quando ho denominato la funzione.  Così le mie due domande sono:

1) che che cosa voi esperti farebbe in termini di persino analisi guasti della questa osservazione bizzarra?  Che cosa ha potuto spiegare questo?  Mio ottenere della pila è demolito?  Più edizioni di allineamento di memoria?
2) che che cosa può io fare per calmare i dei incastonati, quale ho reso furioso chiaramente?

Thanks molto per qualsiasi thoughts.
class= del

Risposta : L'indicatore di funzione ha corrotto/sfalsato una volta passato alla funzione

Controllare sempre la lima del programma per vedere i contrappesi corretti.
A parte di quello, fa gli impianti di codice?
Inoltre, come AT91C_BASE_AIC e AIC_SVR è definito? è definito come composto volatile?
Potete riprodurre il problema rimuovendo il codice tutto il non pertinente, per escluderlo avere un indicatore difettoso incrementare il vostro registro?
Altre soluzioni  
 
programming4us programming4us