OpenHarmony开发者论坛

标题: OpenHarmony蓝牙STACK模块单线程实现方法 [打印本页]

作者: 深开鸿_石悌君    时间: 6 天前
标题: OpenHarmony蓝牙STACK模块单线程实现方法
[md]### 前言

蓝牙系统服务层的架构如下图

![arch.png](https://forums-obs.openharmony.c ... 8e727ov87v2lp2e.png "arch.png")

蓝牙系统服务组件的核心是STACK模块,STACK模块为了简化处理设计成了一个单线程模块;但系统服务层组件使用IPC和Framework交互,标准设备上蓝牙系统服务层有16条线程用于接收IPC消息,本文解析蓝牙实现从多线程到单线程的实现思路。

### 解决思路

蓝牙通过消息队列实现从IPC多线程到单线程的处理,原理简图如下

![queue.png](https://forums-obs.openharmony.c ... 6ia57wswznwsrww.png "queue.png")

具体实现以开启蓝牙发现流程为例说明;以下是该流程调用栈

```
#03 pc 0007b489 /system/lib/libbtstack.z.so(GapRunTaskBlockProcess+100)
#04 pc 000785cb /system/lib/libbtstack.z.so(GAPIF_Inquiry+78)
#05 pc 001999db /system/lib/libbtservice.z.so(OHOS::bluetooth::ClassicAdapter::StartBtDiscovery()+118)
#06 pc 0005fe0f /system/lib/libbluetooth_server.z.so(OHOS::Bluetooth::BluetoothHostServer::StartBtDiscovery()+194)
#07 pc 00092719 /system/lib/libbluetooth_server.z.so(OHOS::Bluetooth::BluetoothHostStub::StartBtDiscoveryInner(OHOS::MessageParcel&, OHOS::MessageParcel&)+12)
#08 pc 00095257 /system/lib/libbluetooth_server.z.so(OHOS::Bluetooth::BluetoothHostStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, OHOS::MessageOption&)+362)
```

从调用栈可以看到#08是IPC处理函数,#07开始进入业务处理流程,以调用GapRunTaskBlockProcess结束;GapRunTaskBlockProcess函数将任务信息加入到PROCESSING\_QUEUE\_ID\_GAP队列

```
int GapRunTaskBlockProcess(void (*func)(void *), void *ctx)
{
    GapRunTaskBlockInfo *info = MEM_MALLOC.alloc(sizeof(GapRunTaskBlockInfo));
    if (info == NULL) {
        return BT_NO_MEMORY;
    }

    info->event = EventCreate(true);
    info->ctx = ctx;
    info->func = func;

    int ret = BTM_RunTaskInProcessingQueue(PROCESSING_QUEUE_ID_GAP, GapBlockInTaskProcess, info);
    if (ret == BT_SUCCESS) {
        ret = EventWait(info->event, WAIT_TIME);
        ...
    }
}
```

Stack模块包含由链表组成的多个任务队列,Stack线程初始化时创建队列头部;stack线程通过epoll监控多个队列;队列中有消息就触发读取处理

```
void BtmInitThread()
{
   g_processingThread = ThreadCreate("Stack");
   g_processingQueueList = ListCreate(FreeProcessingQueue);
   g_processingQueueLock = MutexCreate();
}
```

GapRunTaskBlockProcess函数通过EventWait等待队列处理结果,会阻塞调用线程;该函数还有一个异步版本GapRunTaskUnBlockProcess,如果不需要得到函数执行结果,调用异步函数原则上效率更高。调用两个函数还需要注意,GapRunTaskBlockProcess由调用方释放ctx,GapRunTaskUnBlockProcess调用方不需要释放ctx

[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5