蓝牙协议栈(二、BTstack架构)

深藏阁楼爱情的钟 2024-04-18 20:55 134阅读 0赞

与任何其他通信堆栈一样,BTstack是一组相互交互的状态机。每个协议和服务都有一个或多个状态机。该架构的其余部分遵循以下基本设计准则:

  • 单线程设计 - BTstack不使用或需要多线程来处理数据源和定时器。相反,它使用单个运行循环。
  • 无阻塞 - 如果需要蓝牙处理,其结果将通过注册的数据包处理程序作为事件传递。
  • 没有人为限制的缓冲区/池 - 传入和传出的数据包不会排队。
  • 静态有界内存(可选) - 可以配置最大连接数/通道数/服务数。

图下方示出了一个基于BTstack-单线程应用程序,包括BTstack运行循环的一般架构。主应用程序包含应用程序逻辑,例如,读取传感器值并通过通信逻辑将其作为SPP服务器提供。通信逻辑通常被建模为有限状态机,其中事件和数据来自主应用程序或来自BTstack经由注册的分组处理程序(PH)。BTstack的Run Loop负责提供定时器和处理传入数据。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhcHB5Z3JpbGNsaA_size_16_color_FFFFFF_t_70

单螺纹设计

BTstack不使用或需要多线程。它使用单个运行循环来处理数据源和计时器。数据源代表通信接口,如UART或USB驱动程序。BTstack使用定时器来实现各种与蓝牙相关的超时。例如,在20秒后断开蓝牙基带信道而没有活动的L2CAP信道。它们还可用于处理定期事件。在运行循环周期期间,将调用所有已注册数据源的回调函数。然后,执行准备好的定时器的回调函数。

要使BTstack适应多线程环境,请在此处查看。

没有任何阻止

蓝牙逻辑是事件驱动的。因此,所有BTstack函数都是非阻塞的,即所有不能立即返回的函数都会实现异步模式。如果函数的参数有效,则将必要的命令发送到蓝牙芯片组,并且函数返回成功值。实际结果稍后通过注册的数据包处理程序作为异步事件传递。

如果蓝牙事件触发应用程序的较长处理,则应将处理拆分为较小的块。然后,包处理程序可以调度管理块的顺序执行的计时器。

没有人为限制的缓冲区/池

传入和传出数据包未排队。BTstack在从蓝牙芯片组接收下一个数据包之前将其传送到应用程序。因此,它依赖于蓝牙芯片组的链路层来在需要时减慢远程发送器的速度。

类似地,应用程序必须使其数据包生成适应远程接收器以传出数据。L2CAP依赖于发送方和接收方之间的ACL流量控制。如果蓝牙模块中没有空闲ACL缓冲区,则无法发送应用程序。对于RFCOMM,强制性的基于信用的流量控制还限制了数据发送速率。如果应用程序具有RFCOMM信用,则该应用程序只能发送RFCOMM数据包。

静态有限的记忆

BTstack必须跟踪各种协议层上的服务和活动连接。可以配置最大连接/通道/服务的数量。此外,远程设备名称和链接密钥的非持久性数据库也需要内存,也可以进行配置。这些数字决定了静态内存分配的数量。

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 4.0BLE中协议详解

    蓝牙4.0BLE协议栈介绍 问题:什么是BLE协议栈?BLE协议栈与BLE协议的关系?   顾名思义,人类之间需要一种语言才能沟通,机器之间,电子之间也有一个标准,也就是作