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