- LiFePO4 Speicher Test    Werbung      
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
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    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.

  3. #3
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    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.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Jetzt hast du mein Problem genau verstanden. Dafür Suche ich eine Lösung. Mein Wissen über die Compilter-Schalter, Pragma, etc. reicht nicht aus.

    Ich vermute, die Sektion .data muss verschoben werden. Ich weiß aber nicht wie und habe auch mithilfe von Google keine Lösung gefunden. Es könnte aber auch sein, dass mein Lösungsansatz falsch ist und man die Funktion anders platzieren muss.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    ich lgaube mit dem verschieben der .text als kniff um sich das explizite deklarieren pro methode zu ersparen kollidiert mit dem vorhaben bestimmte methoden an einer definierten adresse zu halten

    ich schau mal ob ich das tempplate von damals noch irgendwo gespeichert habe, dann sparst du dir den kniff und hast volle kontrolle und keine kollisionen

    okay ich habe gerade nochmal ein paar kleinere foreneinträge durchstöbert ... wenn du deine .bootloader_end sektion auch definierst (ähnlich wie mit der .text) sollte er theoretisch meckern dass deine sektion zu wenig platz hat um den code zu fassen, daraufhin musst du deine .bootloader_end einfach ein wenig verschieben bis es wieder klappt ... ich bin mir nicht sicher aber der begriff bootloader_end könnte möglicherweise schon vergeben sein und du solltest einen weniger "allgemeinen" namen für die sektion wählen, vll. bringst du den linker damit durcheinander

    du könntest dir mal die map datei ansehen um zu prüfen wo deine methode gelinkt ist und welche bereiche sich dabei überschneiden (sofern er überhaupt dazu kommt eine map file anzulegen)
    Geändert von Ceos (08.11.2018 um 09:00 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Ein anderer Namen der Sektion bringt keine Änderung. Selbstverständlich ist diese auch definiert, ansonsten würde es eine andere Fehlermeldung geben. Und Sie ist passend platziert. Es wird ja nicht bemängelt, dass Sie nicht reinpasst, sondern dass Sie überlappt. Ich habe es auch mit einem Projekt ohne Bootloader versucht. Hier funktioniert die PLatzierung und ich kann dort ich in der Hex-Datei sehen, dass die Funktion exakt an dieser Stelle platziert ist, und auch dass Sie 74 Bytes im Flash benötigt. Wie Eingangs geschrieben, ist die definierte Adresse der Sektion 7F80 = 0xFF00. Das bedeutet, ich habe in in der Section 256 Bytes Platz. --> Ausreichend.

    Hier ein Auszug aus der map-datei:

    .bootloader_end
    0x0000f418 0x82
    .bootloader_end
    0x0000f418 0x82 CAN_bootloader.o
    0x0000f418 write_flash

    Da scheint was nicht zu passen. Warum bin ich aber überfragt.

    - - - Aktualisiert - - -

    Kommando zurück! Der Name der Sektion war tatsächlich die Ursache. Ich habe beim testweisen ändern nicht bemerkt, dass sich die Fehlermeldung ändert. Es war nämlich noch ein weiterer Fehler im Code. Mit einem anderen Namen für die Sektion funktioniert es nun. Vielen Dank!

Ä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
  •  

    Werbung      fchao-Sinus-Wechselrichter AliExpress