Microsoft
Software
Hardware
Network
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_S
YS, 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 [so
urce] = Modus zusammen;
AT91C_BASE_AIC->AIC_SVR [so
urce] = Zufuhr (nicht unterzeichneter int);
// freies interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << Quelle;
}
and auf dem line
AT91C_BASE_AIC->AIC_SVR [so
urce] = 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_S
YS, 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 [so
urce] = Modus zusammen;
AT91C_BASE_AIC->AIC_SVR [so
urce] = 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
Wort-Presse, die Frage bewirtet
asp.net: Mein Problem ist, benutze ich einen ajax Ergänzung Kalender, um BeginDate u. EndDate Werte einzutragen
Silverlight 4 UI Ereignisse
wie kann ich irgendeine Bildentschließung online ändern und sie zum lokalen PC dann innen sparen??
ZFS Sicherungshilfe Ubuntu 10.0.4 LTS
Form-Frage für Kristallreports
Betreffend INOTES in Lotos 8.5
Mühen, die ZWISCHEN Logik erhalten zu arbeiten
Spannungs-Sensor ermittelte einen Ausfall auf Bediener DELL-PowerEdge 2650
broadcom NIC teaming