Pytanie : Funkcja pointer korumpować/kompensować gdy

W Ten Sposób I mieć więcej zabawa z mój AT91SAM9261.  I próbować initialize system interrupt treser perioidic interrupt zegar. I prawie kopiować the przykład kod być.   I dostawać dziwaczny różny rezultat gdy I biegać mój kod, od the próbka code.

On the dobry sekwencja w the próbka projekt który przychodzić z IAR EWARM, ono dzwonić:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);
where AT91C_ID_SYS=1 (system interrupt), i ISR_Pit być funkcja z prototype

void ISR_Pit (kawitacyjny)

and przy pamięć lokacja 0x200011B8.  

And I tropić the funkcja wezwanie przez the następujący:

void IRQ_ConfigureIT (niepodpisany int źródło,
niepodpisany int tryb,
pustka (*handler) (pustka))
{
// Obezwładniać the interrupt first
AT91C_BASE_AIC->AIC_IDCR = (1) << źródło;

// Konfigurować tryb i handler
AT91C_BASE_AIC->AIC_SMR [source] = tryb;
AT91C_BASE_AIC->AIC_SVR [source] = (niepodpisany int) treser;

// Jasny interrupt
AT91C_BASE_AIC->AIC_ICCR = (1) << źródło;
}


and na the line

AT91C_BASE_AIC->AIC_SVR [source] = (niepodpisany int) treser;

I widzieć the rejestr AIC_SVR_1 zmiana 0x200011B8, che być wszystkie good.

***

On the zły sekwencja.  Gdy I robić the ten sam wezwanie od mój program (I ciąć i klajstrować the ten sam initialization i ISR rutyna):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);

I weryfikować że AT91C_ID_SYS być wartość (1), i ISR_Pit być funkcja prototype

void ISR_Pit (pustka) przy adres 0x200000A4

And wtedy I tropić ono w the wywoławczy

void IRQ_ConfigureIT2 (niepodpisany int źródło,
niepodpisany int tryb,
pustka (*handler) (pustka))
{
// Obezwładniać the interrupt first
AT91C_BASE_AIC->AIC_IDCR = (1) << źródło;

// Konfigurować tryb i handler
AT91C_BASE_AIC->AIC_SMR [source] = tryb;
AT91C_BASE_AIC->AIC_SVR [source] = (niepodpisany int) treser;

// Jasny interrupt
AT91C_BASE_AIC->AIC_ICCR = (1) << źródło;
}

And I sprawdzać the wartość "treser" i ono być adres 0x200000A5 (!!!), jeden bajt jeden the przechodzić pointer.  I I widzieć the metrykalny zmiana the błędny wartość 0x200000A5, gdy I chcieć ono przy mój ISR_Pit adres 0x20000A4.

***

So mój funkcja pointer dostawać szturchać jeden gdy I dzwonić the funkcja.  W Ten Sposób mój dwa pytanie być:

1)/>1) ty ekspert zrobić pod względem wyrównywać co ten dziwaczny obserwacja?  To móc to?  Mój sterta clobbered?  Więcej pamięć wyrównanie zagadnienie?
2)/>2) móc I the wbity bóg, whom I wyraźnie rozjuszać?

Thanks bardzo mocno dla jakaś thoughts.

Odpowiedź : Funkcja pointer korumpować/kompensować gdy

Zawsze sprawdzać the mapa kartoteka the poprawny odsadzka.
Oddzielnie to, the kod praca?
Także, dlaczego AT91C_BASE_AIC i AIC_SVR definiować? definiować jako niestabilność?
Móc ty the problem wszystkie wszystkie trafny kod, ty bad pointer zyskiwanie twój rejestr?
Inne rozwiązania  
 
programming4us programming4us