Обработка пользовательского события BLE на FreeRTOS

Я запускаю 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, но это ничего не изменило.


person po.pe    schedule 06.03.2019    source источник


Ответы (1)


Проблема решена путем увеличения размера стека для задачи BLE.

person po.pe    schedule 06.03.2019