was soll diese fehlermeldung
-
hi,
ich habe einen ringbuffer:// The FIFO structure typedef struct FIFO { volatile SIZE_T readidx; volatile SIZE_T writeidx; UINT8 *memory; SIZE_T size; volatile SIZE_T count; } FIFO_T;
und eine schreibfunktion bzw. makro
// WRITE as macro but without 'FIFO FULL' notification #define FIFO_WRITE(_f_,_b_)\ { \ if ((_f_).count < (_f_).size) \ { \ (_f_).memory[(_f_).writeidx] = (_b_); \ (_f_).writeidx++; \ if ((_f_).writeidx == (_f_).size) \ (_f_).writeidx = 0; \ (_f_).count++; \ } \ }
beim benutzen des macros spuckt der compiler diese meldung aus:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement N:\iar_v2_test\modbus_ll.c 39
wieso gibt's da was zu meckern?
danke...
-
Kommt die Meldung auch, wenn du das Makro von Hand aufdröselst (oder eine normale Funktion dafür verwendest)? (wenn ja, solltest du dir mal ansehen, welches der Statements der Compiler tatsächlich meint)
-
CStoll schrieb:
Kommt die Meldung auch, wenn du das Makro von Hand aufdröselst (oder eine normale Funktion dafür verwendest)? (wenn ja, solltest du dir mal ansehen, welches der Statements der Compiler tatsächlich meint)
es passiert hier:
... rxfifo.memory[rxfifo.writeidx] = U0RBR; ...
wobei U0RBR definiert ist als:
#define U0RBR (*(volatile unsigned long *)(UART0_BASE_ADDR + 0x00))
also mag er wohl die zuweisung von einem 'volatile' zum anderen nicht.
ist sowas wirklich 'undefined'?
-
Und wohin zeigt UARTO_BASE_ADRR?
(Probleme könnte ich mir nur vorstellen, wenn du mehrfach in der Anweisung auf die SELBE volatile-Variable zugreifen willst - der Standard garantiert nicht, in welcher Reihenfolge diese Zugriffe erfolgen, und wenn sich die Variable zwischenzeitlich ändert, kann das Probleme geben)
PS: Hast du überhaupt verstanden, was 'volatile' bedeutet? Und bist du sicher, daß du es hier benötigst?
-
CStoll schrieb:
Und wohin zeigt UARTO_BASE_ADRR?
das ist ein fester wert:
#define UART0_BASE_ADDR 0xE000C000
CStoll schrieb:
PS: Hast du überhaupt verstanden, was 'volatile' bedeutet? Und bist du sicher, daß du es hier benötigst?
in dem speziellen fall wird das 'volatile' am 'writeidx' tatsächlich nicht benötigt. würde ich es abändern, dann hätte ich allerdings einen zu anderen projekten inkompatiblen header
das 'volatile' am U0RBR ist dagegen sehr wichtig. es handelt sich dabei um ein memory mapped register, dessen inhalt sich unvorhersehbar ändern kann.der compiler sieht hier wahrscheinlich probleme, wo keine sind...