LINUX.ORG.RU

C: циклический FIFO буфер пакетов


0

0

Подскажите, где можно взять реализацию циклического FIFO буфера пакетов , не использующего динамическую память, в котором были бы следующие операции:

-добавить очередной пакет в конец буфера
-получить указатель на начало очередного пакета из головы буфера
-пометить пакет в начале буфера, как "обработанный" (типа удалить)

Отличие от обычного циклического FIFO буфера в том, что 1)пакеты могут быть разного размера 2) должна обрабатываться ситуация "неиспользуемого пустого места" в конце памяти, на которой развернут FIFO, которое остается, если очередной пакет целиком туда не влезает.

Самому писать ломает, думаю, этот велосипед много где был уже..
Я планирую использовать его в программе на микроконтроллере.
Кто встречал, такое или похожее, киньтесь ссылкой!

★★

Re: C: циклический FIFO буфер пакетов

Либо я чего то не понял, либо это пишется за 5 минут.

Legioner ★★★★★ ()
Ответ на: Re: C: циклический FIFO буфер пакетов от Legioner

Re: C: циклический FIFO буфер пакетов

> Либо я чего то не понял, либо это пишется за 5 минут.
Нельзя пользоваться динамической памятью.

Вобщем, написать несложно, но по опыту, такие конструкции отлаживать долго.

ierton ★★ ()
Ответ на: Re: C: циклический FIFO буфер пакетов от ierton

Re: C: циклический FIFO буфер пакетов

>> Либо я чего то не понял, либо это пишется за 5 минут.

>Нельзя пользоваться динамической памятью.

а создать большой статический массив?

generatorglukoff ★★ ()

Re: C: циклический FIFO буфер пакетов

У меня сомнение, что это "велосипед". Вряд ли есть реализации без использования динамической памяти, они редко бывают нужны. А уж если ты пишешь для микроконтроллера, то тем более рекомендую реализовывать самому, ибо время реализации меньше либо равно времени гугления по данному вопросу + прикручиванию того, что ты там нагуглишь.

anonymous ()
Ответ на: Re: C: циклический FIFO буфер пакетов от anonymous

Re: C: циклический FIFO буфер пакетов

> Вряд ли есть реализации без использования динамической памяти

Почему? По своей постановке эта задача требует только одного непрерывного куска памяти -- так что нет особой разницы откуда он взялся.

dilmah ★★★★★ ()
Ответ на: Re: C: циклический FIFO буфер пакетов от omerm

Re: C: циклический FIFO буфер пакетов

> про malloc я не понял: разве время выполнения malloc не будет амортизировано? его же один раз запускают.

Если его запускают один раз за выполнение работы - то почему бы не заменить его статическим массивом?

А вообще malloc не подходит, потомучто код, который его должен былбы вызывать, выполняется на контроллере из прерывания, а там недопустима такая потенциально долгая операция, как поиск свободной памяти. Тем более, что там памяти мало.

ierton ★★ ()

Re: C: циклический FIFO буфер пакетов

статический массив в .bss
при необходимости вызов brk() для его увеличения 

static unsigned long size;
static char fifo[SIZE];
static void init() {
    size = ((unsigned long)_end + PAGE_SIZE) & ~PAGE_SIZE - (unsigned long)fifo;
}

rei3er ()
Ответ на: Re: C: циклический FIFO буфер пакетов от ierton

Re: C: циклический FIFO буфер пакетов

.bss - секция неинициализированных данных в структуре файлов формата ELF
код полный
init() вызывается перед началом работы с fifo для определения его полного размера
если в процессе работы size станет нулевым, вызываем brk() для увеличения размера fifo

rei3er ()
Ответ на: Re: C: циклический FIFO буфер пакетов от ierton

Re: C: циклический FIFO буфер пакетов

_end определяет линейный адрес последнего байта сегмента данных
значение brk при вызове main() равно (_end + 4096) & ~4095
оно определяет адрес начала кучи, где можно резервировать память посредством brk()

rei3er ()
Ответ на: Re: C: циклический FIFO буфер пакетов от ierton

Re: C: циклический FIFO буфер пакетов

> Уф.. написать всеже проще оказалось. http://store.ierton.homelinux.net/tmp/fw/packet_buffer.h http://store.ierton.homelinux.net/tmp/fw/packet_buffer.c

"нужно ли расстреливать на месте без суда и следствия за комментарии в коде на русском?" впрочем, вопрос скорее риторический.

// wbr

klalafuda ★☆☆ ()
Ответ на: Re: C: циклический FIFO буфер пакетов от ierton

Re: C: циклический FIFO буфер пакетов

> в команде есть люди, у которых с английским неважно

вспоминается один достаточно толстый проект, которым приходилось активно пользоваться при этом автор то-же был не в ладах с английским [или с головой]. как следствие, весь код был обильно увешан комментариями на французском. вот была прелесть в этом копаться, скажу я вам..

// wbr

klalafuda ★☆☆ ()
Ответ на: Re: C: циклический FIFO буфер пакетов от klalafuda

Re: C: циклический FIFO буфер пакетов

ps: впрочем, к самой технической реализации это отношения не имеет. в конце-концов, работает и ладно.

// wbr

klalafuda ★☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.