Moin Moin,
Ist der Aufruf vom Macro ATOMIC_BLOCK(ATOMIC_RESTORESTATE) transparent,
also ohne Auswirkung wenn dieser innerhalb einer ISR aufgerufen wird?
Abgesehen davon bin ich natürlich großer Hoffnung, das die volatile
definition innerhalb der typedef struct {} txbuf_t auch wirklich
funktioniert :-)
Hintergrund ist der, dass die Funktion _send_message() aus auserhalb
einer ISR aufgrufen wird.
Folgender Beispiel Code dazu:
1 | typedef struct {
|
2 |
|
3 | volatile uint8_t active;// Flag set if transmission is in progress
|
4 | can_buffer_t buffer; // Control structure
|
5 | can_t list[CAN_TX_BUFFER_SIZE]; // Array of can_t buffer
|
6 |
|
7 | } txbuf_t;
|
8 |
|
9 |
|
10 | ISR(INT0_vect) {
|
11 | ...
|
12 | // check if there are any another messages waiting
|
13 | if (buf != NULL) {
|
14 |
|
15 | sja_add = SJA1;
|
16 | _send_message(buf);
|
17 | can_buffer_dequeue(&txbuf[0].buffer);
|
18 |
|
19 | } else {
|
20 | // buffer underflow => no more messages to send
|
21 | txbuf[0].active = 0;
|
22 | }
|
23 | ...
|
24 |
|
25 | uint8_t
|
26 | _send_message(const can_t *msg) {
|
27 |
|
28 | ...
|
29 | ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
30 | txbuf[sja_add].active = 1;
|
31 | }
|
32 | ...
|
33 | }
|
Vielen Dank für konstruktive Hilfe
Beste Grüße
Karsten