Code an beliebige Stelle im Flash

Gast #366153
Lesenswert?

Moin allerseits.

Ich suche nach Möglichkeiten, den vom GCC generierten Code an
beliebige, von mir festgelegte Adressbereiche innerhalb des Flash zu
legen. Ferner müßte ich die Ram-Bereiche definieren können, die der
Code benutzt. Ich habe irgendwo etwas in dieser Art in Zusammenhang mit
einem Bootloader gesehen, finde es aber nicht mehr. Wäre nett, wenn mir
mit einem Link oder einem Suchbegriff auf die Sprünge geholfen würde.


Zweck: Ich habe eine Art "Betriebssystem", das immer in einem festen
Bereich liegen soll und schreibe dazu entsprechende Anwendungen.
Momentan linke ich das OS dazu, aber es nervt mit der Zeit, wenn man
jedesmal wegen einer 1-Byte Änderung den gesamten Flash beschreiben
muss. Ein anderer Anwendungsfall: Für ein Grafik-Display habe ich
mehrere Zeichensätze. Die müssen jedesmal, wenn ich an der
Steuersoftware (ca. 5% des Flash) etwas ändere, mit übertragen werden
(ca. 80% des Flash).

Gruß
Thomas
#366156
Lesenswert?

Ich sitze genau vor dem gleichen Problem und komme nicht weiter. Es gibt
2 Fehlermeldungen.

1.
Ich will einen String an immer die gleiche Adresse schreiben (0x100),
leider erhalte ich dann die Fehlermeldung:

section .text [00000000 -> 00000ab3] overlaps section .version
[00000100 -> 00000126]

Plaziere ich den String hinter das Programm geht es. Bloß ist das eben
je nach Programmgröße und AVR-Typ immer ne andere Adresse.


2.
Der String soll nicht in den RAM kopiert werden, muß also auch noch vom
Typ PROGMEN sein. Bloß dann kriege ich diese Fehlermeldung:

error: section of 'vers' conflicts with previous declaration


Ziel ist, in den Wust von Hex-Files etwas Ordnung reinzubringen, also
im Klartext nen Kommentar zu haben, wofür es ist, welche Version,
Compiledatum usw..
Bei meinen 8051-Programmen funktioniert das schon längere Zeit
einwandfrei.
Die immer gleiche Adresse deshalb, um den String leichter zu finden,
bzw. auch per Bootloader auslesen zu können.


Peter
Gast #366157
Lesenswert?

>section .text [00000000 -> 00000ab3] overlaps section .version
>[00000100 -> 00000126]
>Plaziere ich den String hinter das Programm geht es. Bloß ist das
eben
>je nach Programmgröße und AVR-Typ immer ne andere Adresse.
dein Programm das in der textsection steht geht von 0 bis ab3
darin ist dein Programm
du scheinst jetzt festgelegt zu haben dass an Stelle 100 deine section
version liegt was nicht geht da dort auch section text ist.
nimm eine höhere Stelle (grösser als die maximalgrösse deines
Programmes
und kleier als der Bootloader.
#366159
Lesenswert?

Ich wollte eben gerade nicht für jeden AVR-Typ den String an eine andere
Stelle schreiben müssen.


Der 8051-Linker hat zuerst den absolut plazierten Code gelinkt (z.B.
auch die Interruptvektoren) und dann den verschiebbaren Code einfach
drumherum.

Kleinere Routinen wurden z.B. in die Lücken an nicht benutzte
Interruptvektoren plaziert.

Daher dachte ich, der GCC-Linker kann das auch.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren