AtxMega64 interrupt vector tabelle für mehrere Applikationen verbiegen

OP #4371946
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.
OP #4372776
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.
(Firma: TravelRec.) Persönliche Seite #4373224
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
......

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.