HardFaults как это - в free
или даже malloc
- обычно указывают на проблему с повреждением вашей памяти каким-либо образом. Наиболее распространенной причиной является либо двойное значение free
для одного и того же адреса памяти, либо перезапись данных в памяти, например, запись за конец какого-то буфера.
Что касается второго пункта - хотя это зависит от реализации - общий подход для malloc
состоит в том, чтобы хранить некоторую дополнительную информацию, которую он использует внутри, для будущих вызовов на malloc
или free
. Это такие вещи, как размер выделенного фрагмента, информация о следующем фрагменте в памяти и т. Д. Эта информация в проверенной мной реализации была сохранена непосредственно перед адресом памяти, который вы указали в качестве возвращаемого значения из malloc
. Если вы затем перезапишите эти данные - например, записав за буфер, который был выделен перед этим адресом - следующий вызов free
, который освобождает эту память, неожиданно завершится сбоем, что часто приводит к HardFault.
Сказав это и учитывая предоставленную вами ограниченную информацию, все, что я могу предложить, - это пройти код, который записывает данные в память - в основном, запись кода в массивы, выделенные с помощью malloc
. Ограничьте код минимальным случаем, который все еще вызывает HardFault, и отладьте его. Возможно установить некоторые точки останова данных (запись). free
сбой при освобождении памяти не обязательно (и в этом случае, скорее всего, не так) обязательно указывает на проблему с этой конкретной частью памяти, а скорее смежной.