Forum: Compiler & IDEs Code an beliebige Stelle im Flash


von thkais (Gast)


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

von Wolfram (Gast)


Lesenswert?

schau mal nach memory sections, attribute

von thkais (Gast)


Lesenswert?

Vielen Dank, das waren die Stichworte, die ich brauchte!

von Peter D. (peda)


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

von Wolfram (Gast)


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.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

du könntest doch den String rückwärts ans Ende des Flash (bzw. ans Ende
der Applikationssektion) setzen. Evtl. ist da ein wenig Scriptmagie
nötig um den String vor dem Linken umzudrehen aber ansonsten...

Matthias

von Peter D. (peda)


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

von Klaus M. (meinzinet)


Lesenswert?

Würde mich interessieren ob jemand eine Lösung für dieses Problem 
gefunden hat.
Suche auch nach einer Möglichkeit einen Zeichensatz in einer section 
einmal zu übertragen und nicht jedesmal mit zuübertragen, wenn eine 
kleine Programmänderung gemacht wird.

G klaus

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.