MiklPolikov 0 September 20, 2015 Posted September 20, 2015 · Report post Коллеги, добрый день. В проекте заменил heap_2 на heap_5, и обнаружил, что программа сразу после запуска стала попадать в vApplicationMallocFailedHook Почему так происходит ? Конечная цель- сделать более стабильной работу с динамическим созданием и удалением задач. В heap_2 не предусмотрено объединение двух граничащих освободившихся регионов кучи, поэтому хочу отказаться от heap_2 . Quote Share this post Link to post Share on other sites More sharing options...
zltigo 3 September 20, 2015 Posted September 20, 2015 · Report post Конечная цель- сделать более стабильной работу с динамическим созданием и удалением задач. В heap_2 не предусмотрено объединение двух граничащих освободившихся регионов кучи, поэтому хочу отказаться от heap_2 . Издревле использую с FreeRTOS-образной системой свой менеджер: http://electronix.ru/forum/index.php?showt...l=heap&st=0 Единствено, что у меня первой , а не последней, создается Idle task. Ибо это обязательная задача, без которой система не работоспособна, посему она и создается первой, а не последней, как в оригинале, ибо для последней может не хватить памяти. Посему нет коректного освобождения первого выделеного блока (в теме есть коррекции), как и желания смотреть что там в свалке "оригинальных" менеджеров. P.S. Да и еще, не знаю, что там в heap_5, но задавать размер heap в конфигурационном файле, есть абсолютная дурость - надо просто отдавать ВСЮ оставшуюся память. Quote Share this post Link to post Share on other sites More sharing options...
den_po 0 September 21, 2015 Posted September 21, 2015 · Report post Коллеги, добрый день. В проекте заменил heap_2 на heap_5, и обнаружил, что программа сразу после запуска стала попадать в vApplicationMallocFailedHook Почему так происходит ? xHeapRegions правильно заданы? Вообще heap_5 нужно, если под кучу отводится несколько блоков памяти, располагающихся в разных местах. Если вам такое не нужно, попробуйте heap_4. Quote Share this post Link to post Share on other sites More sharing options...
zltigo 3 September 21, 2015 Posted September 21, 2015 · Report post Вообще 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 ); Так-же в некоторых случаях можно использовать несколько хипов и вообще хипа в выделенном из первичного хипа блоке, например, выделять/удалять в нем блоки одинакового размера - с целью уменьшения дефрагментации основного хипа и увеличения быстродействия. Quote Share this post Link to post Share on other sites More sharing options...
MiklPolikov 0 September 21, 2015 Posted September 21, 2015 · Report post Какое оно всё сложное... Уже обошёлся тем, что сделал у всех задач стек одинакового размера, и с heap_2 заработало. Quote Share this post Link to post Share on other sites More sharing options...
zltigo 3 September 21, 2015 Posted September 21, 2015 · Report post Какое оно всё сложное... У меня по ссылке http://electronix.ru/forum/index.php?showt...st&p=487855 менеджер прямо из порта FreeRTOS под ARM вырван. Для публикации аж на русском откомментировал. Что же там сложного :( - буквально десятки строк в нескольких функциях. Quote Share this post Link to post Share on other sites More sharing options...