Guten Morgen!
Ich stehe derzeit vor einem mir unlösbaren Problem.
Ich verwende in meiner Firma IAR Embedded Workbench EWARM v4.40A. Ich
habe einen Bootloader geschrieben, der den ersten Sektor des
AT91SAM7S256 belegt.
Nun will ich eine Applikation kompilieren, die folglich erst mit
0x104000 beginnen darf.
Hierzu habe ich das .xcl Linkerscript angepasst (siehe Anhang).
Sehe ich mir die resultierende HEX Datei an, beginnt die Applikation wie
erwartet bei 0x104000.
Flashe ich die Applikation über meinen Bootloader in den Controller
funktioniert alles einwandfrei.
Nun habe ich versucht das Flash zu löschen und die Applikation
(Startadresse = 0x104000) mittels meines Debuggers zu flashen und nicht
über den Bootloader. Von Adresse 0x000000 bis 0x103FFF steht nun also
0xFF und ab 0x104000 eben die Applikation.
Seltsamerweise startet der Controller korrekt, gibt mir noch ein paar
serielle Ausgaben zurück, aber dann scheint er zu stehen.
Zu stehen deswegen, weil er auf einen FIQ wartet.
Nun meine Fragen...
1.) Warum geht das nicht? Springt er bei einem Fast Interrupt auf eine
Adresse die es gar nicht gibt (im Bereich 0x000000 bis 0x103FFF)?
Funktionierts deswegen mit dem Bootloader, weil in diesem Adressbereich
INTVEC für den Bootloader definiert ist?
2.) Reicht es nur das Linkersript anzupassen, oder muss auch eine andere
Datei angepasst werden? Nochmals der Hinweis: Verwende IAR EWARM v4.40A.
3.) Kann meine Vermutung stimmen, dass dieses Problem nur beim FIQ
auftritt? Alle anderen Interrupts scheinen zu funktionieren.
Wie folgt wird der FIQ in meiner Applikation konfiguriert.
1 | void interrupt_init ( void )
|
2 | {
|
3 |
|
4 | AT91PS_AIC pAic;
|
5 | pAic = AT91C_BASE_AIC;
|
6 |
|
7 | AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
|
8 | AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,SW1_MASK,0);
|
9 | AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_FIQ, FIQ_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,pio_c_irq_handler );
|
10 | AT91F_AIC_EnableIt (pAic, AT91C_ID_FIQ);
|
11 | }
|
Vielen Dank für eure Unterstützung!!!