delay_us vs _delay_us?

Gast #1939301
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
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?
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
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:
> 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
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.
Gast
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 == ??
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.