Hi,
ich bin grad relativ erfolgreich am Debuggen, denn ich habe den Fehler
zwar gefunden, weis aber leider nicht, wie ich ihn beheben kann.
ich habe eine globale Variable in meiner uart.c
1 | unsigned char UART_TX_BufferRead;
|
wenn ich die static deklariere macht das ganze zwar einen kleinen
unterschied.
Mit hilfe der While-Schleife will ich auf eine freie Zelle in meinem
Buffer warten.
1 | unsigned char tmp;
|
2 | //Schreibzeiger einen weiter
|
3 | tmp = (UART_TX_BufferWrite + 1) % UART_TX_BufferSize;
|
4 | //warten bis Buffer nicht mehr voll ist
|
5 | while (tmp == UART_TX_BufferRead) ;
|
6 | //einschreiben der daten in den Buffer array
|
7 | foo()
|
In einem Interrupt wird dann irgendwann eine Zelle freigegeben.
1 | UART_TX_BufferRead = (UART_TX_BufferRead + 1) % UART_TX_BufferSize;
|
Nun das Problem:
Der Compiler macht daraus den folgenden Assembler-Code. Da das BREQ
jedoch nur eine und nicht zwei befehle zurückspringt bekommt die
While-Schleife nicht mit, das sich UART_TX_BufferRead geändert hat (R18
wird nicht aktuallisiert).
87: while (tmp == UART_TX_BufferRead) ;
+000018BB: 91200417 LDS R18,0x0417 Load direct from data
space
+000018BD: 1782 CP R24,R18 Compare
+000018BE: F3F1 BREQ PC-0x01 Branch if equal
Wie bringe ich dem Compiler bei, das er in der while schleife immer den
aktuellen UART_TX_BufferRead neu holen soll?
Reicht eine andere deklaration der Variable, oder muss am Aufruf etwas
geändert werden?
Vielen dank im Voraus!
Henning