Я запускаю FreeRTOS на плате ST Nucleo с экраном BlueNRG. Инициализация стека BLE работает, устройства рекламируют себя, и я могу установить соединение. Моя проблема в том, что как только появляется пользовательское событие (например, обнаружение службы), программа попадает в hardfault_handler()
.
У меня есть 3 задачи, запущенные в моей RTOS, из которых одна должна быть выделенной задачей BLE, обрабатывающей пользовательские события.
void hci_user_evt_proc(void)
{
tHciDataPacket * hciReadPacket = NULL;
/* process any pending events read */
while (list_is_empty(&hciReadPktRxQueue) == FALSE)
{
list_remove_head (&hciReadPktRxQueue, (tListNode **)&hciReadPacket);
if (hciContext.UserEvtRx != NULL)
{
hciContext.UserEvtRx(hciReadPacket->dataBuff);
}
list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket);
}
}
Это взято из кода примера ST. Все работает, если я
- Просто запустите эту задачу или
- Дайте задаче BLE более высокий приоритет
Оба решения имеют одинаковый результат и больше не имеют многозадачной системы. Я не знаю, нужно ли адаптировать пример кода для работы в многозадачной системе или мне нужно запускать прерывание процесса BLE, но если да, как мне это сделать и как я могу определить основную причину hardfault
?
Я пытался окружить свой user_evt_handler
vTaskSuspendAll/xTaskResumeAll
, но это ничего не изменило.