Forum: Mikrocontroller und Digitale Elektronik AtxMega64 interrupt vector tabelle für mehrere Applikationen verbiegen


von Georg X. (schorsch666)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Schau mal in das Manual unter Programmable Interrupt Controller, da 
steht alles drin, was man wissen muss, um die Vektorentabelle zu 
verschieben.

von Georg X. (schorsch666)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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