Я использую FreeRTOS на плате ST Nucleo со щитом BlueNRG.
Инициализация стека BLE работает, устройства рекламируют себя, и я могу установить соединение. Моя проблема заключается в том, что как только приходит пользовательское событие (например, обнаружение службы), программа заканчивается в hardfault_handler()
.
У меня в RTOS запущено 3 задачи, из которых одна должна быть выделенной задачей 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
, но это ничего не изменило.