Forum: Mikrocontroller und Digitale Elektronik datentypen c30 allgemein


von hans dampf (Gast)


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:
1
uint8_t BufferOut(uint8_t *pByte)
2
{
3
  if (buffer.read == buffer.write)
4
    return FAIL;
5
  *pByte = buffer.data[buffer.read];
6
 
7
  buffer.read = buffer.read + 1;
8
  if (buffer.read >= BUFFER_SIZE)
9
    buffer.read = 0;
10
  return SUCCESS;
11
}

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:
1
bit BufferOut(uint8_t *pByte)
2
{
3
  if (buffer.read == buffer.write)
4
    return 0;
5
  *pByte = buffer.data[buffer.read];
6
 
7
  buffer.read = buffer.read + 1;
8
  if (buffer.read >= BUFFER_SIZE)
9
    buffer.read = 0;
10
  return 1;
11
}

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)
1
uint8_t BufferOut() //änderung: parameter entfernt
2
{
3
  uint8_t pByte = FAIL; //dafür ne lokale variable für die rückgabe
4
  if (buffer.read == buffer.write) //puffer leer?
5
    return FAIL; //nichts zu lesen da, --> raus
6
  pByte = buffer.data[buffer.read]; //puffer war nicht leer --> juhu
7
 
8
  buffer.read = buffer.read + 1; //--> nächstes element zum lesen markieren
9
  if (buffer.read >= BUFFER_SIZE) // am ende?
10
    buffer.read = 0; //--> ring von vorne durchlaufen...
11
  return pByte; //hier hab ich was geändert, ginge das?
12
}

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:
1
void WriteUART1() // original war parameter "unsigned int data" drin
2
{
3
    if(U1MODEbits.PDSEL == 3)
4
        U1TXREG = BufferOut(); //hier stand statt bufferout data
5
    else
6
        U1TXREG = BufferOut() & 0xFF; //hier stand statt bufferout data
7
}

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

von Karl H. (kbuchegg)


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:
>
>
1
> uint8_t BufferOut(uint8_t *pByte)
2
> {
3
>   if (buffer.read == buffer.write)
4
>     return FAIL;
5
>   *pByte = buffer.data[buffer.read];
6
> 
7
>   buffer.read = buffer.read + 1;
8
>   if (buffer.read >= BUFFER_SIZE)
9
>     buffer.read = 0;
10
>   return SUCCESS;
11
> }
>
> 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.

von hans dampf (Gast)


Lesenswert?

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

von Uwe H. (uwehermann) Benutzerseite


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.

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.