Frage : Funktionszeiger verdarb,/versetzte, als überschritten zur Funktion

So habe ich mehr Spaß mit meinem AT91SAM9261.  Ich versuche, eine Systemsunterbrechung zu initialisieren, um eine Zufuhr zu einem perioidic Unterbrechungstimer zu gründen. Ich kopiere ziemlich genau den Beispielcode, um dies zu tun.   Ich erhalte seltsamen verschiedenen Resultaten, wenn ich meinen Code laufen lasse, von der Probe code.

On die gute Reihenfolge im Beispielprojekt, das mit IAR EWARM kam, es benenne:

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);
where AT91C_ID_SYS=1 (Systemsunterbrechung) und ISR_Pit ist eine Funktion mit prototype

void ISR_Pit (leerem)

and an der Speicherstelle 0x200011B8.  

And vollziehe ich den Funktionsanruf durch das folgende nach:

void IRQ_ConfigureIT (nicht unterzeichnete int-Quelle,
nicht unterzeichneter int Modus,
Lücke (*handler) (Lücke))
{
// Sperrung das Unterbrechung first
AT91C_BASE_AIC->AIC_IDCR = 1 << Quelle;

// bauen Modus und handler
AT91C_BASE_AIC->AIC_SMR [source] = Modus zusammen;
AT91C_BASE_AIC->AIC_SVR [source] = Zufuhr (nicht unterzeichneter int);

// freies interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << Quelle;
}


and auf dem line

AT91C_BASE_AIC->AIC_SVR [source] = Zufuhr (nicht unterzeichneter int);

I sehen die Änderung des Registers AIC_SVR_1 an 0x200011B8, das alles good.

***

On zur schlechten Reihenfolge ist.  Wenn ich den gleichen Anruf von meinem Programm bilde (ich, Schneiden und haben die gleiche Initialisierung und ISR Programme):

IRQ_ConfigureIT (AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, ISR_Pit);

I überprüfen, dass AT91C_ID_SYS Wert 1 ist, und ISR_Pit ist eine Funktion von prototype

void ISR_Pit (Lücke) an der Adresse 0x200000A4

And, dann, das ich sie in das Anruf

void IRQ_ConfigureIT2 nachvollziehe (nicht unterzeichnete int-Quelle,
nicht unterzeichneter int Modus,
Lücke (*handler) (Lücke))
{
// Sperrung das Unterbrechung first
AT91C_BASE_AIC->AIC_IDCR = 1 << Quelle;

// bauen Modus und handler
AT91C_BASE_AIC->AIC_SMR [source] = Modus zusammen;
AT91C_BASE_AIC->AIC_SVR [source] = Zufuhr (nicht unterzeichneter int);

// freies interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << Quelle;
}

And kontrolliere ich den Wert „der Zufuhr“ und es ist Adresse 0x200000A5 (!!!), ein Byte mehr als der geführte Zeiger.  Und ich sehe das Register, zum falschen Wert 0x200000A5 zu ändern, wenn ich ihn auf meine ISR_Pit Adresse von 0x20000A4.

***

So zeigen wünsche meinen erhaltenen Funktionszeiger durch einen schubste, als ich die Funktion benannte.  So sind meine zwei Fragen:

1), das was Sie Experten in diese seltsame Beobachtung ausgedrückt sogar überprüfen tun würde?  Was konnte dieses erklären?  Wird mein Stapelerhalten verprügelt?  Mehr Gedächtnisausrichtungsausgaben?
2), das was ich tun kann, um die eingebetteten Götter zu beschwichtigen, die ich offenbar wütend gemacht habe?

Thanks sehr viel für irgendein thoughts.

Antwort : Funktionszeiger verdarb,/versetzte, als überschritten zur Funktion

Die Diagrammakte immer überprüfen, um den korrekten Versatz zu sehen.
Auseinander von dem, tut die Codearbeiten?
Auch, wie definiert AT91C_BASE_AIC und AIC_SVR? definiert es als flüchtiger Stoff?
Können Sie das Problem reproduzieren, indem Sie ganz nicht passenden Code entfernen, um Sie auszuschließen, einen schlechten Zeiger zu haben, Ihr Register zu erhöhen?
Weitere Lösungen  
 
programming4us programming4us