Unterfunktionen in Section verbannen

Gast #2705895
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
Gast #2705974
also wenn ich nachlese was -ffunction-sections macht, steht dort das es 
nicht verwendete Funktionen wegoptimiert. Darum geht es mir aber doch 
gar nicht....
#2706089
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
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
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
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
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
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...
#2706938
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
Gast #2707499
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.
Gast #2707519
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??

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.