Чтобы просто сделать инкремент младшего байта, придется принять ограничение на возможный размер буфера, а именно, - размер может быть, например, 8,16,32,64,128 или 256. И вот почему:
#define BUFFER_SIZE 128 // 0x80 #define BUFFER_MASK (BUFFER_SIZE - 1) // 0x7F если эту маску накладывать на постоянно увеличивающийся индекс, то мы не выйдем за границы массива
unsigned char Buffer[BUFFER_SIZE]; Превоначально BufferHead, BufferTail указывают на начало массива: BufferHead = 0; BufferTail =0; Затем, данными заполняют буфер, изменяя, например BufferHead. Читаем буфер, перемещая BufferTail, пока не упрется в BufferHead:
unsigned char tmptail; unsigned char accum; if ( BufferHead != BufferTail ) { /* calculate buffer index */ tmptail = ( BufferTail+ 1 ) & BUFFER_MASK; BufferTail= tmptail; /* store new index */ accum = Buffer[tmptail]; // дальше используем accum, как надо }
Инкремент индекса буфера можно написать короче, контролируя при этом сгенеренный код. Вышеприведенный оставил для наглядности
|