Цитата(LeoLabs @ May 18 2005, 09:24)
Standpoint, а вы на чем программируете? не ПиСи ли? а то как-то ответ не "железячника".

Сорри,
я имел ввиду динамический буфер, а не статический. (Т.е. у которого размер меняется в зависимости от количества поступивших данных/обработанных данных.) Естественно, под каждый элемент буфера выделять память глупо даже для PC, и я этого не предлагал.
Для статического кольцевого буфера существует два пути:
1) косвенная адресация - требует четыре указателя pHead, pTail, сBuf[0] и сBuf[BUFSZ-1], последние два, если buf-глобальный, генерятся в памяти программ.
void Init(){
pHead = pTail = cBuf;
}
void Push(char val){
if(pTail == pHead)
return false;
*pHead = val;
if( pHead == &сBuf[BUFSZ-1])
pHead = cBuf;
else
pHead++;
return true;
}
bool Pop(char val){
if(pTail == pHead)
return false;
char val = *pTail;
if( pTail == &сBuf[BUFSZ-1])
pTail = cBuf;
else
pTail++;
return true;
}
2) индексная: два индекса в памяти данных + константа в памяти программ + указатель на буфер сгенерированный линкером в памяти программ
void Init(){
ixHead = ixTail = 0;
}
bool Push(char val){
if(ixTail == ixHead)
return false;
cBuf[ixHead] = val;
if( ixHead == (BUFSZ-1))
ixHead = 0;
else
ixHead++;
return true;
}
bool Pop(char* val){
if(ixTail == ixHead)
return false;
*val = cBuf[ixTail];
if( ixTail == (BUFSZ-1))
ixTail = 0;
else
ixTail++;
return true;
}
Конструкция
if( ix == (BUFSZ-1))
ix = 0;
else
ix++;
обычно меняется на
ix %= BUFSZ;
Но для IAR - не советую

)
Конкретная реализация выбирается исходя из параметров буфера.
Возможны опечатки и неточности, но смысл в целом таков. Типы указателей я не приводил, для боевого кода советую привести, как это сделал vet, вдруг потом на ARM свою программу будете переносить. Кстати union, предложенный vet в таком виде не переносим, поскольку бывают как big-, так и -little endian uC, а указатели в общем случае не 16-разрядные.
Может выделять память динамически и не совсем целесообразно, просто экономить ресурсы бывает иногда важнее - должна быть золотая середина вот и все. Например, такой вопрос: как встраиваемая система будет обрабатывать ошибку в функции Pop()???
Ко всему, не я же при решении задачи пришел к тому выводу, что мне совершенно необходим буфер размера 0x100 по адресу 0x100, и задачу необходимо решать именно на AVR,- так что в этом смысле я, возможно, и не "железячник":)))) А может быть просто не стоит забивать гвозди микроскопом?