AVR-GCC Fixed Point und Strings

Persönliche Seite #4315478
Lesenswert?

Hallo Forum,

ich habe eine Frage:

angemonnen ich habe einen String (const char*) der eine Zahl erhält. 
Diese Zahl möchte ich in einen fixed-point-Typ umwandeln.
Bei float wäre es klar: atof(str);
Aber gibt es das für fixed-point-Typen auch?

Den Typ den ich nutzen möchte wäre der größtmögliche, also "long long 
sat fract".

Also:
Wie kann ich einen String zu einer fixed-Point-Zahl wandeln? (möglichst 
einfach)

PS: Festkomma etc kenne ich, will ich nicht, da ich dann einen _int128 
brauchen könnte den es für den avr-gcc nicht gibt.
PPS: Platz und Zeit spielen eine untergeordnete Rolle (Zeit fast egal)
Persönliche Seite #4315496
Lesenswert?

Boben schrieb:
>> "long long sat fract".
>
> Unterstützt der AVR-GCC diesen Typen überhaupt?

Jep,

halt mit
1
#include <stdfix.h>
2

3
void func(void) {
4
    long long sat accum num;
5
}
gibts so was:
1
math.c:157:10: warning: 'num' is used uninitialized in this function [-Wuninitialized]

Funktioniert also (zumindest unterstützt der GCC den Typen). Laut 
Changelog sogar fast vollständig, alles vorhanden bis auf die #pragmas 
die runden etc steuern.
Persönliche Seite #4320580
Lesenswert?

Rolf M. schrieb:
> Das verstehe ich nicht ganz.
>
> N. G. schrieb:
>> angemonnen ich habe einen String (const char*) der eine Zahl erhält.
>> Diese Zahl möchte ich in einen fixed-point-Typ umwandeln.
> ...
>> PS: Festkomma etc kenne ich, will ich nicht
>
> "fixed-point" ist der englische Begriff für "Festkomma", ist also
> dasselbe.

Natürlich, ich meinte dass man mich nicht auf den link 1) zum 
Wikiartikel verweisen sollte, weil ich den schon kenne

1) https://www.mikrocontroller.net/articles/Festkommaarithmetik
Gast #4322844
Lesenswert?

Der ISO-Standard (ISO/IEC JTC1 SC22 WG14 N1169) sieht Routinen wie

1
short fract strtofxhr(const char * restrict nptr, char ** restrict endptr);

vor.

Wo sind die denn beim AVR-GCC abgelegt?
Welche LIB muss z. B. eingebunden werden?
Persönliche Seite #4323097
Lesenswert?

Bleibtreu schrieb:
> Wo sind die denn beim AVR-GCC abgelegt?
> Welche LIB muss z. B. eingebunden werden?

also der avr-gcc wirft implicit declaration, d.h. es fehlt auf jeden 
Fall schon mal ein Header.
Der Linker meckert aber auch dass er die Funktion nicht finden kann, 
d.h. die Funktion ist auch nicht in einer lib des gcc, die in jedem 
Falle mitgelinkt wird.

Kann man dafür ausgehen, dass beim avr-gcc dafür einfach der Support 
fehlt?
Gast #4323145
Lesenswert?

N. G. schrieb:
> Bleibtreu schrieb:
>> Wo sind die denn beim AVR-GCC abgelegt?
>> Welche LIB muss z. B. eingebunden werden?
>
> also der avr-gcc wirft implicit declaration, d.h. es fehlt auf jeden
> Fall schon mal ein Header.
> Der Linker meckert aber auch dass er die Funktion nicht finden kann,
> d.h. die Funktion ist auch nicht in einer lib des gcc, die in jedem
> Falle mitgelinkt wird.
>
> Kann man dafür ausgehen, dass beim avr-gcc dafür einfach der Support
> fehlt?

Gute Frage.

Die Datentypen (z. B. fract) und die Operatoren (z. B. Multiplikation) 
werden unterstützt. Vielleicht gibt es eine Library, die gelinkt werden 
muss?
Moderator Persönliche Seite #4324019
Lesenswert?

N. G. schrieb:
> Ich würde mir die atoX(char*)-Funktion ja gerne selber schreiben, aber
> ich weiß nicht genau wie, da ich die Darstellung einer long long sat
> accum-Zahl nicht kenne.

