C语言蓝牙协议栈讲解,蓝牙协议栈记录—BTStack

TSTack User Guid 翻译过来的

1.简介

2.BTStack 架构

BTStack在所实现的协议和服务之间采用很多状态机实现相互作用,特点:

<1>单线程.BTStack只有一个单独的循环。

<2>没有阻塞,采用event事件方式。

<3>No artficially limited buffers/pools-Incoming and out going data packets are not queued

<4>Statically bouneded memory--最大连接\通道\服务数都可以配置

C语言蓝牙协议栈讲解,蓝牙协议栈记录—BTStack_第1张图片

上图单线程应用架构。

3.怎样使用BTStack

3.1 协议和服务

BTStack已经实现了HCI、L2CAP、L2CAP-LE、RFCOMM、SDP和ATT。如下图所示.BTStack为HCI,L2CAP,EFCOMM和SDP提供了各种API接口,可直接使用.

C语言蓝牙协议栈讲解,蓝牙协议栈记录—BTStack_第2张图片

BTStack有个重要的结构,service.一个service代表表示一个处理输入连接的服务器端。目前BTStack实现了两个服务,RFCOMM和L2CAP service.LECAP服务处理连接到L2CAP通道的连接,并用协议服务复用器(PSM)注册。RFCOMM服务则处理连接到RFCOMM连接的输入,并用RFCOMM通道ID注册。对于输出则不需要特别的注册,在应用需要的时候会创建.

3.2 内存配置

service 结构体,活跃的连接和远端设备可分为两种不同的方式:

<1>静态的个体的内存池,最大元素在config配置文件中定义。调用btstack_memory_init函数初始化静态内存池。

<2>使用malloc/free 函数动态分配,要在config文件中定义HAVE_MALLOC.

如果同时定义了上述两种方法,则静态分配优先,反之,两者都没定义,则会报错.

函数btstack_memory_init完成内存的设置.

3.3 Run loop

BTStack运行runloop来处理输入数据、安排工作.runloop处理两个来自完全不同类型源的事件:数据源和定时器.数据源表示通讯接口比如UART和USB驱动。定时器用于实现各种蓝牙相关的超时.也可用于处理周期性的事件.

数据源和定时器分别通过结构体data_source_t和timer_source_t表示.每个结构体都包含一个链接列表节点和一个指向回调函数的指针。所有活跃的定时器和数据源都保存在链接列表中。不同的是列表中的数据源没有分类,而定时器是通过失效分类的从而高效处理.完整的run loop循环运行步骤:

<1>轮训运行所有已注册的数据源的回调函数。

<2>执行已就绪的定时器的回调函数.

<3>是否有中断处理请求,没有的话则进入sleep模式.

通过UART、USB或者定时器tick的输入数据会产生中断并叫醒处理器。为了避免在run loop刚好进入睡眠模式的时候发生数据源中断,中断驱动的数据源必须调用embeded_trigger函数.该函数设置一个内部标识在刚进入睡眠模式的临界点中进行判断.

定时器都是单发的:在定时器事件处理函数被执行之前是从定时器列表中移除的.如果定时器是周期的,就在回调函数中再重新注册同样的定时器源.注意,要使用定时器,必须在config文件中定义HAVE_TICK。在代码中,run loop通过调用run_loop_init函数实现:

run_loop_init(RUN_LOOP_EMBEDED);

3.4 BTStack 初始化

初始化BTStack,要先初始化内存和run loop,然后设置HCI和其他所需要的高层协议.

HCI初始化要调整BTStack以适应所采用的平台,并需要四个参数:

<1>Bluetooth hardware control: 蓝牙硬件控制API用一个定制的初始化脚本提供HCI层、制造商特殊的波特率改变命令,以及系统电量通知。也可用于控制蓝牙模块的电源模式。此外还提供一个错误处理函数hw_error,当蓝牙模块报告硬件错误的时候,会调用该函数.bt_control_t结构体封装了常用的功能,比如,bt_control_cc256x_in-stance函数返回一个指针到适合CC256X芯片的控制结构体.

b t_ c o n t r o l _t  * c o n t r o l = b t_ c o n t r o l_ c c 2 5 6 x_ i n s t a n c e ( ) ;

<2>HCI 传输层实现:嵌入式系统中,蓝牙模块可通过UART,或USB端口连接。BTStack实现了两种基于UART的协议:HCI UART 传输层(H4)和带有eHCILL H4(TI的一种轻量级低功耗的变体).这可以通过连接不同的合适的文件而实现,然后获取一个指向HCI传输层实现的指针,比如:

6fc5d799f28ca23efa3f5edd363bade6.png

<3>HCI传输层配置:

因为H4传输

你可能感兴趣的:(C语言蓝牙协议栈讲解)