Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
в логике работы выдумать там уже нечего, всё довольно просто и логично.
Я обычно использую 2 указателя: на укладываемые и на извлекаемые данные. Тогда:
IF (Storage == Retrieval) then buffer is empty
IF (Storage+1 == Retrieval) then buffer is full
IF (Storage <> Retrieval) then data present
Удобнее всего размер буфера делать степенью двойки (16, 32, 64, 128, 256 и т.д. элементов), тогда контроль допустимости указателей вырождается в простое маскирование.
Например:
#define BUF_SIZE 512
#define BUF_MASK (BUF_SIZE-1)
WORD Buf[BUF_SIZE];
int PutFifoPos = 0;
int GetFifoPos = 0;
...
BOOL PutFifo(WORD x)
{
int newPos = PutFifoPos + 1;
if (((newPos ^ GetFifoPos) & BUF_MASK) == 0)
return FALSE;
*(Buf + (PutFifoPos & BUF_MASK)) = x;
PutFifoPos = newPos;
return TRUE;
}
...
BOOL GetFifo(WORD* pResult)
{
if (((PutFifoPos ^ GetFifoPos) & BUF_MASK) == 0)
return FALSE;
*pResult = *(Buf + (GetFifoPos & BUF_MASK));
GetFifoPos++;
return TRUE;
}
----------------
Насчет "слегка левый нужен - без затирания старых данных" не понял
Составить ответ | Вернуться на конференцию.
Ответы