Compiler GCC V5.x-11.x
Problem#1:
Wie kann ich mit typedef den Typ bestimmen von struct Elementen e.g.
hier d?
1 | //"prototype"
|
2 | typedef struct {volatile size_t r, w; uint8_t d[0];} queue_t;
|
Problem#2:
Beispielweise braucht queue_get() queue_t, die Struktur ist aber bzgl.
dem Array variabel, wie definiert man den Prototype von queue_t besser
als oben, da ist uint8_t d[0] nur eine Not.
Die eigentliche queue struct wird mit dem Makro QEUEU() erzeugt.
Problem#3
In queue_get() will der GCC die void Verwendung *pd= ... nicht
akzeptieren?! Wie löse ich das Problem.
Problem#4
Verwendung ...
1 | QUEUE2(rxBuf, uint16_t, 32);
|
2 | uint16_t = d;
|
3 | queue_get((queue_t*)&rxBuf, &d);
|
Hier stört mich das (queue_t*), hängt natürlich mit Problem#2 zusammen.
Wenn das alles Murks ist, wie gehts besser/richtig?
Ich habe eine Variante über ein Makro in Verwendung, dass alle queue
Funktionen direkt für die jeweilige qeueu sauber definiert, ABER wenn
viele queues verwendet werden, dann könnte die code size stören, da für
jede Qeue die drei gleichen Funktionen erzeugt werden.
1 | #define QUEUE(QNAME, QTYPE, QNUM) struct {volatile size_t r, w; QTYPE d[QNUM];} QNAME
|
2 |
|
3 | qErr_t queue_get(queue_t *const pq, void* const pd) {
|
4 | if (pq->w-pq->r == 0) return QEMPTY;
|
5 | *pd= pq->d[(pq->r)++];
|
6 | if (pq->r>= mQSIZE(pq->d)) {pq->r = 0; return QSUCCESS;}
|
7 | }
|