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