MiklPolikov 0 8 ноября, 2015 Опубликовано 8 ноября, 2015 · Жалоба Уже в который раз поднимаю тему динамического создания-удаления задач. Вот к чему пришёл: Для того что бы это стабильно работало, стек у всех задач должен быть одного размера. Если он разный, то куча будет сегментироваться, и через какое-то время это приведёт к краху системы. Ни одна из стандартных схем выделения памяти не heap1 .... heap5 не реализует дефрагментацию кучи. Получается не очевидное сразу ограничение : "динамическое сознание и удаление требует одинаковый размер стека всех задач" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 8 ноября, 2015 Опубликовано 8 ноября, 2015 · Жалоба В самом общем случае куча может быть дефрагментирована только одним способом: если для доступа к области динамической памяти используется исключительно двойной указатель (указатель на указатель) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 ноября, 2015 Опубликовано 8 ноября, 2015 · Жалоба Для того что бы это стабильно работало, стек у всех задач должен быть одного размера. Если он разный, то куча будет сегментироваться, и через какое-то время это приведёт к краху системы. Или примено одного - не отличающегося более, чем вдвое. Ну и радикально проблема решается тем, что при проектировании системы есть проход через фазу кода все "временые" задачи убиты. Ведь они на то и временые что-бы не сущесвовать сколь-нибудь долго, иначе незачем их прибивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 8 ноября, 2015 Опубликовано 8 ноября, 2015 · Жалоба Ну и радикально проблема решается тем, что при проектировании системы есть проход через фазу кода все "временые" задачи убиты. Ведь они на то и временые что-бы не сущесвовать сколь-нибудь долго, иначе незачем их прибивать. Как это решит проблему, если все стандартные системы выделения памяти heap1...heap5 не умеют дефрагментировать кучу, т.е. не умеют склеивать стоящие рядом пустые куски кучи ? Ни чем не занятая куча так и останется разбита на куски. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Как это решит проблему, если все стандартные системы выделения памяти heap1...heap5... Почти первое, что я сделал во FreeRTOS много лет назад, это похерил то уродство, что было в нем менеджером памяти. Так что там дальше городили до heap5 мне неведомо, но нет нималейших причин зачем-то пытаться использовать негодные вещи - ничего не мешает иметь и склеивание и хоть сколь-нибудь разумные алгоритмы поиска свободного блока. Свой менеджер памяти на форуме выкладывал. Он и ВСЮ оставшуюся память сам забирает под распределение и блоки склеивает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Как это решит проблему, если все стандартные системы выделения памяти heap1...heap5 не умеют дефрагментировать кучу, т.е. не умеют склеивать стоящие рядом пустые куски кучи ? Как это не умеют? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Как это не умеют? Недавно наткнулся на такой момент в одном менеджере памяти - umm_malloc Опенсорсный, может и FreeRTOS его позаимствовала. Так там пока не сделаешь первое выделение и освобождение блока на весь объем памяти, этот менеджер довольно хитро работал. Он не объединял свободную память если освобождаемые блоки в какой-то момент превышали определенный размер. Очень знатный баг, но разбираться не стал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Кстати, нынче модно вот такой менеджер применять - http://tlsf.baisoku.org/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться