- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: AVR: Im Bootloader eine Funktion an eine bestimmte Position setzen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716

    AVR: Im Bootloader eine Funktion an eine bestimmte Position setzen

    Hallo,

    ich programmiere derzeit einen Bootloader für einen AT90CAN64. Dieser funktioniert einwandfrei. Ich habe 64 kB Flash-Speicher und die Bootloader-Fuse-Bits auf 0x7000 gesetzt. In den Linker-Options habe ich folgendes hinzugefügt: -Ttext=E000
    Dadurch landet der Bootloader an der korrekten Adresse im Flash und es läuft auch alles einwandfrei.

    Jetzt kommt allerdings ein Zusatz: Ich muss auch vom Haupt-Programm ebenfalls in den Flash-Speicher schreiben können. Da dieser Code nur von der Bootsector-Section aus ausgeführt werden kann, muss die entsprechende Funktion also in den Bootloader. Diese hätte ich dann gerne an eine fixe Adresse, damit ich die Funktion auch sicher anspringen kann.

    Dazu habe ich mir in den Memory-Einstellungen des Bootloader-Projekts eine Section (.bootloader_end) an die Adresse 0x7F80 hinzugefügt und die Funktion, die vom Hauptprogramm aufgerufen werden soll wie folgt deklariert:

    #define BOOTLOADER_END_SECTION __attribute__ ((section (".bootloader_end")))

    void write_flash (U16* ptrData, U32 destination, U32 size) BOOTLOADER_END_SECTION;

    Leider meckert jetzt der Linker:

    ../avr/bin/ld.exe: section .bootloader_end loaded at [0000f418,0000f499] overlaps section .data loaded at [0000f418,0000f49f]

    Kann mir jemand einen Tipp geben, wie ich das gelöst bekomme?

    Viele Grüße,
    Andreas

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Dass du vom Hauptprogramm aus den NVM Controller nicht ansprechen darfst ist so nicht korrekt, aber die Flash Sektion des Hauptprogrammspeicher arbeitet dann nicht mehr!

    Du kannst also getrost deine Calls vom Hauptprogramm aus ausführen, musst aber mit den paar mS Pause leben!

    Wenn du jetzt nur die Methode aufrufen willst, wird dein Execution Pointer zwar in den Boot-Bereich springen, aber sobald der return kommt hängt dein Programm ebenfalls wieder.

    Aber zu deinem Problem, ich glaube du musst ein "extern" der Methodendeklaration voranstellen, da er sonst versucht eine neue, leere Methode an der Adresse zu erstellen, während du mit extern explizit einen Verweis auf eine existierende Funktion erzwingst.

    Ich bin mir da aber im Moment auch nciht sicher, an einem Bootloader habe ich vor 3 Jahren das letzte mal rumgeschraubt (unter anderem wollte ich das gleiche erreichen, mein Programm während einer Flash Write operation zu nutzen, musste dann aber einsehen dass ich den Programmkern in den Bootbereich hätte verschieben müssen um das zu realisieren)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo Ceos,

    vielen Dank für den Hinweis mit dem Schreiben. Ich würde es trotzdem gerne zunächst so versuchen, wie ich es im Eingangspost erklärt habe.

    Die Funktion "write_flash" ist natürlich im C-Code des Bootloaders enthalten. Das Extern-Attribut muss ich dann im Hauptprogramm setzen. Die Fehlermeldung kommt aber beim compilieren des Bootloaders, wenn ich Versuche die Funktion an diese Adresse zu positionieren.

    Viele Grüße,
    Andreas

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Oh okay das hab ich dann falsch gelesen
    ich bin wegen 2erlei sachen verwirrt, zum einen warum du die methode an die adresse .bootloader_end statt .bootloader schreibst, vll. ist dein Problem dass du den falschen Marker benutzt und ich vermisse aus der Doku gelesen dass du der sektion eine startadresse gibst, du legst zwar fest wo .text anfängt aber nicht wo .bootloader liegen soll

    https://www.microchip.com/webdoc/AVR...eloc_code.html
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Da ich einen Bootloader programmiere, gibt es die Sektion .bootloader streng genommen nicht. Und selbst wenn befindet sich ja dort der Bootloader. Der Linker würde die Funktion dann wieder platzieren, wo er möchte. Ich möchte Sie aber an einer definierten Stelle im Flash haben. Deshalb lege ich eine neue Sektion an, in der nur diese Funktion kommt. Dann kann ich Sie vom Hauptprogramm direkt anspringen.

    Es würde auch nichts nutzen den Code des Bootloaders in die Sektion ".bootloader" zu platzieren, da ich auch Interrupts benötige. Die IRQ-Tabelle kann meines wissens nach nur mit dem Trick der Text-Sektion (-Ttext=E000) am Start des Bootloader-Bereichs platziert werden.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    das ist teilweise korrekt, um die ISR zu verschieben geht das nur so, aber da du eine sektion erzeugt hast, musst du sie auch an eine stelle schieben an der sonst nichts anderes ist, wie es in dem verlinkten Artikel beschrieben ist. Deine Sektion überlappt sich weil er scheinbar denkt dass der Teil der Methode ebenfalls im .data deklariert wird ... vielleicht fehlt irgend ein pragma oder ein zeichen dass die deklarierte Methode nicht ebenfalls teil von .data ist!?

    Ich habe damals ein Template mit definierten Sektionen genutzt udn damit gearbeitet um mir diesen horror mit dem segmentieren meines codes zu ersparen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. Prüfen ob Taster eine bestimmte Zeit unterbrechungsfrei gedrückt ist
    Von jcrypter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 31.08.2012, 07:42
  2. int0 eine bestimmte Zeit abschalten
    Von umbras im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 26.09.2008, 19:59
  3. robby für eine bestimmte zeit fahren lassen
    Von 3dfreak im Forum Robby CCRP5
    Antworten: 3
    Letzter Beitrag: 31.07.2007, 16:45
  4. Taste eine bestimmte Zeit abfragen
    Von picprogger im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 14.03.2007, 21:29
  5. Antworten: 5
    Letzter Beitrag: 02.02.2007, 10:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen