Hallo Alle!
mein STM32f4 Discovery Board, auf dem mac os x 8.5 mit dem toolchain
arm-none-eabi-gcc habe ich ein kleines programm für testzwecke
geschrieben.
Nun habe ich gemerkt dass der controller gleitkommazahlen nicht rechnet.
aus irgendwelchen grund steht er fest.
volatile uint32_t testzahl1 = 0.1;
in main()
wenn ich testzahl1 = testzahl1 + 0.1; so inkrementieren lasse, macht er
nichts. wenn ich testzahl1++; so gebe geht ohne problem.
kann mir jemand bitte erklären wieso das ding so verhält. uint32_t steht
nur für festkommazahlen?
viele grüße!
willy
die"testzahl" ist als UNSIGNED INTEGER deklariert, und kann somit nur
werte von 0-65535 annehmen, und keine kommazahlen.
bei testzahl1++ wird diese um eins erhöht, und nciht um 0.1.
Jan
wie deklariere ich gleitkomma zahl in stm32f4?
wenn ich testzahl1 = testzahl1*0.1; gebe steht der controller fest.
macht gar nichts weiter. warum ist das so? sollte wenigstens testzahl
mit 0 multiplizieren oder?
lg
uint32_t ist ein unsigned integer, aber 32 bit (sowas?) und hat daher
den Bereich 0-4294967295, und zwar nur Ganzzahlen. Gleitkommazahlen
werden wie immer in C mit "float" oder "double" verwendet. Das steht in
jedem C-Buch, Bitte erst ein solches lesen und dann nochmal versuchen,
sonst wird das gar nichts.
koenig willy schrieb:> wenn ich testzahl1 = testzahl1*0.1; gebe steht der controller fest.
Außerdem "steht" der Controller nicht, er führt nur diese eine Rechnung
nicht so aus wie du denkst. Damit er wirklich stehen bleibt bzw.
abstürzt musst du schon andere Dinge tun als Multiplikationen...
koenig willy schrieb:> Hallo Dr. Sommer,>> doch der controller steht fest.
Unwahrscheinlich. Eine Integer-Multiplikation kann einen Cortex-M4F
nicht zum Absturz bringen. Eher blinken deine LED's so schnell dass du
es nicht siehst, oder du bedienst den Debugger falsch. Aber wie gesagt,
lies ein C-Buch.
Dr. Sommer schrieb:> koenig willy schrieb:>> Hallo Dr. Sommer,>>>> doch der controller steht fest.> Unwahrscheinlich. Eine Integer-Multiplikation kann einen Cortex-M4F> nicht zum Absturz bringen. Eher blinken deine LED's so schnell dass du> es nicht siehst, oder du bedienst den Debugger falsch.>Aber wie gesagt,> lies ein C-Buch.
1
2
t1=(uint32_t)datas/0.3;
ohne diese Berechnung blinken alle LEDs. USART printf alles
funktioniert.
Dr. Sommer schrieb:> koenig willy schrieb:>> ohne diese Berechnung blinken alle LEDs. USART printf alles>> funktioniert.> Lies ein C-Buch. Und ARM GCC: FPU der Cortex-M4F nutzen.
danke für die zahlreiche vorschläge.
FPU ist schon eingeschaltet. system_stm32f4xx.c ist schon implementiert.
das ist auf keinen fall der grund warum der controller weiter nichts
macht.
koenig willy schrieb:> das ist auf keinen fall der grund warum der controller weiter nichts> macht.
Der Grund ist dass du scheinbar nicht weißt was Datentypen, Integer und
Floats sind. Lies ein C-Buch, ohne wirst du niemals etwas hinbekommen.
Danach siehst du direkt was falsch ist und wie es richtig geht.
Dr. Sommer schrieb:> koenig willy schrieb:>> das ist auf keinen fall der grund warum der controller weiter nichts>> macht.> Der Grund ist dass du scheinbar nicht weißt was Datentypen, Integer und> Floats sind. Lies ein C-Buch, ohne wirst du niemals etwas hinbekommen.> Danach siehst du direkt was falsch ist und wie es richtig geht.
ja danke nochmal. ich hab grad ein buch über datentypen gelesen.
jetzt zufrieden? dann tschüß
koenig willy schrieb:> ich hab grad ein buch über datentypen gelesen.>> jetzt zufrieden? dann tschüß
Dann hast du dein Problem ja gefunden und alles ist gut; tschüss.
Dr. Sommer schrieb:> koenig willy schrieb:>> ich hab grad ein buch über datentypen gelesen.>>>> jetzt zufrieden? dann tschüß> Dann hast du dein Problem ja gefunden und alles ist gut; tschüss.
so ein ideot.
Dr. Sommer schrieb:> koenig willy schrieb:>> so ein ideot.> Sagt der Beratungs & Lern-Resistente.
so ein klugscheißer und wandele bitte NICHT den forum zu müll.
wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf.
nur diesen berühmten satz
"Lies ein C-Buch"
koenig willy schrieb:> o ein klugscheißer und wandele bitte NICHT den forum zu müll.
Oder du müllst das Forum mit einer Frage zu die jeder, der auch nur ein
bisschen C kann, beantworten könnte.
> wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf.> nur diesen berühmten satz> "Lies ein C-Buch"
Das ist auch das einzig angebrachte bei dir. Ich könnte dir jetzt alles
über Datentypen, integer, floats und casting erklären, aber wozu, denn
das ist - wer hätte es gedacht - in jedem C-Buch erklärt. Dort kannst du
es ebensogut nachlesen. Niemand hat Lust das gleiche immer und immer
wieder den Anfängern zu erklären die sich zu fein sind es selber aus
einem Buch herauszusuchen. Ein gewisses Mindestmaß an Eigeninitiative
kann man von einem werdenden Programmierer erwarten, und ein
Einsteigerbuch zu lesen fällt definitiv darunter. So lernst du am
shcnellsten und besten wie es richtig geht und musst nicht für jedes
kleine Problem dumme Fragen stellen.
Dr. Sommer schrieb:> koenig willy schrieb:>> o ein klugscheißer und wandele bitte NICHT den forum zu müll.> Oder du müllst das Forum mit einer Frage zu die jeder, der auch nur ein> bisschen C kann, beantworten könnte.>> wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf.>> nur diesen berühmten satz>> "Lies ein C-Buch"> Das ist auch das einzig angebrachte bei dir. Ich könnte dir jetzt alles> über Datentypen, integer, floats und casting erklären, aber wozu, denn> das ist - wer hätte es gedacht - in jedem C-Buch erklärt. Dort kannst du> es ebensogut nachlesen. Niemand hat Lust das gleiche immer und immer> wieder den Anfängern zu erklären die sich zu fein sind es selber aus> einem Buch herauszusuchen. Ein gewisses Mindestmaß an Eigeninitiative> kann man von einem werdenden Programmierer erwarten, und ein> Einsteigerbuch zu lesen fällt definitiv darunter. So lernst du am> shcnellsten und besten wie es richtig geht und musst nicht für jedes> kleine Problem dumme Fragen stellen.
jajaja. Herr selbsternannter Doktor!
jetzt hör mal endlich auf. Ich bitte dich jetzt nicht hier irgendwas zu
posten.
koenig willy schrieb:> t1 = (uint32_t)datas/0.3;>> ohne diese Berechnung blinken alle LEDs. USART printf alles> funktioniert
UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.
Matthias schrieb:> koenig willy schrieb:>> t1 = (uint32_t)datas/0.3;>>>> ohne diese Berechnung blinken alle LEDs. USART printf alles>> funktioniert>> UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.
danke Matthias für die Antwort.
mir ist das jetzt klar. danke nochmal
kaiser willy schrieb:> koenig willy schrieb:>> schnell den name ändern for vote xD und schön anonym bleiben.>> Heute frisch angemeldet und schon dicke Backe. Das ist Rekord!
danke dass du es anmerkst. weiter so!
koenig willy schrieb:> Matthias schrieb:>> koenig willy schrieb:>>> t1 = (uint32_t)datas/0.3;>>>>>> ohne diese Berechnung blinken alle LEDs. USART printf alles>>> funktioniert>>>> UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.>> danke Matthias für die Antwort.>> mir ist das jetzt klar. danke nochmal
Echt?
Mir nicht.
Insbesonders wo da eine Division durch 0 sein soll.
Karl Heinz Buchegger schrieb:> koenig willy schrieb:>> Matthias schrieb:>>> koenig willy schrieb:>>>> t1 = (uint32_t)datas/0.3;>>>>>>>> ohne diese Berechnung blinken alle LEDs. USART printf alles>>>> funktioniert>>>>>> UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.>>>> danke Matthias für die Antwort.>>>> mir ist das jetzt klar. danke nochmal>> Echt?> Mir nicht.> Insbesonders wo da eine Division durch 0 sein soll.
das Problem war , dass ich nicht wusste dass es ein fertiges lib für
floating point unit gibt.
von allen sry ,wenn ich noob fragen gestellt habe.
ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für
32bit rechner stm32 so eine gleitkommazahlen double float mantisse
exponenten rumbastelt.
schön dass man float double einfach nehmen kann.
1
uint32_tt1,datas;
2
t1=(uint32_t)datas/0.3;// war falsch.
3
t1=(uint32_t)datas/(uint32)0.3;// war richtig controller rechnet ohne problem
bei allen müsste ich so einen cast operator immer benutzen muss.
gewöhnungsbedürftig.
koenig willy schrieb:> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne> problem
So? Was rechnet er denn da aus? Bei mir kommt da eine Division durch 0
raus.
Denn (uint32)0.3 ergibt 0.
koenig willy schrieb:> das Problem war , dass ich nicht wusste dass es ein fertiges lib für> floating point unit gibt.
Du brauchst keien Lib. Die FPU macht das. Du musst nur den float
Datentyp verwenden.
koenig willy schrieb:> ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für> 32bit rechner stm32 so eine gleitkommazahlen double float mantisse> exponenten rumbastelt.
Was? Nochmal auf Deutsch. Oder Englisch. Integer sind Ganzzahlen, für
Gleitkommazahlen musst du die Variable als float oder double
deklarieren:
1
floatx=0.1;x=x*0.3;
koenig willy schrieb:> uint32_t t1 , datas;
Also deklarierst du als Integer.
> t1 = (uint32_t)datas/0.3; // war falsch.
Du castest einen Integer in einen Integer und teilst durch einen Float?
Diese Zeile ist äquivalent zu
t1 = datas/0;
> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne> problem
Diese Zeile ist immer noch sinnlos, du convertierst immer noch einen
Integer in einen Integer (machst also gar nichts) und teilst durch 0.
Hättest du ein C-Buch gelesen wüsstest du dass die casts sinnlos sind
und dass hier durch 0 geteilt wird. Aber zum Lesen bist du dir ja zu
fein.
koenig willy schrieb:>>> mir ist das jetzt klar. danke nochmal>>>> Echt?>> Mir nicht.>> Insbesonders wo da eine Division durch 0 sein soll.>> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne
Gratuliere.
Jetzt HAST du eine Division durch 0 draus gemacht.
Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von
1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir
fehlts echt weit), hat noch niemand eine Programmierprache, geschweige
denn C gelernt.
Macht Spass den Thread zu lesen :-)
Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal
ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier
jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene
Leute.
koenig willy schrieb:> das Problem war , dass ich nicht wusste dass es ein fertiges lib für> floating point unit gibt.
wer lesen und recherchieren kann, ist klar im Vorteil...
koenig willy schrieb:> ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für> 32bit rechner stm32 so eine gleitkommazahlen double float mantisse> exponenten rumbastelt.
Glauben und Wissen sind zwei Paar Schuhe. Erst Doku lesen und verstehen,
dann "denken". Ausser du bist Informatiker. In diesem Fall spare dir
lieber den Aufwand, denn das mit der hardwarenahen Programmierung wird
nichts. Bei deiner Einstellung ganz sicher.
koenig willy schrieb:> bei allen müsste ich so einen cast operator immer benutzen muss.> gewöhnungsbedürftig.
Schreibfaul auch noch? Na dann Prost...
an Dr. Sommer
Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus
china. reicht das nicht wenn ich in solcher de-sprachstufe schreibe?
musst du noch schreiben
"LIES ein DEUTSCH BUCH"
Helmut Lenzen schrieb:> koenig willy schrieb:>> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne>> problem>> So? Was rechnet er denn da aus? Bei mir kommt da eine Division durch 0> raus.> Denn (uint32)0.3 ergibt 0.
das war nur dummes beispiel. rein mathematisch sollte unendlich
resultieren. wollte nur diesen cast operator deuten.
koenig willy schrieb:> an Dr. Sommer> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus> china.
Achso. Das war nicht offensichtlich. Und dann fragt man in einem
deutschen Forum? Okay.
> reicht das nicht wenn ich in solcher de-sprachstufe schreibe?
Es ist gelegentlich schwer verständlich. Wenn du englisch besser kannst
wäre das einfacher...
koenig willy schrieb:> das war nur dummes beispiel. rein mathematisch sollte unendlich> resultieren. wollte nur diesen cast operator deuten.
Integer können aber in C kein "unendlich" darstellen, floats schon - da
du aber deine Variablen als Integer deklarierst kommt da irgend ein
Unsinn an. Dein cast Operator bewirkt wie gesagt überhaupt nichts, da du
einen Integer in einen Integer castest, also gar nichts tust.
Dennis schrieb:> Macht Spass den Thread zu lesen :-)>> Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal> ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier> jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene
alle machen doch fehler. lasst diese ober lehrer-nummer.
Dr. Sommer schrieb:> willy schrieb:>> an Dr. Sommer>> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus>> china.> Achso. Das war nicht offensichtlich. Und dann fragt man in einem> deutschen Forum? Okay.
es ist verdammt ein schönes forum. leider gibt es haufen unfreundliche
typen die voll genervt sind.
>> reicht das nicht wenn ich in solcher de-sprachstufe schreibe?> Es ist gelegentlich schwer verständlich. Wenn du englisch besser kannst> wäre das einfacher...
jaja, was ich hier in deutscher sprache geschrieben habe verstehen alle
1000%
viele haben problemen mit fehlende buchstaben kommas. einfach
unglaublich.
> koenig willy schrieb:>> das war nur dummes beispiel. rein mathematisch sollte unendlich>> resultieren. wollte nur diesen cast operator deuten.> Integer können aber in C kein "unendlich" darstellen, floats schon - da> du aber deine Variablen als Integer deklarierst kommt da irgend ein> Unsinn an. Dein cast Operator bewirkt wie gesagt überhaupt nichts, da du> einen Integer in einen Integer castest, also gar nichts tust.
Unsinn
>>t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet>> ohne problem
Richtig
>Denn (uint32)0.3 ergibt 0.
Ich weiß dass es als unhöflich angesehen wird auf eine C-Referenz zu
verweisen, aber das obige Problem ist sowohl Grundlagenwissen, als auch
nicht, in einem kurzen Statement, zu erklären.
koenig willy schrieb:> Dennis schrieb:>> Macht Spass den Thread zu lesen :-)>>>> Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal>> ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier>> jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene>> alle machen doch fehler. lasst diese ober lehrer-nummer.
Ich glaub du hast den Unterschied zwischen fload und integer immer noch
nich verstanden.
alle machen maln Fehler sind aber nicht so Lernresistend wie du dich
hier zum Besten gibst.
Das wollt ich nur mal loswerden.
Zeuss schrieb:> koenig willy schrieb:>> Dennis schrieb:>>> Macht Spass den Thread zu lesen :-)>>>>>> Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal>>> ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier>>> jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene>>>>>> alle machen doch fehler. lasst diese ober lehrer-nummer.>> Ich glaub du hast den Unterschied zwischen fload und integer immer noch> nich verstanden.> alle machen maln Fehler sind aber nicht so Lernresistend wie du dich> hier zum Besten gibst.> Das wollt ich nur mal loswerden.
bin nicht informatiker und bin aus dem bereich elektrotechnik.
Kann mir kaum vorstellen wie du in elektrotechnik resistent bist.
Du solltesr schon zwischen den einzelnen Datentypen unterscheiden können
.
Ich bin kein Informatiker .
Am besten wir lassen Dich das mal machen und dann schauste mal wie weit
du mit deiner ÜBERHEBLICHEN ART KOMMST!!!
Karl Heinz Buchegger schrieb:> Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von> 1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir> fehlts echt weit), hat noch niemand eine Programmierprache, geschweige> denn C gelernt.
ich bin nicht informatiker bin aus e-technik bereich.
nur weil du halbwegs guten informatik wissen besitzt bist noch lange
nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker
die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln
kann. so eine bist du evtl.
Zeuss schrieb:> Du solltesr schon zwischen den einzelnen Datentypen unterscheiden können> Ich bin kein Informatiker .>> Am besten wir lassen Dich das mal machen und dann schauste mal wie weit> du mit deiner ÜBERHEBLICHEN ART KOMMST!!!
Unglaublich wie die Nachkommen von großer DEUTSCHER Nation in Kürze Zeit
aussehen werden. So arrogant, wird dich nicht weit bringen.
koenig willy schrieb:> Karl Heinz Buchegger schrieb:>>> Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von>> 1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir>> fehlts echt weit), hat noch niemand eine Programmierprache, geschweige>> denn C gelernt.>> ich bin nicht informatiker bin aus e-technik bereich.
Das ist mir ehrlich gesagt völlig egal.
Wer programmieren will, muss sein Werkzeug (die Programmiersprache)
beherrschen. Amateure ein bisschen weniger, Profis vollständig.
> nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker> die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln> kann. so eine bist du evtl.
Stell dir vor. Ich bin Informatiker. Und ich habe mit den von dir
genannten Problemen auf Amateurebene keine Probleme.
Um das ins rechte Licht zu rücken, da du ja Elektrotechniker bist. Deine
Frage läuft letzten Endes darauf hinaus, an welchem Ende man einen
Lötkolben anfassen muss. Datentypen und wie sie sich in Variablen bzw.
arithmetischen Ausdrücken auswirken, sind das um und auf aller
typisierten Sprachen. Und das sind heutzutage, ich würde mal schätzen,
mehr als 80% aller Programmiersprachen.
Wir reden auch nicht von einem besonders schwierigem Themenkreis. Nein,
wir reden von absoluten Grundlagen. Sozusagen: erste Kurseinheit, erste
Stunde.
> nur weil du halbwegs guten informatik wissen besitzt
Komm, lass gut sein. Zum Informatiker fehlen dann ab diesem Basiswissen
noch einmal mindestens 4 bis 5 Jahre, in denen es um Algorithmen und
Grundtechniken geht. Wer in einer Programmiersprache ein wenig
Radebrechten kann, ist noch lange kein Informatiker.
Nur weil jemand ein Heftpflaster richtig rum aufkleben kann, ist er noch
lange kein Herzchirurg.
koenig willy schrieb:> nur weil du halbwegs guten informatik wissen besitzt bist noch lange> nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker> die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln> kann. so eine bist du evtl.
Täusch dich nicht in Karl-Heinz. Der kann einen Spannungsteiler
berechnen und einen Motortreiber bauen.
Die meisten E-Techniker koennen programieren und wissen was ein
float/double Datentype ist und was ein Integer. Die uC Programmierung
ist eher eine Domaene der E-Techniker als der Informatiker.
> Die meisten E-Techniker koennen programieren und wissen was ein> float/double Datentype ist und was ein Integer.
nochmal , float double kenne ich. ich wusste halt nicht ob dies schon
für stm32 als lib implementiert ist.
einfach hochskrollen und lesen.
In der Zeit, in der du die ganzen unnötigen Posts hier geschrieben hast,
hättest du schon die ersten beiden Kapitel vom Kernigham Ritchie
durcharbeiten können.
koenig willy schrieb:> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon> für stm32 als lib implementiert ist.> einfach hochskrollen und lesen.
Was meinst du wozu das F in der Typenbezeichnung steht?
Und wenn du float/double schon kennst warum benutzt du es da nicht von
Anfang an? Bevor du hier so eine Frage gestellt hast, haetest du das
schon vorher mal ausprobieren koennen. Einfach die Typen durch float
ersetzt und einmal Compiler aufgerufen und schaun was rauskommt.
Helmut Lenzen schrieb:> koenig willy schrieb:>> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon>> für stm32 als lib implementiert ist.>> einfach hochskrollen und lesen.>> Was meinst du wozu das F in der Typenbezeichnung steht?> Und wenn du float/double schon kennst warum benutzt du es da nicht von> Anfang an? Bevor du hier so eine Frage gestellt hast, haetest du das> schon vorher mal ausprobieren koennen. Einfach die Typen durch float> ersetzt und einmal Compiler aufgerufen und schaun was rauskommt.
es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich
zumindest.
die datentypen sind für stm32 schon extra definiert in einem extra
library. richtig?
float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .
evtl wie die anderen datentypen uint32_float so was in der art.
die sache habe ich kapiert.
wegen meiner missvertändnis will ich nicht weiter beleidigt werden.
koenig willy schrieb:>> Die meisten E-Techniker koennen programieren und wissen was ein>> float/double Datentype ist und was ein Integer.> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon> für stm32 als lib implementiert ist.> einfach hochskrollen und lesen.
Nein das Problem ist, das du das Problem nicht verstehst. Das hat nichts
mit dem STM32 zu tun oder irgendeiner lib. Das ist C!
Zum Beweis am PC:
1
#include<stdio.h>
2
#include<stdint.h>
3
4
intmain(void)
5
{
6
uint32_tzahl=2/(uint32_t)0.3;
7
printf("%u",zahl);
8
9
return0;
10
}
Beim Kompilieren wird dich der Kompiler schon wegen einer Division durch
Null warnen. Wenn du das Programm startest stürzt es ab.
Nochmal uint32_t = Integer = Ganzzahl, keine Kommazahl!
Richtig ist:
koenig willy schrieb:> die datentypen sind für stm32 schon extra definiert in einem extra> library. richtig?
float,double,int,char,long sind in keiner Libray definiert. Die
gehoeren zum Standardsprachumfang von C. Die muesten fast auf jedem C
Compiler funktionieren (fast deshalb weil es auch C-Compiler gibt die
kein Fliesskomma koennen, der GCC kann aber Fliesskomma).
koenig willy schrieb:> float double sind in gcc für 64 bit prozessor ausgelegt
float ist auf dem Stm32 nur fuer 32Bits IEEE Format ausgelegt
Hardwaremaessig.
koenig willy schrieb:> es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich> zumindest.
Genauer ist es ein STM32F4 welcher ein Cortex-M4F ist welcher aus der
ARMv7M-Familie ist.
koenig willy schrieb:> die datentypen sind für stm32 schon extra definiert in einem extra> library. richtig?
Nein. Der Compiler, hier ARM-GCC, implementiert die Basisdatentypen wie
uint32_t und float direkt, dazu brauchts keine Library.
koenig willy schrieb:> float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .
float ist "fast immer" eine 32bit-Floatingpoint Zahl, double 64bit
(zumindest per Standard IEEE 754). Beim ARM-GCC ist das auch so.
koenig willy schrieb:> wegen meiner missvertändnis will ich nicht weiter beleidigt werden.
Deswegen tut das auch keiner. Das ist wegen deiner Weigerung die
absoluten Grundlagen zu lernen. Wenn ich einen Motortreiber bauen will
nerve ich auch keine ETechniker wie das ohmsche Gesetz geht, welche
Anschlüsse ein Transistor hat und wo man einen Lötkolben anfasst, das
kann ich in jedem Grundlagenbuch selber nachlesen.
Dr. Sommer schrieb:> koenig willy schrieb:>> es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich>> zumindest.> Genauer ist es ein STM32F4 welcher ein Cortex-M4F ist welcher aus der> ARMv7M-Familie ist.>> koenig willy schrieb:>> die datentypen sind für stm32 schon extra definiert in einem extra>> library. richtig?> Nein. Der Compiler, hier ARM-GCC, implementiert die Basisdatentypen wie> uint32_t und float direkt, dazu brauchts keine Library.>> koenig willy schrieb:>> float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .> float ist "fast immer" eine 32bit-Floatingpoint Zahl, double 64bit> (zumindest per Standard IEEE 754). Beim ARM-GCC ist das auch so.>> koenig willy schrieb:>> wegen meiner missvertändnis will ich nicht weiter beleidigt werden.> Deswegen tut das auch keiner. Das ist wegen deiner Weigerung die> absoluten Grundlagen zu lernen. Wenn ich einen Motortreiber bauen will> nerve ich auch keine ETechniker wie das ohmsche Gesetz geht, welche> Anschlüsse ein Transistor hat und wo man einen Lötkolben anfasst, das> kann ich in jedem Grundlagenbuch selber nachlesen.
so wäre es viel freundlich. super schöne erste post von dir. und nicht
ausrasten.
ich will nicht dass ich über deutschen schlecht rede.
an allen alles gute. ich werde nicht weiter so noob fragen stellen.
koenig willy schrieb:> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus> china. reicht das nicht wenn ich in solcher de-sprachstufe schreibe?
Wer in einem deutschen Forum in Deutsch schreibt, der wird automatisch
mit deutschem Umgang konfrontiert. Und der ist erheblich direkter als in
vielen anderen Kulturen, was Nichtdeutsche oft irritiert.
(a) Bin ich nicht angemeldet und schreibe immer als "dieser" Gast hier.
(b) Habe ich das dumpfe Gefühl, dass du einfach nur ein Troll bist.
Alternativ komplett unfähig. Such dir ein neues Betätigungsfeld.
Moin,
find das alles eher lustig, hab ich im 3 oder 4 Post nicht geschrieben
er soll sich mal "float" ansehen? Auf double bin ich nicht mehr
gekommen, aber egal.
Nun sind es glaub ich 60 Posts und der TO (chinesisch oder nicht) hat
das immernoch nicht umgesetzt und andere haben schon ein paar Zeilen mit
float als Variablentypzuweisung geschrieben.
Naja, was soll's!
Da müssen wir dann aber nich drüber herfallen...einfach auslaufen
lassen!
Gruß
dat
Beast
Hallo koenig willy
tausche
t1 = (uint32_t)datas/0.3;
gegen
t1 = ((uint32_t)datas * 10) / 3;
und schreibe, was da passiert.
don't mix double, float and int
Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne
Punkt.
Karl schrieb:> Und die schöne FPU?
Die ruht sich aus und laest es sich gut gehen.
unbekannter ARM-User schrieb im Beitrag #3369841:
> Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne> Punkt.
Warum? Dafuer hat der STM32F4 doch eine Gleitkommaunit auf dem Chip.
Fuer nicht Gebrauch gibt es kein Geld zurueck. Immer dieser Zuckreflex
wenn es um Fliesskomma geht.
Helmut Lenzen schrieb:> unbekannter ARM-User schrieb im Beitrag #3369841:>> Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne>> Punkt.>> Warum? Dafuer hat der STM32F4 doch eine Gleitkommaunit auf dem Chip.> Fuer nicht Gebrauch gibt es kein Geld zurueck. Immer dieser Zuckreflex> wenn es um Fliesskomma geht.
Weil eine Integerberechnung deutlich schneller läuft und keine Probleme
mit Rundungen hat.
Die Fließkommaunit setzt man nur ein, wenn es absolut unumgänglich ist.
Frank
Frank schrieb:> Weil eine Integerberechnung deutlich schneller läuft und keine Probleme> mit Rundungen hat.
Die Fliesskommaeinheit vom Cortex ist bei Additionen und Multiplikation
genauso schnell wie die Integereinheit. Aber wenn das eine Rolle spielen
sollte haette man sowieso die falsche CPU ausgewaehlt. Normalerweise
schaut die doch sowieso die meiste Zeit am Tag zum Fenster raus.
Helmut Lenzen schrieb:> Aber wenn das eine Rolle spielen> sollte haette man sowieso die falsche CPU ausgewaehlt. Normalerweise> schaut die doch sowieso die meiste Zeit am Tag zum Fenster raus.
Wenn die CPU den ganzen Tag zum Fenster raus schaut, dann ist die total
unterfordert, also auch falsche CPU ausgewählt :-)
Frank schrieb:> Weil eine Integerberechnung deutlich schneller läuft
Bei CPUs mit FPU ist das ist der Stand von vor gut 2 Jahrzehnten. Heute
ist das in dieser Allgemeinheit nicht mehr zutreffend.
> und keine Probleme mit Rundungen hat.
Solange die Mantisse lang genug ist gibts keinen Grund für Rundung.
Ausser bei der Division. Und bei der hängt es von der Art der Berechnung
ab, welche Rundung sinnvoller ist.
Ein namhafter Hersteller von Automobilen den ich zufällig kenne sieht
das ungefähr so: "float" bringt Performance (weniger Skalierungen,
Prüfungen auf Überläufe etc.) und kostet Speicher. Insbesondere bei
Kennfeldern ist letzteres deutlich zu merken. CPU ist Tricore oder PPC.
Außerdem ist das Ergebnis schneller brauchbar, weil die vielen
Umrechnungen wegfallen und die SW-Entwickler weniger Fehler machen
können.
(Und jetz komm' mir keiner mit sauberem Design und Schnittstellen und so
einem "Kram", der bei gewachsenen Projekten immer Potenzial hat)
Allerdings reden wir hier auch von "Programmen" mit mehreren
Mannjahrzehnten Umfang. Wer als Hobbyist unterwegs ist und beim STM32F4
an eine Grenze stößt, macht evtl. was falsch.