蓝牙协议栈(二、BTstack架构)
与任何其他通信堆栈一样,BTstack是一组相互交互的状态机。每个协议和服务都有一个或多个状态机。该架构的其余部分遵循以下基本设计准则:
- 单线程设计 - BTstack不使用或需要多线程来处理数据源和定时器。相反,它使用单个运行循环。
- 无阻塞 - 如果需要蓝牙处理,其结果将通过注册的数据包处理程序作为事件传递。
- 没有人为限制的缓冲区/池 - 传入和传出的数据包不会排队。
- 静态有界内存(可选) - 可以配置最大连接数/通道数/服务数。
图下方示出了一个基于BTstack-单线程应用程序,包括BTstack运行循环的一般架构。主应用程序包含应用程序逻辑,例如,读取传感器值并通过通信逻辑将其作为SPP服务器提供。通信逻辑通常被建模为有限状态机,其中事件和数据来自主应用程序或来自BTstack经由注册的分组处理程序(PH)。BTstack的Run Loop负责提供定时器和处理传入数据。
单螺纹设计
BTstack不使用或需要多线程。它使用单个运行循环来处理数据源和计时器。数据源代表通信接口,如UART或USB驱动程序。BTstack使用定时器来实现各种与蓝牙相关的超时。例如,在20秒后断开蓝牙基带信道而没有活动的L2CAP信道。它们还可用于处理定期事件。在运行循环周期期间,将调用所有已注册数据源的回调函数。然后,执行准备好的定时器的回调函数。
要使BTstack适应多线程环境,请在此处查看。
没有任何阻止
蓝牙逻辑是事件驱动的。因此,所有BTstack函数都是非阻塞的,即所有不能立即返回的函数都会实现异步模式。如果函数的参数有效,则将必要的命令发送到蓝牙芯片组,并且函数返回成功值。实际结果稍后通过注册的数据包处理程序作为异步事件传递。
如果蓝牙事件触发应用程序的较长处理,则应将处理拆分为较小的块。然后,包处理程序可以调度管理块的顺序执行的计时器。
没有人为限制的缓冲区/池
传入和传出数据包未排队。BTstack在从蓝牙芯片组接收下一个数据包之前将其传送到应用程序。因此,它依赖于蓝牙芯片组的链路层来在需要时减慢远程发送器的速度。
类似地,应用程序必须使其数据包生成适应远程接收器以传出数据。L2CAP依赖于发送方和接收方之间的ACL流量控制。如果蓝牙模块中没有空闲ACL缓冲区,则无法发送应用程序。对于RFCOMM,强制性的基于信用的流量控制还限制了数据发送速率。如果应用程序具有RFCOMM信用,则该应用程序只能发送RFCOMM数据包。
静态有限的记忆
BTstack必须跟踪各种协议层上的服务和活动连接。可以配置最大连接/通道/服务的数量。此外,远程设备名称和链接密钥的非持久性数据库也需要内存,也可以进行配置。这些数字决定了静态内存分配的数量。
还没有评论,来说两句吧...