www.mikrocontroller.net

Forum: Compiler & IDEs Wie Speicherbereich festlegen?


Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[/C]
unsigned char schreiben()
{
...
if( adresse > LIMIT )
  return 1;          // Abbruch mit Fehlercode 1
...
return 0;            // Schreiben erfolgreich: Code 0
}
[C]


Peter

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: __ __ (unrouted)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja wie jetzt, ".org" funktioniert? In der gcc ".S"-Datei? Dann habe
ich irgendwoanders einen Fehler gemacht...

Autor: __ __ (unrouted)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.