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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.