在 FreeRTOS 上处理 BLE 用户事件
Handle BLE user event on FreeRTOS
我运行在带有 BlueNRG 扩展板的 ST Nucleo 板上安装 FreeRTOS。
BLE 堆栈的初始化工作正常,设备自我宣传,我可以建立连接。我的问题是,一旦用户事件到达(例如服务发现),程序就会在 hardfault_handler()
.
中结束
我的 RTOS 上有 3 个任务 运行ning,其中一个应该是处理用户事件的专用 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
的根本原因吗?
我尝试用 vTaskSuspendAll/xTaskResumeAll
包围我的 user_evt_handler
,但这并没有改变任何东西。
通过为 BLE 任务提供更多堆栈大小解决了问题
我运行在带有 BlueNRG 扩展板的 ST Nucleo 板上安装 FreeRTOS。
BLE 堆栈的初始化工作正常,设备自我宣传,我可以建立连接。我的问题是,一旦用户事件到达(例如服务发现),程序就会在 hardfault_handler()
.
我的 RTOS 上有 3 个任务 运行ning,其中一个应该是处理用户事件的专用 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
的根本原因吗?
我尝试用 vTaskSuspendAll/xTaskResumeAll
包围我的 user_evt_handler
,但这并没有改变任何东西。
通过为 BLE 任务提供更多堆栈大小解决了问题