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
also wenn ich nachlese was -ffunction-sections macht, steht dort das es nicht verwendete Funktionen wegoptimiert. Darum geht es mir aber doch gar nicht....
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.
kann ich so die Bibliotheksfunktion itoa in die gleiche Section legen (selbst angelegte Section) wie meine display Funktion?!??
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)
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.
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.
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?
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
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...
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.