Im Zweifelsfalle frag mal Georg-Johann Lay danach, er hat die
Implementierung ja beigesteuert.  Kann mir auch vorstellen, dass
er schon Fragmente für sowas hat.

Ansonsten würde sich die avr-libc natürlich freuen, wenn du uns eine
Implementierung von strtofxhr() beitragen könntest. ;-)
Persönliche Seite #4324981
Lesenswert?

Jörg W. schrieb:
> N. G. schrieb:
>> Ich würde mir die atoX(char*)-Funktion ja gerne selber schreiben, aber
>> ich weiß nicht genau wie, da ich die Darstellung einer long long sat
>> accum-Zahl nicht kenne.
>
> Im Zweifelsfalle frag mal Georg-Johann Lay danach, er hat die
> Implementierung ja beigesteuert.  Kann mir auch vorstellen, dass
> er schon Fragmente für sowas hat.

Vllt schaut er ja demnächst hier rein, sonst schreib ihn ihn mal an.

> Ansonsten würde sich die avr-libc natürlich freuen, wenn du uns eine
> Implementierung von strtofxhr() beitragen könntest. ;-)

Ich fände es auch cool, wenn ich an dem Projekt, zumindest in diesem 
begrenzten Rahmen, mitarbeiten könnte.
Ich schau mal was sich da machen lässt. Wenn ich eine Lösung finde, 
werde ich sie auf jeden Fall veröffentlichen, vllt kommt die ja dann in 
die avr-libc.

Zum Hintergrund:
Es geht immer noch um den Taschenrechner, den ich für meine 
Seminararbeit baue. Ich möchte dort Vergleiche zwischen der Genauigkeit 
von verschiedenen Zählen Formaten anstellen.
Zum Problem: Zeit:
Abgabe ist in 2 Wochen (alles außer diesem Punkt ist fertig, aber wenns 
zeitlich nicht mehr geht streich ich ihn komplett), d.h. wenn ich bis 
dahin keine Lösung habe, wird es unwahrscheinlicher, dass ich noch eine 
finde, weil ich keinen Nutzen mehr davon habe.

Aber ich schaue was sich machen lässt.

PS: wie performant muss eine Lösung sein? Oder reicht es, wenn der Zweck 
erfüllt wird
Persönliche Seite #4332608
Lesenswert?

Jörg W. schrieb:
> N. G. schrieb:
>> Ich würde mir die atoX(char*)-Funktion ja gerne selber schreiben, aber
>> ich weiß nicht genau wie, da ich die Darstellung einer long long sat
>> accum-Zahl nicht kenne.
> [...]
> Ansonsten würde sich die avr-libc natürlich freuen, wenn du uns eine
> Implementierung von strtofxhr() beitragen könntest. ;-)

Innerhalb der Toolchain wäre eine solche Implementierung nicht im 
eigentlichen Compiler, sondern in einer (Standard-)Bibliothek zu finden 
— hier wohl LibC (avr-libc).

Ab avr-gcc 5 gibt es in stdfix.h einen "Hook" für die avr-libc:
1
/* Hook in stuff from AVR-Libc.  */
2

3
#if (defined (__WITH_AVRLIBC__)                 \
4
     && defined (__has_include)                 \
5
     && __has_include (<stdfix-avrlibc.h>))
6
#include <stdfix-avrlibc.h>
7
#endif

__WITH_AVRLIBC__ ist aktiv außer configure wurde mit --with-avrlibc=no 
oder für RTEMS ausgeführt. __has_include gibt es ab 5.x, und falls ein 
Header <stdfix-avrlibc.h> existiert so wird dieser includiert.

Was genau in stdfix-avrlibc.h drinne steht ist dann Sache der avr-libc. 
Sinnig sind Prototypen, zu welchen es Implementierung(en) in der 
avr-libc gibt, was aber bis dato nicht der Fall ist IIRC.

Hauptproblem bei einer solchen Implementierung sind die printf/scanf 
Anteile, welche den erzeugten Code auch dann aufblasen, wenn 
printf/scanf ohne stdfix verwendet wird.  Das Problem ist ganz analog 
zur printf/scanf-Implementierung von float.

Falls ich noch irgendwelche Codefragmente hab, dann sind es fixed --> 
ASCII Routinen; ASCII --> fixed hab ich nie gebraucht...

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