реклама на сайте
подробности

 
 
> FreeRTOS Heap_x.c
FormatCft
сообщение Oct 7 2008, 07:08
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Доброго времени суток!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Есть ли у кого своя реализация Heap_x.c? А то, что то не хочется использовать реализации которые есть (то без чистки памяти, то без объединения свободных блоков).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2. Еще вопрос по heap_3.c. Этот хип использует стандартный Си-шный хип или просто есть возможность его использовать?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Oct 7 2008, 15:31
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



To zltigo:

А в чем уважаемый гуру вы усмотрели "монументальность" TLSF аллокатора? По моему ничего особо навороченного там нет, а блоки выделяются достаточно шустро, и довольно изящно частично решена задача дефрагментации освобождаемой памяти. Да и с самого начала разрабатывалась для embedded применений.
Я не агент команды, написавшей TLSF, просто интересно уяснить для себя про монументальность.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 7 2008, 15:46
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Oct 7 2008, 17:31) *
А в чем уважаемый гуру вы усмотрели "монументальность" TLSF аллокатора? По моему ничего особо навороченного там нет...

Ничего особо, естественно, нет, но некоторые излишества универсальности присутствуют.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 7 2008, 16:46
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(zltigo @ Oct 7 2008, 19:46) *
Ничего особо, естественно, нет, но некоторые излишества универсальности присутствуют.


Сразу пришла на ум легендарная фразы Вицина из "Кавказской пленницы" : "И излишества всякие, нехорошие ..."
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 17 2008, 21:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Oct 7 2008, 18:46) *
И излишества всякие, нехорошие ...

Думал просто oткомментировать немного и выложить heap manager для FreeRTOS, но получается, что сначала нужно описывать почему он сделан именно так sad.gif. Попробую:
1. Хотелось иметь возможность получения списков свободных и занятых блоков памяти во время консольной отладки.
2. Хотелось иметь признак для чего блок памяти используется системой (TCB/Stack, Очередь,...)
3. Хотелось иметь возможность знать какая задача породила тот или иной блок - самое простое, при запросе блока сохранять адрес TCB.
4. Обязательна возможность использовать с менеджером разрозненные блоки памяти в едином списке. И наоборот - использовать несколько независимо управляемых блоков памяти (например, если эти блоки памяти имеют разное назначение/свойства, или для ручной борьбы с дефрагментацией )
5. Особые навороты с для ускорения поиска свободных блоков типа "испанского варианта" не нужны, поскольку
- основная масса блоков памяти под задачи, очереди и прочее выделяется "навсегда" и естественно выделение начинается с них;
- относительно родной реализации FreeRTOS под задачу и очередь у меня выделяется по одному блоку памяти TCB+Stack и QCB+Queue вместо отдельных.
- в результате в реальности занимаются/освобождаются обычно 2-3-5-ну чуть больше блоков и найти подходящий по размеру проще и быстрее простым перебором из свободных.
6. Борьба с дефрагментацией:
- склеивание соседних свободных блоков в один;
- прежде всего поиск свободного блока равного размеру запрашиваемого - на самом деле достаточно не редкий вариант, особенно, если чуть приложить к этому усилия.

Как строим:
1. Один общий связанный список, или отдельные для свободных и занятых. Использую один общий. Решающая причина - простой механизм склейки свободных блоков. При этом недостатки такого подхода нивелирутся тем, что ввиду (п.5) дефрагментация только в хвосте списка и длинна списка для поиска свободного эффективно сокращается использованием всего одного дополнительного указателя на первый свободный блок в общем списке.
2. На MCB выделено достаточно много памяти - 16 байт. Для максимально кастрированного варианта типа родных heap_*.с и с ограничением на размеры выделяемого блока можно было и в 4 байта уложиться, но см. "хотелки". Без особого напряга можно было в 12 байт уложиться, но тем неменее исходя из того, что например, для ARM стека выравнивание на 8 байт надо.... Пусть будет на данный момент 16 байт.
Код
typedef union type_size {
    unsigned long size;
    struct {
    unsigned long xlen:24;
    unsigned long type:8;
    };
}type_size;

