Цитата(MaxiMuz @ Jun 3 2014, 14:40)

Только в этой функции, я думаю , не увеличение
tail а набоборот:
Код
signed int getArray(void)
{
signed int res = -1;
if(head == 0) return res; //нет данных - возвращаем -1
res = buff[tail];
tail++;
return res; //возвращаем данные
}
Исходный код правильный - это кольцевой буффер FIFO.
По позици head ложим данные с инкрементом head.
Забираем данные по позиции tail с инкрементом tail.
При закидывании данных голова убегает от хвоста.
При извлечении - хвост догоняет голову.
Если Т.С. нужен кольцевой буффер с доступом по указателю, то
megajohn уже подсказал решение.
Позволю себе также пояснить то, что предложил
megajohnПредположим у Вас есть буффер char-элементов buff расположенный по адресу 0x1000 и размер BUFF_SIZE = 256 байт
Тогда Ваш буффер будет занимать диапазон адресов 0xFF1000 - 0x001000
Маска для этого диапазона адресов ADDR_MSK = 0xFF<<12
Теперь мы хотим считать с любой позиции буффера через указатель 256 байт, но так, чтобы при достижении границы буффера адрес автоматически перешёл в начало
Код
unsigned char* pbuff = &buff[255];
for(unsigned int i=0; i<BUFF_SIZE; i++)
{
*((pbuff+i)&ADDR_MSK);
}
Сначала адрес pbuff+i = 0xff1000+0
Читаем с этого адреса значение из ячейки buff[255]
Далее инкремен i и адрес становится pbuff+i=0xff1000+1=0x1001000
Но мы накладываем маску адресов 0xff<<12 и получаем адрес 0x100010000&(0xff<<12) = 0x001000;
Т.е. новый адрес соответсвует ячейке buff[0];
при i == 1 адрес будет 0x1011000&(0xff<<12) = 0x001000
и так далее.