Forum: Mikrocontroller und Digitale Elektronik dsPIC Bootloader -> Interrupt Remapping


von Benjamin S. (recycler)


Lesenswert?

Hallo zusammen,

ich habe einen SPI Bootloader für den dsPIC33 geschrieben. Dieser 
funktioniert auch soweit. Ebenfalls fertig ist die Applikation.
Beide laufen einwandfrei, wenn sie eigenständig programmiert werden.

Der BL startet bei 0x200, die Applikation liegt bei 0x6000.

Im BL schreibe ich den Applikatinscode an 0x6000. Was ich aktuell nicht 
mache ist, die ISR anzupassen, weshalb die Applikation, welche über den 
BL gestartet wird mit einem Adressfehler auf Grund fehlender ISR 
abstürzt und der PIC restartet. Soweit ist mir das klar.

Was mir nicht klar ist, wie ich die ISR umbiege und wo ich das am besten 
machen.

Wie kann man die ISR nachträglich noch ändern bzw. anlegen.
Kurz vor dem Start sind alle Interrupts deaktiviert. Muss ich in der 
Applikation diese selbst umbiegen, ala 0x1C = *DMA0Interrrupt; oder kann 
mir hier der Linkner helfen, der ggf. eigenen Code einfügt.

Im Linkerscript habe ich nur die Adressen und Längen geändert. Weiter 
aktuell nichts.

Wie macht Ihr das? Bin für jede Hilfe dankebar!


Greetz
Recycler

von Frank K. (fchk)


Lesenswert?

Bei mir beginnt die App bei 0x2000. Ich definiere im Linker-Script:
1
MEMORY
2
{
3
  data (a!xr)  : ORIGIN = 0x800,  LENGTH = 0x4000
4
  reset    : ORIGIN = 0x2000,  LENGTH = 0x4
5
  ivt    : ORIGIN = 0x2004,  LENGTH = 0x1FC
6
  program (xr)  : ORIGIN = 0x2208,  LENGTH = 0x289F0
7
  CONFIG3    : ORIGIN = 0x2ABFA,  LENGTH = 0x2
8
  CONFIG2    : ORIGIN = 0x2ABFC,  LENGTH = 0x2
9
  CONFIG1    : ORIGIN = 0x2ABFE,  LENGTH = 0x2
10
}
11
12
__CONFIG3 = 0x2ABFA;
13
__CONFIG2 = 0x2ABFC;
14
__CONFIG1 = 0x2ABFE;
15
__CODE_BASE = 0x2200;
16
__CODE_LENGTH = 0x289F0;
17
__IVT_BASE  = 0x2004;
18
__AIVT_BASE = 0x2104;

und biege die Interrupts um:
1
.ivt __IVT_BASE :
2
  {
3
  SHORT(DEFINED(__ReservedTrap0)  ? ABSOLUTE(__ReservedTrap0)  : ABSOLUTE(__DefaultInterrupt));
4
  SHORT(0x04);
5
  SHORT(DEFINED(__ReservedTrap0)  ? ((ABSOLUTE(__ReservedTrap0)>>16)&0x7f)  : ((ABSOLUTE(__DefaultInterrupt)>>16)&0x7f));
6
  SHORT(0x00);
7
8
  SHORT(DEFINED(__OscillatorFail)  ? ABSOLUTE(__OscillatorFail)  : ABSOLUTE(__DefaultInterrupt));
9
  SHORT(0x04);
10
  SHORT(DEFINED(__OscillatorFail)  ? ((ABSOLUTE(__OscillatorFail)>>16)&0x7f)  : ((ABSOLUTE(__DefaultInterrupt)>>16)&0x7f));
11
  SHORT(0x00);
12
....

Heißt also: Ich lasse GOTO-Anweisungen generieren, die entweder auf den 
immer vorhanden DefaultInterrupt oder meinen Interrupt-Vektor zeigen.

Im Bootloader definiere ich dann im Linkerscript die Interrupt-Vektoren 
passend um:
1
.ivt __IVT_BASE :
2
{
3
  LONG(ABSOLUTE(0x2004)); /*__ReservedTrap0*/
4
  LONG(ABSOLUTE(0x2008)); /*__OscillatorFail*/
5
  LONG(ABSOLUTE(0x200c)); /*__AddressError*/
6
  LONG(ABSOLUTE(0x2010)); /*__StackError*/
7
  LONG(ABSOLUTE(0x2014)); /*__MathError*/
8
  LONG(ABSOLUTE(0x2018)); /*__ReservedTrap5*/
9
...

Der Bootloader muss also nichts von den Vektoren in der App wissen, weil 
ich ja dort die GOTOs hab generieren lassen, so dass die 
Einsprungsstellen immer konstant sind, um im Bootloader feste Adressen 
eintragen zu können.

fchk

von Peter C. (peter_c49)


Lesenswert?

Hallo Benjamin,

>Der BL startet bei 0x200,
wenn es ein dsPIC33 ist, wird er nur 512 wörter als kleinste einheit im 
flash löschen können.
Die IVT ist aber unterhalb 0x200. heist, wenn du die IVT beschreiben 
willst, geht es nicht da du den BL auch überschreiben würdest.
Eventuell solltest du einfach auf 0x200 bytes verzichten und den 
bootloader bei 0x400 plazieren.
Dann kann dein BL die unteren 512 wörter auch umschreiben und es braucht 
keinerlei Tricks um die IVT zu verbiegen.
Schau mal in AN1094 (Seite 2).
Zumindest wäre das mein Ansatz um das Problem zu vermeiden.

mfG
Peter ;-)

: Bearbeitet durch User
von Benjamin S. (recycler)


Lesenswert?

Hallo Peter,

das wäre ein Möglichkeit, allerdings benutze ich im Bootloader 
Interrupts und diese liegen wo anders als in der Applikation.
Der BL kann updaten, hab aber auch einen Produktionsmodus und kann einen 
geringen Anteil der Applikation mitabarbeiten, sozusagen als Mini-App.

MFG
Recycler

von Harald (Gast)


Lesenswert?

Hallo
hat wer einen Bootloader für einen PIC33fj
Ich hab es mit den AN1094 probiert geht soweit auch bzw. Ich kann vom 
Controller den Speicherauslesen, aber in der Eingabeaufforderung kann 
ich das Hex file nicht übertragen. Kann das File nicht öffnen.
Hat vielleicht wer eine Windwos Anwendung? Oder gibts wo ein Beispiel?

Gebt mir Bescheid

DAnke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.