delay_us vs _delay_us?

Gast #1939301
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
Gast #1939358
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:
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?
#1939370
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.
Gast #1939373
Lesenswert?

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
..
#1939375
Lesenswert?

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.
Gast #1939411
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
#1939425
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 ....
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.
Gast #1939521
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 == ??

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