Forum: Compiler & IDEs delay_us vs _delay_us?


von Sucher (Gast)


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

von Karl H. (kbuchegg)


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.

von Sucher (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Sucher (Gast)


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
..

von (prx) A. K. (prx)


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.

von Karl H. (kbuchegg)


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.

von Sucher (Gast)


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

von Karl H. (kbuchegg)


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.

von Sucher (Gast)


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 == ??

von Sucher (Gast)


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 (?))

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.