Обработка пользовательского события BLE в FreeRTOS - PullRequest
0 голосов
/ 06 марта 2019

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

1 Ответ

1 голос
/ 06 марта 2019

Исправлена ​​ошибка, из-за которой задание BLE получало больший размер стека

...