// Memory Control Block (MCB)
typedef struct heap_mcb
{
    struct heap_mcb *next;       // Указатель на следующий MCB
                                  // mcb.next  последнего MCM всегда указывает на
                                  // первый MCB.
    struct heap_mcb *prev;       // Указатель на предыдущий MCB.
                                // Для первого MCB этот указатель указывает
                                // сам на себя.
    union type_size ts;          // Размер блока памяти и тип блока

    void  *ow;        // ТСВ Владельца блока памяти
                                // Собственно контролируемый блок памяти расположен сразу за MCB
} heap_mcb;


// Структура-описатель HEAP (тип-структура t_heap)
typedef struct heap_t
{     // Указатель на начало heap (первый MCB)
    struct heap_mcb *start;
    // Указатель на первый свободный MCB
    struct heap_mcb *freem;
    // RAW размер HEAP
    unsigned long hsize;
} heap_t;

Осталось откомментировать и выложить исходники. Завтра...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- FormatCft   FreeRTOS Heap_x.c   Oct 7 2008, 07:08
- - zltigo   Цитата(FormatCft @ Oct 7 2008, 09:08) Ест...   Oct 7 2008, 07:36
|- - FormatCft   Цитата(zltigo @ Oct 7 2008, 13:36) Делал ...   Oct 7 2008, 07:54
|- - zltigo   Цитата(FormatCft @ Oct 7 2008, 09:54) Мож...   Oct 7 2008, 08:26
|- - FormatCft   Цитата(zltigo @ Oct 7 2008, 14:26) Я поду...   Oct 7 2008, 08:38
|- - zltigo   Цитата(FormatCft @ Oct 7 2008, 10:38) Т.е...   Oct 7 2008, 10:31
|- - FormatCft   Цитата(zltigo @ Oct 7 2008, 16:31) Подход...   Oct 7 2008, 13:45
- - sergeeff   В этом плане можно воспользоваться TLSF: Memory Al...   Oct 7 2008, 07:55
|- - FormatCft   Цитата(sergeeff @ Oct 7 2008, 13:55) В эт...   Oct 7 2008, 08:08
|- - sergeeff   Цитата(FormatCft @ Oct 7 2008, 12:08) Спа...   Oct 7 2008, 10:18
|- - FormatCft   Цитата(sergeeff @ Oct 7 2008, 16:18) Тест...   Oct 17 2008, 19:14
- - Terminator   Запустил в своём проекте heap_3 arm-elf-gcc + newl...   Oct 7 2008, 10:58
|- - FormatCft   опсотв ))   Oct 7 2008, 16:12
- - zltigo   Оптимально-простой в соответствии с ранее изложенн...   Oct 18 2008, 19:47
|- - FormatCft   Спасибо! ! ! Щас будем прикручивать   Oct 18 2008, 20:04
- - Terminator   Прикрутил к FreeRTOS TLSF ~3kB RAM уходит на табли...   Nov 12 2008, 04:26
- - zltigo   Сергей Борщ нашел потенциально суровый баг при осв...   Apr 17 2010, 13:06
|- - Alex B._   Первый выделенный блок не освобождается. Наверное ...   Apr 22 2010, 11:05
|- - zltigo   Цитата(Alex B._ @ Apr 22 2010, 13:20) Пер...   Apr 22 2010, 11:10
|- - Alex B._   Цитата(zltigo @ Apr 22 2010, 15:25) Типа ...   Apr 22 2010, 11:16
- - Dron_Gus   Спасибо за исходники. Пошел подтачивать под ansi.   Apr 21 2010, 07:41
- - wave48   Исходники аллокатора от zltigo оказались очень пол...   Jul 15 2013, 07:06
- - esaulenka   Раз уж подняли тему. Модулей диагностики (хотя б п...   Jul 16 2013, 19:38
- - wave48   Вот это и было одной из причин использовать собств...   Jul 17 2013, 06:29
- - MiG-3   Добрый день, коллеги! Хочется более точно поня...   Dec 4 2014, 13:13
- - Непомнящий Евгений   Цитата(MiG-3 @ Dec 4 2014, 17:13) Та...   Dec 8 2014, 13:11
- - MiG-3   Спасибо за ответ! Цитата(Непомнящий Евгений ...   Dec 10 2014, 10:29
- - Непомнящий Евгений   Цитата(MiG-3 @ Dec 10 2014, 13:29) Д...   Dec 15 2014, 09:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016