Fråga : Fungera den fördärvade/offset pekaren, när du passeras för att fungera

Mig så förmiddag som har mer gyckel med min AT91SAM9261.  Pröva förmiddag I att initialisera ett systemmellanjobb för att ställa in en förlagehanterare till en perioidic mellanjobbtidmätare. Nätt förmiddag I kopiera mycket exemplet kodifierar för att göra denna.   Förmiddag som I får bisarra olika resultat, när jag kör mitt, kodifierar, från ta prov code.

On som godan ordnar i ta prov projekterar, som kom med IAR EWARM, det appeller:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);
where AT91C_ID_SYS=1 (systemmellanjobb) och ISR_Pit är en fungera med

and för prototype

void ISR_Pit (annullera), på minnesläge 0x200011B8.  

And jag spårar fungeraappellen till och med efter:

void IRQ_ConfigureIT (den unsigned int-källan, det unsigned int funktionsläget för
,
annullerar (*handler) (annullera)),
{Disable för
// mellanjobbfirst AT91C_BASE_AIC->AIC_IDCR = 1 << källan;

// konfigurerar funktionsläget och handler
AT91C_BASE_AIC->AIC_SMR [source] = funktionsläget;
AT91C_BASE_AIC->AIC_SVR [source] = förlagehanterare (unsigned int); klar interrupt
för

// AT91C_BASE_AIC->AIC_ICCR = 1 << källa;


and för
} på line
AT91C_BASE_AIC->AIC_SVR [source] = förlagehanterare (unsigned int);

I ser ändringen för registret AIC_SVR_1 till 0x200011B8, som är all ***

On för good.

till dåligan ordnar.  När jag gör den samma appellen från mitt program (mig, har klippt och klistrar den samma initialiseringen och ISR-rutiner):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);

I verifierar att AT91C_ID_SYS är värderar 1, och ISR_Pit är en fungera av prototype

void ISR_Pit (annullera) på tilltalar 0x200000A4

And därefter som jag spårar den in i appell
void IRQ_ConfigureIT2 (den unsigned int-källan, det unsigned int funktionsläget för
,
annullerar (*handler) (annullera)),
{Disable för
// mellanjobbfirst AT91C_BASE_AIC->AIC_IDCR = 1 << källan;

// konfigurerar funktionsläget och handler
AT91C_BASE_AIC->AIC_SMR [source] = funktionsläget;
AT91C_BASE_AIC->AIC_SVR [source] = förlagehanterare (unsigned int); klar interrupt
för

// AT91C_BASE_AIC->AIC_ICCR = 1 << källa;

And för
} jag kontrollerar värdera av ”förlagehanteraren”, och den är tilltalar 0x200000A5 (!!!), en byte mer än den passerade pekaren.  Och jag ser registret att ändra till det oriktigt värderar 0x200000A5, när jag önskar att den ska peka på min ISR_Pit tilltalar av min ***

So för 0x20000A4.

fungerar den fångna pekaren knuffade vid en, då jag kallade fungera.  Så min två ifrågasätter är:

1) vad skulle som dig experter gör benämner in av även att felsöka denna bisarra observation?  Vad kunde förklara detta?  Mitt få för bunt besegras totalt?  Mer minnesjustering utfärdar?
2) vad kan mig göra för att blidka de inbäddade gudarna, som jag har klart görat rosenrasande?

Thanks mycket för någon thoughts.
" klar "

Svar : Fungera den fördärvade/offset pekaren, när du passeras för att fungera

Kontrollera alltid kartlägga sparar för att se de korrekta offsetarna.
Ifrån varandra av det, kodifierar arbeten?
Också, hur AT91C_BASE_AIC och AIC_SVR definieras? de definieras som flyktigt ämne?
Kan du reproducera problemet, genom att ta bort allt non relevant, kodifierar, för att utesluta dig att ha en dåligapekare att öka ditt register?
Andra lösningar  
 
programming4us programming4us