Hallo,
ich möchte gerne Binärdaten von zwei GPS-Modulen an zwei USARTs
gleichzeitig einlesen und baue mir dafür gerade ein Progrämmchen für
einen Atmel AVR. Beim Protokoll handelt es sich um UBX.
Damit ich in der Interrupt-Routine Daten sammlen und im Hauptprogramm
parallel in Ruhe parsen kann, brauche ich für jeden USART zwei Puffer,
also insgesamt vier.
Um das Kopieren von Puffern in der Interrupt-Routine zu vermeiden
(soviel Zeit habe ich nicht, UBX-Messages können sehr lang werden),
wollte ich für jedes GPS-Modul zwei Zeiger auf Puffer vorhalten, einen
Zeiger für die Interruptroutine und einen Zeiger für den Parser. Diese
Zeiger wollte ich dann jeweils in der Interruptroutine tauschen, wenn
ein kompletter Datensatz eingetroffen ist.
Es sollte sich folgender Ablauf ergeben:
1. Sammeln der Daten in Puffer 1, bis vollständiger Datensatz da
2. Auswerten der Daten in Puffer 1, gleichzeitig Sammeln der Daten in
Puffer zwei, bis vollständiger Datensatz da
3. Auswerten der Daten in Puffer 2, gleichzeitig Sammeln der Daten in
Puffer eins, bis vollständiger Datensatz da
usw.
Der Code soll später auf noch mehr GPS-Module erweitert werden können,
deshalb möchte ich mit Arrays arbeiten.
Ich definiere also die Puffer und die Zeiger darauf:
1 | #define NO_RECEIVERS 2
|
2 | #define UBX_BUFFER_SIZE 1024
|
3 |
|
4 | typedef struct
|
5 | {
|
6 | uint8_t message_class;
|
7 | uint8_t message_id;
|
8 | uint16_t data_length;
|
9 | uint8_t data[UBX_BUFFER_SIZE];
|
10 | uint8_t checksum_a;
|
11 | uint8_t checksum_b;
|
12 | } ubx_buffer_t;
|
13 |
|
14 | ubx_buffer_t gps_buffer[2 * NO_RECEIVERS];
|
15 | ubx_buffer_t *gps_input_buffer[NO_RECEIVERS];
|
16 | ubx_buffer_t *gps_parse_buffer[NO_RECEIVERS];
|
Zur Initialisierung setze ich die Zeiger per Hand:
1 | uint8_t i;
|
2 |
|
3 | for (i = 0; i < NO_RECEIVERS; i++)
|
4 | {
|
5 | gps_input_buffer[i] = &gps_buffer[2 * i];
|
6 | gps_parse_buffer[i] = &gps_buffer[2 * i + 1];
|
7 | }
|
Jetzt meine Frage: Kann man das so machen, oder habt ihr bessere Ideen?
Wie implementiert man am besten das Austauschen der
Zeiger-"Zieladressen" von gps_input_buffer und gps_parse_buffer? Wie
verhindert man, dass die Interruptroutine dem Parser die Variablen
"unter dem Arsch" wegnimmt? Sprich, was ist, wenn der Parser mal länger
braucht, als die Interruptroutine zum Sammeln eines Datensatzes?