Forum: Compiler & IDEs Unterfunktionen in Section verbannen


von Max (Gast)


Lesenswert?

Hallo zusammen,

ich würde gerne eine Funktion (atoi) deren Aufruf sich in einer meiner 
Funktionen (display) befindet in eine eigene Section packen.

Die Funktion display befindet sich in einer Section. Logischerweise 
werden Funktionen die darin aufgerufen werden nicht in diese Section 
gelegt.

Wie kann ich das bei der Funktion atoi z.b. ebenfalls bewirken?
Vielen Dank
Max

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

-ffunction-sections?

von Max (Gast)


Lesenswert?

also wenn ich nachlese was -ffunction-sections macht, steht dort das es 
nicht verwendete Funktionen wegoptimiert. Darum geht es mir aber doch 
gar nicht....

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Max schrieb:
> also wenn ich nachlese was -ffunction-sections macht, steht dort das es
> nicht verwendete Funktionen wegoptimiert.

Käse, wo hast denn das gelesen?

Jede Funktion wird in ihre eigene Named Section gelegt. Das willst du 
doch?

Es schafft bestenfalls die Voraussetzung für eine solche Optimierung, 
die dann in den binutils geschehen kann.

von Max (Gast)


Lesenswert?

kann ich so die Bibliotheksfunktion itoa in die gleiche Section legen 
(selbst angelegte Section) wie meine display Funktion?!??

von Uwe (de0508)


Lesenswert?

Max schrieb:
> kann ich so die Bibliotheksfunktion itoa in die gleiche Section legen
> (selbst angelegte Section) wie meine display Funktion?!??

Mir erschließt sich deine Frage nicht. Warum willst Du das machen ?

Bei mir sieht der Abschnitt im Makefile wie folgt aus
1
CFLAGS += -ffunction-sections -fdata-sections
2
CFLAGS += -Wl,--gc-sections
3
CFLAGS += -Wl,--relax

avr gcc-Version 4.3.5 (GCC)

von Max (Gast)


Lesenswert?

ich möchte das machen weil der Bootlodercode sonst zu groß ist.
Ich habe eine eigene Section für Codeteile die ich sowohl vom Bootloader 
als auch von der Anwendung aus verwenden möchte.
Die Funktion "display" ist so eine. Diese verwendet die 
Flashspeicherfressende Funktion "itoa" welche trotzdem im 
Bootloaderbereich liegt und leider nicht ebenfalls in dieser extra 
Section.

Das muss doch irgendwie gehen.

von John-eric K. (mockup)


Lesenswert?

wenn du die Adresse der Funktion im Bootloaderbereich weißt, dann 
könntest du ein typedef für die Funktion machen. zB so:
typedef int (*_fpFunction)(void);

_fpFunction fpFunction = "Adresse wo die Funktion im Bootloaderbereich 
sitzt";

und mit
fpFunction();
kannst du diese aufrufen.

So würde ich das Probieren.
Wenn der Bootloader sich ändert, muss die Adresse natürlich geändert 
werden.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst sowas wie
1
 __attribute__((section (".text.foo")))
verwenden oder die Funktion händlisch per Linkerskript rumschubsen.

Ob es ratsam ist, Code zwischen Applikation und Bootloader zu teilen, 
sei dahingestellt. Wenn's dir die Applikation zerschiesst, ist nix mehr 
mit Bootloader weil der nicht-existierende Funktionen aufruft.

Besser: Kleine Funktionen verwenden anstatt Klopper wie itoa. Brauchst 
du wirklich eine Umwandlung, bei der die Basis erst Laufzeit bekannt 
ist?

von Max (Gast)


Lesenswert?

das mit dem _attribute_... ist mir schon klar nur wie mache ich das 
bei "itoa" .. die Funktion kommt über das #include <string.h> rein.. 
dahinter kann ich kein attribut setzen.

Ich denke ich brauche das itoa da ich z.b. eine Zählvariable ausgeben 
möchte.
irgendwie muss ich eben den integer zu nem char wandeln damit ich ihn 
anzeigen kann.

Grundsätzlich wäre es eben interessant wie ich solche eingebundenen 
Funktionen in eine vorhandene Section schieben kann.

Max

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Max schrieb:
> das mit dem _attribute_... ist mir schon klar nur wie mache ich das
> bei "itoa" .. die Funktion kommt über das #include <string.h> rein..
> dahinter kann ich kein attribut setzen.
>
> Grundsätzlich wäre es eben interessant wie ich solche eingebundenen
> Funktionen in eine vorhandene Section schieben kann.

Na dann eben übers Linker-Script. Die AVR-LibC legt die Module in eigene 
Sections, allerdings nicht per -ffunction-sections. Musst eben im 
Mapfile schauen wie die Sections heissen und dann per Script die 
entsprechende Input-Section der gewünschten Output-Section zuordenen.

> Ich denke ich brauche das itoa da ich z.b. eine Zählvariable ausgeben
> möchte.

Du brauchst Umwandlung mit variabler Basis? Hexadezimal? Oktal? 
Dezimal? Alles frei wällbar zur Laufzeut weil der Anwender das Display 
von HEX auf DEC umstellt? Ein Tschenrechner also...

von Volkmar D. (volkmar)


Lesenswert?

Hallo Max,

ist dir folgender Kommentar aufgefallen?

Johann L. schrieb:
> Wenn's dir die Applikation zerschiesst, ist nix mehr
> mit Bootloader weil der nicht-existierende Funktionen aufruft.

Ich würde keine Funktionen, die ich im Bootloader benötige, auslagern. 
Da ist keine Garantie das die Funktion immer verfügbar ist. Andersrum 
mag es gehen.

Volkmar

von Max (Gast)


Lesenswert?

Danke für eure Antworten..

ich finde im Map File kein itoa und eine dazugehörige Section.

dort finde ich nur Einträge zu der display Funktion.
Ich denke dort werden libraries auch nicht separat aufgeführt?!?

Nein es geht nicht um einen Taschenrechner. Ich möchte einen uint8/16 
oder 32 einfach nur auf dem Display anzeigen und muss ihn dazu in den 
dzugehörigen ASCII umwandeln.

Volkmar... ja das habe ich nicht überlesen. Es ist nur so, dass ich 
einige Funktionen in beiden Bereichen brauche und es den Speicher 
sprengen würde wenn ich alles doppelt implementiere.
Wenn es da etwas zerschiest funktioniert wahrscheinlich sowieso nichts 
mehr wie es soll... klar wäre es gut den Bootloader dann noch zu haben 
.. aber ds geht mit dieser Konfigurtion einfach nicht und ist auch nicht 
so kritisch.

von Max (Gast)


Lesenswert?

ah doch .. man sollte halt "itoa" nicht auskommentieren beim kompilieren 
:)

Die Section heist .text.avr-libc ... wie mappe ich die nun syntaktisch 
in meine eigene Section??

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.