Hallo ich habe ein Programm da wird delay_us(..) verwendet. Das Programm ist auch übersetzbar. In der LIBC findet man aber nur _delay_us also mit führendem Unterstrich. Für die anderen deley_xx Finktionen gilt entsprechendes. Was ist da der Unterschied und wo findet man da Infos darüber? MfG Achim
Sucher schrieb: > ich habe ein Programm da wird delay_us(..) verwendet. Das Programm ist > auch übersetzbar. Geh mal den restlichen Code in deinem Programm durch. Da wird sich wohl jemand seine eigene Funktion delay_us (also ohne Unterstrich) gebaut haben.
Hallo ok, vielen Dank. Ich habs gefunden. Ist im Zusammenhang mit dem Temperatursensor DS18S20. Da sind eigen Delays, da sie wohl genauer sind... Sorry, ich lerne gerade den Umgang mit GCC. Da eine GCC Experte antwortet noch eine Problemfrage von mir. Da kommen beim Übersetzen Warnungen wie zB.: ds18x20.c: In function 'DS18X20_uart_put_temp': ds18x20.c:38: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness ds18x20.c:39: warning: pointer targets in passing argument 1 of 'uart_puts' differ in signedness was sagt mir das? Der entsprechende Code:
1 | void DS18X20_uart_put_temp(const uint8_t subzero, |
2 | const uint8_t cel, const uint8_t cel_frac_bits) |
3 | {
|
4 | uint8_t buffer[sizeof(int)*8+1]; |
5 | int i; |
6 | |
7 | uart_putc((subzero)?'-':'+'); |
8 | uart_puti((int)cel); |
9 | uart_puts_P("."); |
10 | itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10); |
11 | for (i=0;i<4-strlen(buffer);i++) uart_puts_P("0"); |
12 | uart_puts(buffer); |
13 | uart_puts_P("°C"); |
14 | }
|
Das Programm läuft, da ich aber am Lernen bin möchte ich die Warnungen beseitigen. Die Frage ist aber wie?
uart_puts erwartet einen "char *" (= "signed char *" )und kriegt einen "unsigned char *". Sind zwei Paar Stiefel, daher die Warnung.
Sucher schrieb: > Das Programm läuft, da ich aber am Lernen bin möchte ich die Warnungen > beseitigen. Die Frage ist aber wie? A.K. hat die technische Ursache ja schon angesprochen. Du sollst für dich mitnehmen: Genauso wie es falsch ist, für ein Byte einfach einen char zu benutzen, genauso falsch ist es für Strings (oder EInzelzeichen zb ASCIi Zeichen) einfach uint8_t zu benutzen. Du sollst dir angewöhnen (gilt auch für Arrays) char für alles was mit Texten und Textverarbeitung im weitesten Sinne zu tun hat. int8_t immer dann, wenn du einen kleinen Integer brauchst der ein Vorzeichen haben soll und du mit einem Werte- bereich -128 bis +127 auskommst uint8_t so wie int8_t nur ohne Vorzeichen. Prominentestes Beispiel: immer dann wenn du ein Byte brauchst. 8 Bit sind nicht einfach nur 8 Bit in einer Speicherzelle. Die haben auch einen Datentyp. Und welcher Datentyp angemessen ist, entscheidet die Verwendung dieses 8-Bit Konglomerates.
Hallo Thanks, so sind die Warnungen weg...
1 | ...
|
2 | itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10); |
3 | for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0"); |
4 | uart_puts((char*)buffer); |
5 | ..
|
Sucher schrieb: > Thanks, so sind die Warnungen weg... Das schon. Aber das Zeugs dreimal zu casten statt einmal richtig zu deklarieren (char buffer[]) ist definitiv der verkehrte Weg.
Sucher schrieb: > Hallo > > Thanks, so sind die Warnungen weg... > >
1 | > ... |
2 | > itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10); |
3 | > for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0"); |
4 | > uart_puts((char*)buffer); |
5 | > .. |
6 | >
|
Aus der Tatsache, dass du hier ständig casten musst, solltest du die Überlegung ableiten, ob du nicht für buffer den falschen Datentyp gewählt hast. Casts sind Waffen! Wenn geht, dann immer nach einer Lösung suchen, bei der man nicht casten muss.
Hallo nur zu eurem Verständnis. Der Code stammt nicht von mir. Es ist eine Abfrage von DS18S20 Sensoren und den Code habe ich "gefunden". Die Abfrage der Sensoren klappt super. Jetzt möchte ich den Code verstehen und auf meine Erfordernisse abändern. Ich werde versuchen die casts zu umgehen in dem ich die Tipps von euch versuche umzusetzen. Vielen Dank Achim
Sucher schrieb: > Hallo > > nur zu eurem Verständnis. Der Code stammt nicht von mir. Es ist eine > Abfrage von DS18S20 Sensoren und den Code habe ich "gefunden". Ist ja ok. Es geht ja im eigentlichen Sinne nicht darum die Sensoren abzufragen. An dieser Stelle hier ....
1 | itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10); |
2 | for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0"); |
3 | uart_puts((char*)buffer); |
... das ist reine Textverarbeitung um mit den Sensorwerten, die du schon hast, eine Ausgabe hinzuzaubern. Über die Qualität dieser Ausgabe-Programmierung kann man geteilter Meinung sein. Aber das ist hier auch nicht das Thema an sich.
Hallo >Über die Qualität dieser Ausgabe-Programmierung kann man geteilter >Meinung sein. Aber das ist hier auch nicht das Thema an sich. gib mir bitte einen Tipp (Stichwort) wie man das besser (richtig?) macht. Übrigens die casts habe ich raus so wie vorgeschlagen (es läuft immer noch!) Ein grosses Thema ist auch die Speicherbelegung in den einzelnen Threads. Wo findet man näheres über Flash/Ram Belegung. Irgendwann habe ich da mal eine % Angabe der Belegung gesehen und finde das nicht mehr wie das unter Windows geht (Zusatstool?) .text == Flash ? .data == ?? .bss == ??
Ergänzung: Wie kann man in einem unbekannten Programm finden welche Variablen in .data liegen. Das sind doch initialisierte variablen und werden dann in den RAM geladen oder? (. RAM =.bss (?))
Sucher schrieb: > gib mir bitte einen Tipp (Stichwort) wie man das besser (richtig?) > macht. Du brauchst dir nur die Operationen ansehen, die zu machen sind bzw gemachat werden. Insbesondere das hier for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0"); noch langsamer und umständlicher gehts ja wohl kaum mehr.
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.