Пример, в котором проявляется ошибка оптимизатора
Код
typedef struct
{ unsigned char *home; // указатель на начало буфера
unsigned char *head; // указатель на голову буфера
unsigned char *tail; // указатель на хвост буфера
unsigned char *end; // указатель на конец буфера
volatile int change; //
} CIRCULAR_BUFFER;
int put_circle( unsigned char dat, CIRCULAR_BUFFER *buf )
{
CIRCULAR_BUFFER b;
istate_t i;
int c;
unsigned char *p;
for ( b.home = buf->home, b.end = buf->end;; )
{ b.head = buf->head;
b.tail = buf->tail;
b.change = buf->change;
c = 0;// это присваивание при "Code motion" выносится из цикла, хотя ниже с может стать -1, а при повторном прохождении цикла с должно опять стать нулем.
if ( b.tail == NULL )
{ b.tail = b.head; // буфер полон,
if ( ++b.head == b.end ) // сдвинем голову
b.head = b.home;
}
p = b.tail; // Сюда надо положить dat
if ( ++b.tail == b.end )
b.tail = b.home;
if ( b.tail == b.head ) // буфер заполнен ?
{ b.tail = NULL; // да
c = -1;
}
if ( b.change == buf->change ) // фоновый процесс поработал с буфером в это-же время, придется все делать заново
break;
}
i = __get_interrupt_state(); // сохраним статус прерываний
__disable_interrupt(); // Запретим прерывания
buf->change++; // мы поработали с буфером!
buf->head = b.head; // обновим значения в буфере
buf->tail = b.tail;
*p = dat;
__set_interrupt_state( i ); // востановим статус прерываний
return( c );
}