一、概述
1、BLE蓝牙协议栈结构
附图6 BLE蓝牙协议栈结构图
分为两部分:控制器和主机。对于4.0以前的蓝牙,这两部分是分开的。所有profile(姑且称为剧本吧,用来定义设备或组件的角色)和应用都建构在GAP或GATT之上。下面由结构图的底层组件开始介绍。
· PHY层,工作车间,1Mbps自适应跳频GFSK(高斯频移键控),运行在免证的2.4GHz
· LL层为RF控制器,控制室,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。五种状态切换描述为:未连接时,设备广播信息(向周围邻居讲“我来了”),另外一个设备一直监听或按需扫描(看看有没有街坊邻居家常里短可聊,打招呼“哈,你来啦”),两个设备连接初始化(搬几把椅子到院子),设备连接上了(开聊)。发起聊天的设备为主设备,接受聊天的设备为从设备,同一次聊天只能有一个意见领袖,即主设备和从设备不能切换。
· HCI层,为接口层,通信部,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制。
· L2CAP层,物流部,行李打包盒拆封处,提供数据封装服务
· SM层,保卫处,提供配对和密匙分发,实现安全连接和数据交换
· ATT层,库房,负责数据检索
· GATT层,出纳/库房前台,出纳负责处理向上与应用打交道,而库房前台负责向下把检索任务子进程交给ATT库房去做,其关键工作是把为检索工作提供合适的profile结构,而profile由检索关键词(characteristics)组成。
· GAP层,秘书处,对上级,提供应用程序接口,对下级,管理各级职能部门,尤其是指示LL层控制室五种状态切换,指导保卫处做好机要工作。
TI的这款CC2540器件可以单芯片实现BLE蓝牙协议栈结构图的所有组件,包括应用程序。
2、任务调度---OSAL操作系统抽象层
正如一个公司为了实现扩大产能和产品多样化,建立了多个办公室和工厂一样,蓝牙为了实现同多个设备相连,或实现多功能,也实现了功能扩充,这就产生了调度问题。因为,虽然软件和协议栈可扩充,但终究最底层的执行部门只有一个。
为了实现多事件和多任务切换,需要把事件和任务对应的应用,以及其相关的提供支撑“办公室”和“工厂”打包起来,并起一个名字OSAL操作系统抽象层,类似于集团公司以下的子公司。
3、设备改造---HAL硬件抽象层
如果实现软件和硬件的低耦合,使软件不经改动或很少改动即可应用在另外的硬件上,这样就方便硬件改造、升级、迁移后,软件的移植。HAL硬件抽象层正是用来抽象各种硬件的资源,告知给软件。其作用类似于嵌入式系统设备驱动的定义硬件资源的h头文件。其角色类似于现代工厂的设备管理部。
4、BLE低功耗蓝牙系统架构
附图7 BLE低功耗蓝牙系统架构图,图中的Task用附图6BLE蓝牙协议栈结构图来描述
BLE低功耗蓝牙软件有2个主要组成: OSAL操作系统抽象层和 HAL硬件抽象层,多个Task任务和事件在OSAL管理下工作,而每个任务和事件又包括3个组成:BLE 协议栈,profiles和应用程序。
附图7同样可以用现代工厂模式来类比,如附图8。
附图8 BLE低功耗蓝牙软件5个主要组成用现代工厂架构来类比。
有了上面的简介,下面对OSAL、HAL和BLE进行稍微深入的介绍。
二、OSAL操作系统抽象层
1、软件功能由OSAL管理下的事件来实现
OSAL作为调度核心,BLE协议栈、profile定义、所有的应用都围绕它来实现。OSAL不是传统大家使用的操作系统,而是一个允许软件建立和执行事件的循环。
软件功能是由任务事件来实现的,创建一个任务事件需要以下工作:
· 创建task identifier任务ID;
· 编写任务初始化(task initialization routine)进程,并需要添加到OSAL初始化进程中,这就是说系统启动后不能动态添加功能;
· 编写任务处理程序;
· 如有需要提供消息服务。
BLE协议栈的各层都是以OSAL任务方式实现,由于LL控制室的时间要求最为迫切,所以其任务优先级最高。为了实现任务管理,OSAL通过消息处理(messageprocess),存储管理,计时器定时等附加服务实现。
2、系统启动流程
为了使用OSAL,在main函数的最后要启动一个名叫osal_start_system的进程,该进程会调用由特定应用决定的启动函数osalInitTasks(来启动系统)。osalInitTasks逐个调用BLE协议栈各层的启动进程来初始化协议栈。随后,设置一个任务的8bit任务ID(task ID),跳入循环等待执行任务,系统启动完成。
3、任务事件与事件处理
进程优先级和任务ID
· 任务优先级决定于任务ID,任务ID越小,优先级越高
· BLE协议栈各层的任务优先级比应用程序的高
· 初始化协议栈后,越早调入的任务,任务ID越高,优先级越低,即系统倾向于处理新到的任务
事件变量和旗语
每个事件任务由对应的16bit事件变量来标示,事件状态由旗号(taskflag)来标示。如果事件处理程序已经完成,但其旗号并没有移除,OSAL会认为事情还没有完成而继续在该程序中不返回。比如,在SimpleBLEPeripheral实例工程中,当事件START_DEVICE_EVT发生,其处理函数SimpleBLEPeripheral_ProcessEvent就运行,结束后返回16bit事件变量,并清除旗语SBP_START_DEVICE_EVT。
事件处理表单
每当OSAL事件检测到了有任务事件,其相应的处理进程将被添加到由处理进程指针构成的事件处理表单中,该表单名叫taskArr(taskarray)。taskArr中各个事件进程的顺序和osalInitTasks初始化函数中任务ID的顺序是对应的。
事件调度的方法
有两种,最简单的方法是使用osal_set_event函数(函数原型在OSAL.h文件中),在这个函数中,用户可以像定义函数参数一样设置任务ID和事件旗语。第二种方法是使用osal_start_timerEx函数(函数原型在OSAL_Timers.h文件中),使用方法同osal_set_event函数,而第三个以毫秒为单位的参数osal_start_timerEx则指示该事件处理必须要在这个限定时间内,通过定时器来为事件处理计时。
4、存储管理
类似于Linux嵌入式系统内存分配C函数mem_alloc,OSAL利用osal_mem_alloc提供基本的存储管理,但osal_mem_alloc只有一个用于定义byte数的参数。对应的内存释放函数为osal_mem_free。
5、进程间通信—通过消息机制实现
不同的子系统通过OSAL的消息机制通信。消息即为数据,数据种类和长度都不限定。
消息收发过程描述如下:
接收信息,调用函数osal_msg_allocate创建消息占用内存空间(已经包含了osal_mem_alloc函数功能),需要为该函数指定空间大小,该函数返回内存空间地址指针,利用该指针就可把所需数据拷贝到该空间。
发送数据,调用函数osal_msg_send,需为该函数指定发送目标任务,OSAL通过旗语SYS_EVENT_MSG告知目标任务,目标任务的处理函数调用osal_msg_receive来接收发来的数据。建议每个OSAL任务都有一个消息处理函数,每当任务收到一个消息后,通过消息的种类来确定需要本任务做相应处理。消息接收并处理完成,调用函数osal_msg_deallocate来释放内存(已经包含了osal_mem_free函数功能)。
三、硬件抽象层HAL
当新的硬件平台做好后,只需修改HAL,而不需修改HAL之上的协议栈的其他组件和应用程序。
四、BLE低功耗蓝牙协议栈
1、BLE库文件
TI蓝牙协议栈是以单独一个库文件提供的,并没有提供源代码,因此不做深入说明。对于TI的BLE实例应用,这个单独库文件已经够用,列出了所有的库文件。
附图9 BLE库文件
由于GAP和GATT与用户程序直接交互,因此下文对库文件中GAP和GATT一一讲解。
2、GAP秘书处
2.1角色(即服务,功能)
GAP运行在如下四种角色的一种:
· Broadcaster 广播员—我在,但只可远观,不可连接。
· Observer 观察员—看看谁在,但我只远观,不连接。
· Peripheral 外设(从机)—我在,谁要我就跟谁走,协议栈单层连接。
· Central 核心(主机)—看看谁在,并且愿意跟我走我就带她/他走,协议栈单层或多层连接,目前最多支持3个同时连接。
虽然指标显示BLE可以同时扮演多个角色,但是在TI提供的BLE实例应用中缺省只支持外设角色。每一种角色都由一个剧本(roleprofile)来定义。
2.2连接
主从机连接过程
一个典型的低功耗蓝牙系统同时包含外设和核心(主机),两者的连接过程如下:
外设角色向外发送自己的信息(设备地址、名字等),主机收到外设广播信息后,发送扫描请求(scanrequest)给外设,外设响应主机的请求,连接建立完成。
信驰达科技(深圳)有限公司 ©2020电子产品世界商机平台
技术支持:商机平台ec.eepw.com.cn