Hallo allerseits, ich habe einen Bootloader geschrieben. Damit ich ihn nicht mit der Applikation zusammen überschreibe, möchte ich ihn ans Ende des Speicherbereichs legen und das Überschreiben ab einer bestimmten Adresse verhindern. Nur - wie macht man das? Grüsse, Steffen
[/C] unsigned char schreiben() { ... if( adresse > LIMIT ) return 1; // Abbruch mit Fehlercode 1 ... return 0; // Schreiben erfolgreich: Code 0 } [C] Peter
Oh, entschuldigung Peter! Ich hab mich unglücklich ausgedrückt: Der Bootloader ist schon fertig. Nur möchte ich ihn nun an das Ende des Speicherbereichs platzieren. Ich suche einen Befehl ähnlich ".org" in Assemblersprache. Wie macht man das? Der Bootloader ist übrigens in Assembler geschrieben, falls das Bedeutung hat.
Und warum verwendest du dann nicht den angesprochenen ".org" Befehl um deinen Assembler-Bootloader an die richtige Stelle zu schieben? Das mit dem Überschrieben ist mir absolut unklar... 1. Bootloader programmieren und diesen komplett im Bootloader-Bereich platzieren (.org) 2. Entstandenes .hex/.bin/...File in den Controller flashen 3. Irgendwelche anderen Programme erstellen (ohne Bootloadercode) und daraufhin dem Bootloader schicken (z.B. RS232), damit er diesen in den Flashspeicher schreiben kann --- Wie Peter schon gezeigt hat, musst du den Bootloader eben so programmieren, dass er jeden Code, der in den Bootloaderbereich reinragen würde ignoriert und bei der Erstellung der Programme darauf achten, dass der Programmcode diesen Fehlerfall nicht erzeugt...
Ja wie jetzt, ".org" funktioniert? In der gcc ".S"-Datei? Dann habe ich irgendwoanders einen Fehler gemacht...
Schön langsam kommt meine Glaskugel in fahrt. Also willst du einen (fertig compilierten) Bootloader welcher in assembler geschrieben wurde, zusammen mit einem C-Quellcode verlinken/compilieren (weil du was von gcc schreibst), so dass der Bootloader am Ende an der richtigen Stelle sitzt? Keine Ahnung wie das geht (steht sich irgendwo im Forum)! Oder ich versteh dein Problem immer noch nicht!!! Nimm doch einfach diesen Bootloader-Assembler-Quelltext ohne eigentliche Applikation... nur am Anfang einen Sprung auf die Bootloader Section... Den Bootloader verschiebst du mit .org Befehlen (im Assembler Code) in diese Section Dann compilieren und mit dem Programmieradapter auf den Controller übertragen. NAch einem Reset müsste der Bootloader ja dann aktiv sein! Ab nun kannst du ja deine Applikationen ohne Bootloader Programmieren und diese an den Bootloader übergeben.
Wenn ich ".org" verwende, dann macht er schon irgendwas mit meinem Programmcode. Ich kann aber leider nicht erkennen, was. Code-Auszug aus Bootloader.S: ...... .func Reprogram .org 0x0F10 Reprogram: ; Programmieren vorbereiten cli ; Interrupts verbieten Reprogram_WaitForEEPROM: sbic _SFR_IO_ADDR(EECR),EEPE ; Warten, bis der EEPROM mit... rjmp Reprogram_WaitForEEPROM ; ...seiner Operation fertig ist ...... Schaue ich hinterher in die lss-Datei, steht der Code aber an Adresse 0x18A6. Die Anweisung funktioniert also nicht. Ich kann auch nicht bei Google danach suchen, weil es dummerweise das Wort "org" als Internet-Endung interpretiert und alles findet, bis auf das, was ich suche. @Unrouted: Ich möchte den Code in diesem Stadium noch nicht von dem Rest des Programms trennen, weil mein Bootloader über CAN funktionieren soll und der CAN-Programmer noch nicht fertig ist. Davon abgesehen löst das immernoch nicht mein Problem... Hast Du noch einen Tipp für mich? Grüsse, Steffen
Wir haben wohl beide gleichzeitig geantwortet. Wie ich das mit dem Bootloader funktioniert, habe ich schon verstanden. Er steht fest im Flash und lädt die Applikation in den freien Speicherbereich. Nur muss ich den Bootloader dafür ja richtig platzieren, also ans Ende des freien Speichers. Und dafür suche ich den passenden Befehl. Vergiss bitte, was ich eben über die Applikation geschrieben habe. Applikation und Bootloader teilen sich die Routinen zum Ansprechen des CAN-Busses, deshalb ist das ein wenig unübersichtlich und ich war eben durcheinander. Das Problem bleibt aber: Wie kann ich in gcc Code in einem bestimmten Speicherbereich platzieren? Sorry, wenn ich mich etwas unklar ausdrücke.
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.