Я работал над этой программой в течение пяти месяцев теперь. Это - приложение реального времени сенсорной сети. Я создаю несколько связанных списков во время срока действия программы, и я использую malloc для создания нового узла в ссылке. То, что происходит, - то, что программа внезапно останавливается или сходит с ума и перезапускает. Я использую AVR, и микроконтроллер является 1281 ATMEGA. После большой отладки я выяснил, что это malloc вызывает проблему. Я не освобождаю память после выхода из функции, которая создает новую ссылку, таким образом, я предполагаю, что это в конечном счете заставляет память "кучи" переполняться или что-то как этот. Теперь, если я использую свободное () функция для освобождения памяти в конце функции с помощью malloc, программа просто застревает, когда управление достигает свободный (). Это вызвано тем, что память становится слишком кластеризованной после вызова свободного ()?
Я также составляю ссылочные таблицы, например, если 'голова' является новым списком ссылок, и я создаю другой список, названный текущим, и заставляю его равняться голове.
table *head;
table *current = head;
После конца функции, если я использую свободный
free(current);
current = NULL:
Затем программа застревает здесь.
Я не знаю, что сделать. Что я делаю неправильно? Существует ли способ увеличить размер памяти "кучи"?
Необходимость освобождения блока в конце функции, вызывающей malloc (), зависит от того, должна ли память блок все еще используется после вызова. Если он становится узлом в списке, вы должны не освобождать его в конце функции. Если она используется для временной рабочей памяти во время вызова, вы должны освободить ее в конце, иначе вы в конечном итоге исчерпаете свою кучу. Вы должны освободить блок, когда он будет удален из списка.
В любом случае использование malloc () и free () для небольших блоков памяти (т. Е.связанных списков) в системе реального времени (без виртуальной памяти) приведет к возможной фрагментации кучи.
Что вам нужно сделать, так это использовать пул блоков памяти и перезапустить буферы. Вы используете ОСРВ или это голый металл? Если вы посмотрите, есть существующие библиотеки пула памяти. Вы также можете написать одну, но относительно легко создать что-то похуже, чем отсутствие библиотеки, если вы не имеете большого опыта в этой области.
Предоставьте более подробную информацию, если вам нужен более конкретный совет.