Hallo, ich arbeite mit dem AtxMega64 und AVR-Studio6. Im aktuellen Projekt möchte ich im Flash mehrere Applikationen vorhalten. Grund dafür ist dass ich im Bootloader keine weiteren Prüfungen einfügen kann da der Bootloaderflash schon verbraucht ist. Aus diesem Grund soll ein Urloader die eigentliche Applikation prüfen und dann entscheiden ob diese gestartet werden darf oder nicht. An dieser Stelle habe ich somit im Applikationsflash die Applikation und einen Urloader. Beides separate Projekte. Jetzt hat natürlich jedes Projekt seine eigene Vectortabelle. Die von der Applikation liegt am Anfang vom Flash die von dem Urloader soll weiter hinten im Flash beim Urloader liegen. Jetzt habe ich die Problematik dass ich zwar den Urloader im Flash verschieben und an eine gewünschte Stelle setzen kann (.text wird verschoben) aber dieser immernoch die Vectortabelle am Anfang des Flashes erwartet. Wie verschiebe ich alles was zum Urloader gehört in den gewünschten Flashbereich und wie kann ich dem Urloader beibringen seine eigene Vectortabelle zu benutzen? Danke. Gruß, Georg.
Schau mal in das Manual unter Programmable Interrupt Controller, da steht alles drin, was man wissen muss, um die Vektorentabelle zu verschieben.
Hallo, diesen Dokumentationsbereich kenn ich. Aber scheinbar habe ich es noch nicht richtig verstanden wie es funktioniert. Ich kann so wie ich das Manual verstehe zwischen der Vektortabelle der Bootsection und der Applicationsection auswählen mehr nicht. Meine Applikation ist am Anfang vom Flash. Somit ist auch die Interrupttabelle der Applikation ab Adresse 0x00 zu finden. Der Urloader ist weiter hinten im Flash. Jetzt versucht der Urloader die Interruptabelle der Applikation zu verwenden. Ist grundsätzlich nicht verkehrt da ich im Urloader keine Interrupts verwende. Aber der Resetvector passt nicht. Wenn ich z.B. mit dem Debugger den Urloader debuggen möchte dann lande ich immer im Resetvector der Applikation und somit in der Applikation und nicht im Urloader. Ist nur der Urloader geflasht funktioniert das Debuggen. Dem Linker habe ich mit .text = 0x6000 den Urloader verschoben. Im Mapfile sehe ich auch dass alles incl. Vectorsection in diesem Bereich liegen. Nur beim Debuggen mit der augespielten Applikation wird der Resetvector der Applikation genommen und nicht der vom Urloader. Vieleicht kann mir jemand in ein paar Sätzen erklären wie ich mit den Einstellungen der Bits: BOOTRST IVSEL den richtigen Resetvector wählen bzw. einstellen kann. Danke. Gruß, Georg.
Georg X. schrieb: > diesen Dokumentationsbereich kenn ich. > Aber scheinbar habe ich es noch nicht richtig verstanden wie es > funktioniert. Ja, sehe ich auch so. Georg X. schrieb: > Meine Applikation ist am Anfang vom Flash. Georg X. schrieb: > Der Urloader > ist weiter hinten im Flash. So weit so gut. Georg X. schrieb: > Ich kann so wie ich das Manual verstehe zwischen der Vektortabelle der > Bootsection und der Applicationsection auswählen mehr nicht. Das ist doch schon mal was. Georg X. schrieb: > Jetzt versucht der Urloader die Interruptabelle der Applikation zu > verwenden. Ist grundsätzlich nicht verkehrt da ich im Urloader keine > Interrupts verwende. Aber der Resetvector passt nicht. Warum? Der "Urloader", auch Bootloader genannt, kann doch seine eigene Vektorentabelle nuten, wenn er den an einer der Standard-Adressen im Bootbereich des Flashs angesiedelt ist. Georg X. schrieb: > Dem Linker habe ich mit .text = 0x6000 den Urloader verschoben. Das ist quark. Der Bootloader gehört in den separaten Flashbereich hinter die normale Applikationssektion. In Deinem Fall also hinter die Adresse 0x00FFFF. Georg X. schrieb: > Vieleicht kann mir jemand in ein paar Sätzen erklären wie ich mit den > Einstellungen der Bits: BOOTRST IVSEL den richtigen Resetvector wählen > bzw. einstellen kann. Wenn Dein Bootloader an der korrekten, per Fuse auszuwählenden Adresse steht, dann musst Du nur folgenden Code eingeben oder diesen in C übersetzen:
1 | ;setup InterruptController |
2 | ldi Temp, $D8 ;disable I/O Register protection for 4 cycles |
3 | out CPU_CCP, Temp |
4 | ldi Temp, 0b01000111 ;move vectors to boot section (protected), enable hi, mid, lo level Interrupts |
5 | sts PMIC_CTRL, Temp |
Die Vektorentabelle wird mit folgendem code abgelegt:
1 | .cseg |
2 | .org BOOT_SECTION_START /2 ;(Start of Boot code, word address) |
3 | |
4 | jmp RESET ;Reset |
5 | jmp RESET ;NMI, external oscillator failure |
6 | jmp RESET ;PortC Int0 |
7 | |
8 | ...... |
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.