STM32 Hardfault бесплатно - PullRequest
0 голосов
/ 27 июня 2018

Я разрабатываю приложение с STM32L476 (без FreeRTOS). Я использую SW4STM32 и STM32CubeMx. Я использую SDMMC с Fatfs в моем приложении. В настоящее время я вижу сбой при освобождении памяти.

Это мои данные стека и кучи в соответствии с файлом компоновщика

/* Highest address of the user mode stack */
_estack = 0x20018000;    /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x7E20;      /* required amount of heap  */
_Min_Stack_Size = 0x1FA0; /* required amount of stack */

0x20003248 - это адрес, по которому происходит сбой (это адрес, который я освобождаю)

Я попытался отладить проблему, перейдя по этой ссылке Cortex-M3 Hard Fault - найти причину

Это то, что я получаю в хардфо:

SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00008200

но я не смог ничего сделать

1 Ответ

0 голосов
/ 27 июня 2018

HardFaults как это - в free или даже malloc - обычно указывают на проблему с повреждением вашей памяти каким-либо образом. Наиболее распространенной причиной является либо двойное значение free для одного и того же адреса памяти, либо перезапись данных в памяти, например, запись за конец какого-то буфера.

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

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

...