协议栈工作原理介绍
CC2540集成了增强型的8051内核,TI为BLE协议栈搭建了一个简单的操作系统,即一种任务轮询机制。帮你做好了底层和蓝牙协议深层的内容,将复杂部分屏蔽掉。让用户通过API函数就可以轻易用蓝牙4.0,是开发起来更加方便,开发周期也可以相应缩短。
1.1.1工程文件介绍
安装完BLE协议栈之后,会在安装目录下看到以下文件结构:
图 3.2BLE栈目录
可看到Projects文件夹里面有很多工程,我们主要介绍SimpleBLECentral和SimpleBLEPeripheral。
ble文件夹中有很多工程文件,有些是具体的应用,例如
BloodPressure、GlucoseCollector、GlucoseSensor、HeartRate、HIDEmuKbd等都为传感器的实际应用,有相应标准的Profile(即通用的协议)。
其中还有4中角色:SimpleBLEBroadcaster、SimpleBLECentral、SimpleBLEObserver、SimpleBLEPeripheral。
他们都有自己的特点。
•Broadcaster广播员——非连接性的信号装置
•Observer观察者——扫描得到,但不能链接
•Peripheral从机——可链接,在单个链路层链接中作为从机•Central主机——扫描设备并发起链接,在单链路层或多链路层
中作为主机。
最后的BTool文件夹为BLE设备PC端的使用工具。
1.1.2OSAL介绍
协议栈是一个小操作系统。大家不要听到是操作系统就感觉到很复杂。回想
我们当初学习51单片机时候是不是会用到定时器的功能?嗯,我们会利用定时器计时,令LED一秒改变一次状态。好,现在进一步,我们利用同一个定时器计时,令LED1一秒闪烁一次,LED2二秒闪烁一次。这样就有2个任务了。再进一步…有n个LED,就有n个任务执行了。协议栈的最终工作原理也一样。从它工作开始,定时器周而复始地计时,有发送、接收…等任务要执行时就执行。这个方式称为任务轮询。
图 3.3任务轮询
现在我们直接打开协议栈,直接拿他们的东西来解剖!我们打开协议栈文件夹Texas Instruments\BLE-CC254x-1.2.1\Projects
\ble\SimpleBLEPeripheral\CC2540DB里面的工程文件SampleApp.eww。
图 3.4工程文件
打开后在IAR左边可看到左边的工程目录,我们暂时只需要关注App文件夹。
如图 3.5所示:
图 3.5工作空间目录
任何程序都在main函数开始运行,BLE也不例外。打开SimpleBLEPeripheral_Main.c文件,找到int main(void)函数。我们大概浏览一下main函数代码:
图 3.6协议栈主函数
1./**************************************************************
2.*@fn main
3.*@brief Start of application.
4.*@param none
5.*@return none
6.**************************************************************/
7.int main(void)
8.{
9./*Initialize hardware*/
10.HAL_BOARD_INIT();//初始化系统时钟
11.
12.//Initialize board I/O
13.InitBoard(OB_COLD);//初始化I/O,LED、Timer等
14.
15./*Initialze the HAL driver*/
16.HalDriverInit();//初始化芯片各硬件模块
17.
18./*Initialize NV system*/
19.osal_snv_init();//初始化Flash存储器
20.
21./*Initialize LL*/
22.
23./*Initialize the operating system*/
24.osal_init_system();//初始化操作系统
25.
26./*Enable interrupts*/
27.HAL_ENABLE_INTERRUPTS();//使能全部中断
28.//Final board initialization
29.InitBoard(OB_READY);//初始化按键
30.
31.#if defined(POWER_SAVING)
32.osal_pwrmgr_device(PWRMGR_BATTERY);//开启低功耗
33.#endif
34.
35./*Start OSAL*/
36.osal_start_system();
37.//No Return from here执行操作系统,进去后不会返回
38.
39.return0;
40.}
我们大概看了上面的代码后,可能感觉很多函数不认识。没关系,代码很有条理性,开始先执行初始化工作。包括硬件、GATT、GAP层、任务等的初始化。然后执行osal_start_system();操作系统。进去后可不会回来了。在这里,我