hi
gibt es einen vernünftigen sprintf ersatz für einen einzelnen parameter
als unsigned long ?
- ohne malloc
- ohne stdarg.h
wie macht ihr das im embedded design?
da war ich schon:
Welche Architektur ist das (int scheint 32 bittig, also kein AVR), warum
ist LibGCC schlecht?
Wenn LibGCC "schlecht" ist, dann sollte man einen anderen Compiler als
GCC benutzen oder direkt in Assembler programmieren.
sprint und Konsorten brauchen nur deshalb so viel Platz, weil es
sogenannte eierlegende Wollmilchsäue sind.
Geschrieben unter der Maxime: "Darf‘s noch ein bissel mehr sein"?
Würde mich, beim Betrachten der Optionen, nicht wundern, wenn die auch
kochen und backen können.
Allerdings gibt es auch oft Leute die keinen Einheitsbrei auszugeben
haben, was in Umkehr der obigen Aussage ein Vorteil wäre.
Also des einen Freud...
In diesem Konflikt würde ich Dir empfehlen: Sag doch mal was Du
(ausgeben)willst!
>>Sprintf sollte man sofort vergessen. Viel zu klotzig.
Warum? Wenn genug Platz das ist, kann man es doch auch benutzen.
Und man muss sich verdammt anstrengen, den Speicher der modernen
Prozessoren komplett zu belegen.
Ich würde sprintf benutzen, um mich lieber den wichtigen Problemen
widmen.
c schüler schrieb:> auch da:> braucht die libgcc
Verstehe ich jetzt nicht. Wozu sollte diese itoa Implementierung
libgcc benötigen? Ich sehe da nur Standard-C in Verwendung.
c schüler schrieb:> int d = v / pMods[i];>> braucht die libgcc
Das wundert duch jetzt nicht wirklich...? Du dividiert auf einer
Hardware, die kein DIV-Befehl hat, durch einen unbekannten Divisor.
Evtl. reisst da -O3 -funroll-loops -funroll-all-loops was aus, aber auf
deep embedded ist das auch nicht wirklich prickelnd. Dann doch lieber
so (C99):
1
#include<stdint.h>
2
#include<stdbool.h>
3
4
#if defined (__GNUC__) && defined (__AVR__) && defined (__FLASH)
5
#define flash __flash
6
#else
7
#define flash // empty
8
#endif // avr-gcc has __flash
9
10
// Wandelt N in eine ASCII-Dezimalzahl um. Die Darstellung wird
11
// mit abschliessender '\0' als Stringende nach *STR geschrieben.
12
// Return: Adresse der abschliessenden '\0'.
13
14
char*u32_to_string(char*str,uint32_tn)
15
{
16
staticconstflashuint32_tpows10[]=
17
{
18
1e8,1e7,1e6,1e5,1e4,1e3,1e2,1e1
19
};
20
21
constflashuint32_t*p=pows10;
22
23
#if defined (__OPTIMIZE__) && !defined (__OPTIMIZE_SIZE__)
danke an alle!
ich habe xprintf mal mehr oder weniger jetzt auch hier in dem fall
probiert und es läuft damit mal vorerst. der ansatz von Johann werde ich
mal näher ansehen, danke!
@PittyJ
ich widme mich gerade dem problem "sprintf" :)
der thread gab mir auch sehr viel hintergrund hilfe:
Beitrag "sprintf am STM32F072"
um auf bestimmte compiler flaggs zu kommen.
ich brauche kein float, nur max unsigned long.
solved!
lg
;-)
@Daniel:
ich hatte xprintf noch gar nicht bemerkt im sd einsatz,
nur immer schön altbacken sprintf / printf.
Johann L. schrieb:> c schüler schrieb:>> int d = v / pMods[i];>>>> braucht die libgcc>> Das wundert duch jetzt nicht wirklich...? Du dividiert auf einer> Hardware, die kein DIV-Befehl hat, durch einen unbekannten Divisor.
wenn ich jemals nur 50 prozent wissen erreiche um eine derartig - mitten
ins schwarze - treffende aussage machen zu können, wäre ich zufrieden.
1+
es wurde alles gestrippt was es zu strippen gilt(gibt).
jetzt wird langsam aufgebaut, was wirklich nur gebraucht wird und
auf was verzichtet werden kann.
nicht böse sein Axel:
Axel S. schrieb:> c schüler schrieb:>> auch da:>> braucht die libgcc>> Verstehe ich jetzt nicht. Wozu sollte diese itoa Implementierung> libgcc benötigen? Ich sehe da nur Standard-C in Verwendung.
da sind welten dazwischen :)
danke Johann!
;-)
c schüler schrieb:> Johann L. schrieb:>> Das wundert duch jetzt nicht wirklich...? Du dividiert auf einer>> Hardware, die kein DIV-Befehl hat, durch einen unbekannten Divisor.>> wenn ich jemals nur 50 prozent wissen erreiche um eine derartig - mitten> ins schwarze - treffende aussage machen zu können, wäre ich zufrieden.
Naja, das war einfach gut geraten. Zumal du ja deine Zielarchitektur gar
nicht genannt hattest.
> nicht böse sein Axel:>> Axel S. schrieb:>> Verstehe ich jetzt nicht. Wozu sollte diese itoa Implementierung>> libgcc benötigen? Ich sehe da nur Standard-C in Verwendung.>> da sind welten dazwischen :)
Du hättest ja auch ein bisschen mehr Input liefern können. Zum Beispiel
was aus der libgcc da zu deinem Programm gelinkt wird. Und du hast
auch immer noch nicht gesagt, warum das schlecht sein soll. Jedes
C-Programm braucht Funktionen aus der C-Runtime. Das eine mehr, das
andere weniger. Und wenn du eine arithmetische Operation verwendest, die
auf der Zielarchitektur nicht inline erzeugt werden kann, dann
bekommst du halt die entsprechende Funktion aus der Runtime dazugelinkt.
Was denn sonst?
c schüler schrieb:> gibt es einen vernünftigen sprintf ersatz für einen einzelnen parameter> als unsigned long ?
Lade dir die Lernbetty hier aus dem Forun herunter und benutze davon
conv.c - da hast du eigentlich alles, was du brauchst.
Und "JA" das hat hier auch schon jemand mit nem AVR benutzt, dieses
Stückchen Quelle geht nicht nur für ARM.
Und noch ein Wort zu sprintf und Konsorten: Auf einem µC ist mir sowas
auch viel zu klobig.
W.S.
PittyJ schrieb:> Und man muss sich verdammt anstrengen, den Speicher der modernen> Prozessoren komplett zu belegen.
Was? 8 kB hab ich ruckzuck voll.
Ach so, keine verallgemeinerungen von "mein Controller" auf "jeder
Controller", dann streich obigen Satz wieder.
Und streich dann aber Deinen bitte ebenfalls.