Forum: Compiler & IDEs Wie Speicherbereich festlegen?


von Steffen Hausinger (Gast)


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

von Peter D. (peda)


Lesenswert?

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


Peter

von Steffen Hausinger (Gast)


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.

von __ _. (unrouted)


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

von Steffen Hausinger (Gast)


Lesenswert?

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

von __ _. (unrouted)


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.

von Steffen Hausinger (Gast)


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

von Steffen Hausinger (Gast)


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.

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
Noch kein Account? Hier anmelden.