当前位置:   article > 正文

ESP32蓝牙系列一:初识ESP32的蓝牙_esp32 蓝牙

esp32 蓝牙

蓝牙相关的概念不在啰嗦,说到蓝牙的应用芯片就不得不提ESP32的芯片,直接上ESP32的蓝牙结构图

一、蓝⽛牙主机与控制器器的几种情况

1、在 ESP32 的系统上,选择 BLUEDROID 为蓝牙主机,并通过 VHCI(软件实现的虚拟 HCI 接口)接口,访问控制器。此场景下,BLUEDROID 和控制器都运行在同一宿主上(即 ESP32 芯⽚片),不需要额外连接运行蓝牙主机的 PC 或其它主机设备。

2、在 ESP32 上运行控制器器(此时设备将单纯作为蓝牙控制器器使⽤用),外接⼀
个运行蓝⽛牙主机的设备(如运⾏ BlueZ 的 Linux PC、运⾏ BLUEDROID 的Android等)。此场景下,控制器和主机运行在不不同宿主上,与⼿手机、 PAD、 PC 的使⽤用方比较类似。
3、此场景与2,特别之处在于,在 BQB(或其它认证)的控制器测试下,可以将 ESP32 作为 DUT,用 UART 作为 IO 接口,接上认证测试的 PC 机,即可完成认证。

二、RTOS相关

1、ESP-IDF 的默认运行环境为双核 FreeRTOS, ESP32 的蓝牙可按照功能分为多个任务
(task) 运⾏,不同任务的优先级也有不同,其中优先级最⾼高的为运行控制器器的任务。控制器任务对实时性的要求较⾼高,在 FreeRTOS 系统中的优先级仅次于 IPC 任务(IPC 任务⽤于双核 CPU 的进程间通信)。 BLUEDROID(ESP-IDF 默认蓝牙主机)共包含 4 个任务,分别运行 BTC、 BTU、 HCI UPWARD,及 HCI DOWNWARD。

2、BLUEDROID 中有部分与系统相关的接⼝口需要进⾏OSI 适配,涉及到的功能包括 Timer
(Alarm)、 Task (Thread)、 Future Await/Ready (Semphore)、 Allocator/GKI (malloc/free)
等。
BLUEDROID 中将 FreeRTOS 的 Timer 封装成 Alarm,⽤用于启动定时器器,触发某些特定任
务。BLUEDROID 将原先的 Linux 下的 Thread 部分重新替换成 FreeRTOS 的任务,并使⽤用
FreeRTOS 的 Queue 来触发任务的运⾏(唤醒)。BLUEDROID 使⽤用 Future Await/Ready 功能来实现阻塞, Future Lock 将 FreeRTOS 的xSemphoreTake 包装成 future_await 函数,并将 xSemphoreGive 包装成 future_ready函数。值得注意的是, future_await 和 future_ready 不不能在同⼀一任务中调⽤用。BLUEDROID 将标准库中的 malloc/free 封装成 Allocator 的申请/释放内存的函数, GKI 功能也同样使⽤用 malloc/free 来作为 GKI_getbuf/GKI_freebuf 的核⼼心函数。

三、主机架构

在 ESP-IDF 中,使⽤经过大量修改后的 BLUEDROID 作为蓝牙主机 (Classic BT + BLE)。BLUEDROID 拥有较为完善的功能,支持常用的规范和架构设计,同时也较为复杂。经过大量量修改后, BLUEDROID 保留了⼤大多数 BTA 层以下的代码,几乎完全删去了 BTIF 层的代码,使⽤用了较为精简的 BTC 层作为内置规范及 Misc 控制层。修改后的 BLUEDROID 及其与控制器之间的关系如下图:

BLUEDROID 内部⼤大致分为 2 层: BTU 层和 BTC 层(除去 HCI ),每个层都有对应的任务来处理理。 BTU 层主要负责蓝牙主机底层协议栈的处理理,包括L2CAP、 GATT/ATT、 SMP、 GAP 以及部分规范等,并向上提供以“bta”为前缀的接⼝口;BTC 层主要负责向应⽤用层提供接⼝口⽀支持、处理理基于 GATT 的规范、处理理杂项等,并向应用层提供以“esp”为前缀的接⼝口。所有的 API 都在 ESP_API 层,开发者应当使用“esp”为前缀的蓝⽛牙 API(特殊的除外)。

三、蓝牙目录


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/900165
推荐阅读
相关标签
  

闽ICP备14008679号