mikrocontroller.net

Forum: Compiler & IDEs delay_us vs _delay_us?


Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void DS18X20_uart_put_temp(const uint8_t subzero, 
  const uint8_t cel,   const uint8_t cel_frac_bits)
{
  uint8_t buffer[sizeof(int)*8+1];
  int i;
  
  uart_putc((subzero)?'-':'+');
  uart_puti((int)cel);
  uart_puts_P(".");
  itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10);
  for (i=0;i<4-strlen(buffer);i++) uart_puts_P("0");
  uart_puts(buffer);
  uart_puts_P("°C");
}

Das Programm läuft, da ich aber am Lernen bin möchte ich die Warnungen 
beseitigen. Die Frage ist aber wie?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uart_puts erwartet einen "char *" (= "signed char *" )und kriegt einen 
"unsigned char *". Sind zwei Paar Stiefel, daher die Warnung.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Thanks, so sind die Warnungen weg...
...
  itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10);
  for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0");
  uart_puts((char*)buffer);
..

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sucher schrieb:
> Hallo
>
> Thanks, so sind die Warnungen weg...
>
>
> ...
>   itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10);
>   for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0");
>   uart_puts((char*)buffer);
> ..
> 

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.

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ....
   itoa((int)(cel_frac_bits*DS18X20_FRACCONV),(char*)buffer,10);
   for (i=0;i<4-(strlen((char*)buffer));i++) uart_puts_P("0");
   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.

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 == ??

Autor: Sucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 (?))

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.