Цитата(aesok @ Oct 23 2006, 12:07)

GCC не игнорирует volatile!!! Ошибка в чем то другом. Показывайте код.
Анатолий.
Показываю (прошу прощения за кривое форматирование: не могу своим умом постигнуть, как в этом форуме делать вёрстку, может, оттого, что не знаю html ?) :
Фрагмент файл uart.c:
******
Код
#include "interface/uart.h"
uint8_t pushToDebugBuffer(uint8_t symbol){
DEBUG_TX_INT_LOCK();
while(debugPushCursor == debugPopCursor){
DEBUG_TX_INT_UNLOCK();
SLEEP();
DEBUG_TX_INT_LOCK();
}
*debugPushCursor = symbol;
debugPushCursor = nextAddress(debugPushCursor);
DEBUG_TX_INT_UNLOCK();
if(!globIntFlags.isDebugPortBusy) popFromDebugBuffer(); //если передача когда-то закончилась, то возобновляем её
return symbol;
}
******
Фрагмент файла uart.h (макрос CLARBIT, SETBIT просто логическая операция над портом, определно где-то, ) :
*******
Код
//SPECPREFIX пустой, если заголовок подключается из uart.c, и равен extern, если другими
SPECPREFIX uint8_t debugBuffer[32];
SPECPREFIX volatile uint8_t *debugPushCursor;
SPECPREFIX volatile uint8_t *debugPopCursor;
#define DEBUG_TX_INT_LOCK(s) CLEARBIT(UCSR1B, TXCIE1)
#define DEBUG_TX_INT_UNLOCK(s) SETBIT(UCSR1B, TXCIE1)
*******
Фрагмент кода прерывания:
******
#include "interface/uart.h"
INTERRUPT(/*SIG_UART0_TRANS*/SIG_USART1_TRANS){
// например,
debugPopCursor++;
}
******