Jump to content
    

heap_2 заменил на heap_5

Коллеги, добрый день.

 

В проекте заменил heap_2 на heap_5, и обнаружил, что программа сразу после запуска стала попадать в vApplicationMallocFailedHook

Почему так происходит ?

 

Конечная цель- сделать более стабильной работу с динамическим созданием и удалением задач. В heap_2 не предусмотрено объединение двух граничащих освободившихся регионов кучи, поэтому хочу отказаться от heap_2 .

Share this post


Link to post
Share on other sites

Конечная цель- сделать более стабильной работу с динамическим созданием и удалением задач. В heap_2 не предусмотрено объединение двух граничащих освободившихся регионов кучи, поэтому хочу отказаться от heap_2 .

Издревле использую с FreeRTOS-образной системой свой менеджер: http://electronix.ru/forum/index.php?showt...l=heap&st=0

 

Единствено, что у меня первой , а не последней, создается Idle task. Ибо это обязательная задача, без которой система не работоспособна, посему она и создается первой, а не последней, как в оригинале, ибо для последней может не хватить памяти.

Посему нет коректного освобождения первого выделеного блока (в теме есть коррекции), как и желания смотреть что там в свалке "оригинальных" менеджеров.

P.S.

Да и еще, не знаю, что там в heap_5, но задавать размер heap в конфигурационном файле, есть абсолютная дурость - надо просто отдавать ВСЮ оставшуюся память.

 

Share this post


Link to post
Share on other sites

Коллеги, добрый день.

 

В проекте заменил heap_2 на heap_5, и обнаружил, что программа сразу после запуска стала попадать в vApplicationMallocFailedHook

Почему так происходит ?

xHeapRegions правильно заданы?

Вообще heap_5 нужно, если под кучу отводится несколько блоков памяти, располагающихся в разных местах. Если вам такое не нужно, попробуйте heap_4.

Share this post


Link to post
Share on other sites

Вообще heap_5 нужно, если под кучу отводится несколько блоков памяти, располагающихся в разных местах. Если вам такое не нужно, попробуйте heap_4.

Смотреть всю эту муть не хочется, но сама необходимость в чем-то уникально-специальном для того, что-бы использовать несколько отдельных блоков памяти под одним менеджером, вызывает немалое удивление :(. В моем добавление любого блока к существующему хипу это целая "супер" :) функция:

void heapadd( heap_t *heap, heap_mcb *xptr, int size )
{
heap_mcb *tptr = heap->freem;
    xptr->next = tptr;
    xptr->prev = tptr;
    xptr->ts.size = size-sizeof(heap_mcb);
    xptr->ts.type = MARK_FREE;
    xptr->owner = 0;
    // Reinit Primary MCB
    tptr->next = xptr;
}

heapadd( (heap_t *)&system_heap, (void *)0x7FD00000, 0x2000 );

 

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

Share this post


Link to post
Share on other sites

Какое оно всё сложное...

Уже обошёлся тем, что сделал у всех задач стек одинакового размера, и с heap_2 заработало.

 

Share this post


Link to post
Share on other sites

Какое оно всё сложное...

У меня по ссылке http://electronix.ru/forum/index.php?showt...st&p=487855

менеджер прямо из порта FreeRTOS под ARM вырван. Для публикации аж на русском откомментировал. Что же там сложного :( - буквально десятки строк в нескольких функциях.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...