Unterfunktionen in Section verbannen

Gast #2705895
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
#2706089
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)
Gast #2706095
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.
#2706116
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.
Persönliche Seite #2706119
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?
Gast #2706147
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
Persönliche Seite #2706157
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...
Gast #2707499
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.

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