Vraag : Wijzer van de functie bedierf/gecompenseerd wanneer overgegaan tot functie

Zo heb ik meer pret met mijn AT91SAM9261.  Ik probeer om een systeem te initialiseren onderbreek aan opstelling een manager aan perioidic tijdopnemer onderbreekt. Ik vrij veel kopi�ër de voorbeeldcode om dit te doen.   Ik krijg bizarre verschillende resultaten wanneer ik mijn code in werking stel, van de steekproef code.

On de goede opeenvolging in het steekproefproject dat met IAR EWARM kwam, roept het:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);
where AT91C_ID_SYS=1 (het systeem onderbreekt), en ISR_Pit zijn een functie met prototype

void ISR_Pit (nietige)

and bij geheugenplaats 0x200011B8.  

And vind ik de functievraag door het volgende:

void IRQ_ConfigureIT (niet ondertekende int.bron,
niet ondertekende int. wijze,/> leegte
{
// maakt onbruikbaar onderbreekt first
AT91C_BASE_AIC->AIC_IDCR = 1 bron <<;

// vormt wijze en handler
AT91C_BASE_AIC->AIC_SMR [source] = wijze;
AT91C_BASE_AIC->AIC_SVR [source] = (niet ondertekend int.) manager;

// Duidelijke interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 bron <<;
}


and op line

AT91C_BASE_AIC->AIC_SVR [source] = (niet ondertekend int.) manager;

I ziet de registerAIC_SVR_1 verandering in 0x200011B8, die goed en wel.

***

op de slechte opeenvolging is.  Wanneer ik de zelfde vraag van mijn programma (ik heb cut-and-paste de zelfde initialisering en de routines ISR) maak:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);

I verifi�ërt dat AT91C_ID_SYS waarde 1 is, en ISR_Pit is een functie van prototype

void (nietige) ISR_Pit op adres 0x200000A4

And ik het dan in de vraag

void IRQ_ConfigureIT2 vind (niet ondertekende int.bron,
niet ondertekende int. wijze,/> leegte
{
// maakt onbruikbaar onderbreekt first
AT91C_BASE_AIC->AIC_IDCR = 1 bron <<;

// vormt wijze en handler
AT91C_BASE_AIC->AIC_SMR [source] = wijze;
AT91C_BASE_AIC->AIC_SVR [source] = (niet ondertekend int.) manager;

// Duidelijke interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 bron <<;
}

And inspecteer ik de waarde van „manager“ en het is adres 0x200000A5 (!!!), één byte meer dan de overgegaane wijzer.  En ik zie de registerverandering in de onjuiste waarde 0x200000A5, wanneer ik het op mijn adres ISR_Pit van 0x20000A4.

***

So mijn die functiewijzer door men wordt aangestoten werd toen ik de functie riep.  Zo zijn mijn twee vragen:

1) wat u deskundigen in termen van zelfs het oplossen van problemen deze bizarre observatie zou doen?  Wat kon dit verklaren?  Wordt mijn stapel het krijgen in elkaar geslagen?  Meer kwesties van de geheugengroepering?
2) wat ik kan doen de ingebedde goden kalmeren, die ik duidelijk razend heb gemaakt?

hartelijk dank voor om het even welke thoughts.

Antwoord : Wijzer van de functie bedierf/gecompenseerd wanneer overgegaan tot functie

Controleer altijd het kaartdossier om de correcte compensatie te zien.
apart van dat, de codewerken?
Ook, hoe is bepaalde AT91C_BASE_AIC en AIC_SVR? worden zij gedefini�ërd als vluchtige stof?
Kunt hebben u het probleem door al niet relevante code te verwijderen reproduceren, u een slechte wijzer die verhogen uw register uit te sluiten?
Andere oplossingen  
 
programming4us programming4us