mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik datentypen c30 allgemein


Autor: hans dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich hab ein grundlegendes verständnisproblem bezüglich datentypen...
bisher dachte ich ein integer sei eine zahl, jetzt hab ich aber hier bei 
den artikeln zum thema ringbuffer folgendes gefunden:
uint8_t BufferOut(uint8_t *pByte)
{
  if (buffer.read == buffer.write)
    return FAIL;
  *pByte = buffer.data[buffer.read];
 
  buffer.read = buffer.read + 1;
  if (buffer.read >= BUFFER_SIZE)
    buffer.read = 0;
  return SUCCESS;
}

erstmal: was soll dieses uint8_t ding? ist doch so ne art int? (bisher 
keine grundlegenden infos darüber gefunden)

dann: SUCCESS oder FAIL sind doch keine zahlen?!

(ahh, irgendwie scheints so, als würden sich die datentypen in der µC 
programmierung ganz anders verhalten als in der pc-programmierung...)

und zu guterletzt: vllt kann mir eine(r) erklären warum diese bufferout 
funktion überhaupt nen rückgabewert vom typ uint8_t hat ... es werden 
doch nur 2 versch. werte zurückgegeben ... dann könnte man doch auch das 
da schreiben:
bit BufferOut(uint8_t *pByte)
{
  if (buffer.read == buffer.write)
    return 0;
  *pByte = buffer.data[buffer.read];
 
  buffer.read = buffer.read + 1;
  if (buffer.read >= BUFFER_SIZE)
    buffer.read = 0;
  return 1;
}

oder wenn man schon den uint8_t benutzt warum returnt man dann nicht den 
eingelesenen wert: (hier hab ich mir das mal zum eigenverständnis 
kommentiert)
uint8_t BufferOut() //änderung: parameter entfernt
{
  uint8_t pByte = FAIL; //dafür ne lokale variable für die rückgabe
  if (buffer.read == buffer.write) //puffer leer?
    return FAIL; //nichts zu lesen da, --> raus
  pByte = buffer.data[buffer.read]; //puffer war nicht leer --> juhu
 
  buffer.read = buffer.read + 1; //--> nächstes element zum lesen markieren
  if (buffer.read >= BUFFER_SIZE) // am ende?
    buffer.read = 0; //--> ring von vorne durchlaufen...
  return pByte; //hier hab ich was geändert, ginge das?
}

ich nehme an das ist nicht so effizient ... aber könnte ich so 
BufferOut() dafür verwenden das aktuellste element an z.b. UART zu 
schicken (z.b. mithilfe der beim c30 compiler enthaltenen uart.h)??
d.h. würde folgendes dann funktioniern:
void WriteUART1() // original war parameter "unsigned int data" drin
{
    if(U1MODEbits.PDSEL == 3)
        U1TXREG = BufferOut(); //hier stand statt bufferout data
    else
        U1TXREG = BufferOut() & 0xFF; //hier stand statt bufferout data
}

puh, bisschen viel text geworden ...
hoffe ihr könnt mir helfen. übrigens: ich kann das alles grade nicht 
selbst testen weil ich keine hardware da hab... brauch aber die infos 
weil ich utner zeitdruck steh ...

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

Bewertung
0 lesenswert
nicht lesenswert
hans dampf schrieb:

> ich hab ein grundlegendes verständnisproblem bezüglich datentypen...
> bisher dachte ich ein integer sei eine zahl, jetzt hab ich aber hier bei
> den artikeln zum thema ringbuffer folgendes gefunden:
>
>
> uint8_t BufferOut(uint8_t *pByte)
> {
>   if (buffer.read == buffer.write)
>     return FAIL;
>   *pByte = buffer.data[buffer.read];
> 
>   buffer.read = buffer.read + 1;
>   if (buffer.read >= BUFFER_SIZE)
>     buffer.read = 0;
>   return SUCCESS;
> }
>
> erstmal: was soll dieses uint8_t ding?


Das ist ein  unsigned integer mit 8 Bit.
Vulgo ein Byte oder in der alten C Schreibweise ein unsigned char.

> dann: SUCCESS oder FAIL sind doch keine zahlen?!

Doch.
#define SUCCESS 0
#define FAIL    1

findet sich irgendwo in .. ich glaube stdio.h. Kann aber auch stdlib.h 
sein.

> (ahh, irgendwie scheints so, als würden sich die datentypen in der µC
> programmierung ganz anders verhalten als in der pc-programmierung...)

Logisch.
Ein AVR ist ein 8 Bit Prozessor. Ein PC hat heutzutage mindestens 32 Bit

Für einen AVR ist der 'natürliche Datentyp' 8 Bit breit. Da C allerdings 
fordert, dass ein int mindestens 16 Bit hat, ist der natürliche Datentyp 
auf einem AVR 16 Bit breit.

AUf einem PC ist aber der 'natürliche Datentyp' 32 Bit breit. In AVR 
Einheiten wäre das ein long

(natürliche Datentyp: Der Datentyp mit dem sich die CPU am leichtesten 
tut. Der Datentyp, für den es im Befehlssatz der CPU eigene Befehle gibt 
oder kurz gesagt: Wenn mann einen stin normalen Add macht, wieviele Bits 
werden dann addiert)

> und zu guterletzt: vllt kann mir eine(r) erklären warum diese bufferout
> funktion überhaupt nen rückgabewert vom typ uint8_t hat ... es werden
> doch nur 2 versch. werte zurückgegeben ... dann könnte man doch auch das
> da schreiben:

Weil es in C keinen Datentyp für Bit gibt.
Die kleinste Einheit ist ein Byte, vulgo unsigned char, vulgo uint8_t

> oder wenn man schon den uint8_t benutzt warum returnt man dann nicht den
> eingelesenen wert: (hier hab ich mir das mal zum eigenverständnis
> kommentiert)

Könnte man auch machen.
Aber dann hat man keine Möglichkeit mehr eine Fehlersituation 
anzuzeigen.
Denn wenn ein Fehler passiert, dann möchte der Aufrufer das gerne 
wissen, damit er den vermeintlich empfangenen Wert eben nicht 
verarbeitet.

Autor: hans dampf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cool, habichverstanden!! dankeschön ... und jetz ab in die heia, is 
spät!

Autor: Uwe Hermann (uwehermann) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> hans dampf schrieb:
>

>> dann: SUCCESS oder FAIL sind doch keine zahlen?!
>
> Doch.
> #define SUCCESS 0
> #define FAIL    1
>
> findet sich irgendwo in .. ich glaube stdio.h. Kann aber auch stdlib.h
> sein.

Du meinst vermutlich EXIT_FAILURE und EXIT_SUCCESS aus stdlib.h, das 
sind aber andere #defines für einen (etwas) anderen Zweck. Diese beiden 
hier sind wohl lokal irgendwo im Quellcode definiert, vermute ich.

Uwe.

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.