Hi,
ich bin dabei einen Fifo für den UART zu schreiben, der auch das 9. bit
speichern kann. Um den RAM Verbrauch möglichst klein zu halten, sollen
nicht einfach ein Array mit 16bit Variablen verwendet werden.
Ansatz: Da der Fifo nur 26 Zeichen speichern können soll, habe ich mir
einfach eine 32bit Variable erstellt, und mit dem Index des jeweiligen
Bytes im Fifo, kann dann in der 32bit Variable ausgelesen/geschrieben
werden, ob das 9. bit gesetzt ist oder nicht.
Das funktioniert aber leider nicht so ganz.
1 | typedef struct {
|
2 | uint8_t data[RINOBUS_FRAMELENGHT];
|
3 | uint32_t ninth_bit;
|
4 | uint8_t r_ptr,w_ptr;
|
5 | uint8_t pending;
|
6 | }t_fifo_rb;
|
1 | int8_t
|
2 | RinoBus_Fifo_Write(t_fifo_rb *fifo, uint16_t data)
|
3 | {
|
4 | if(fifo->pending >= RINOBUS_FRAMELENGHT)
|
5 | {
|
6 | return -1;
|
7 | }
|
8 |
|
9 | fifo->w_ptr += 1;
|
10 |
|
11 | if(fifo->w_ptr >= RINOBUS_FRAMELENGHT)
|
12 | {
|
13 | fifo->w_ptr = 0;
|
14 | }
|
15 |
|
16 | fifo->data[fifo->w_ptr] = data;
|
17 |
|
18 | if(data & (1<<8))
|
19 | {
|
20 | fifo->ninth_bit |= (1<<fifo->w_ptr);
|
21 | }else
|
22 | {
|
23 | fifo->ninth_bit &= ~(1<<fifo->w_ptr);
|
24 | }
|
25 |
|
26 | fifo->pending += 1;
|
27 |
|
28 | return 1;
|
29 | }
|
Ich habe mir ein Testprogramm geschrieben:
Atmel Studio 6.2 im Simulator. Optimierung ausgeschaltet, aber keine
Änderung bei aktivierter Optimierung.
1 | for(uint8_t i=0;i<30;i++)
|
2 | {
|
3 | if((i%2) == 0)
|
4 | {
|
5 | ret[i] = RinoBus_Fifo_Write(&f,i|(1<<8));
|
6 | }else
|
7 | {
|
8 | ret[i] = RinoBus_Fifo_Write(&f,i);
|
9 | }
|
10 | }
|
Im Prinzip werden einfach die Zahlen 0-25 in den Fifo geschrieben und
bei jeder geraden Zahl soll das 9. bit gesetzt werden.
Problem:
Ich habe das Programm Schritt für Schritt ablaufen lassen. Dass jedes 2.
mal das 9. bit gesetzt werden funktioniert, aber sobald ich bei 16 bin,
passiert nichts mehr. Also Bytes 16-31 kann ich nicht setzen. Es steht
am Ende 0x00005555 in der Variable.
Wenn ich für jede ungerade Zahl das 9. bit setzen will, wird mit dem 15.
bit auch bits 16-31 gesetzt. Ergebnis: 0xffffaaaa.
Es scheint so, als könnte ich auf Bits 16-31 nicht zugreifen, oder
könnte das ein Fehler im Simulator sein?
Lg
Philipp