原创 TI蓝牙BLE 协议栈代码学习——OSAL(上)

2015-9-21 16:09 13035 19 21 分类: MCU/ 嵌入式 文集: CC254x蓝牙BLE4.0协议栈学习笔记

 TI的蓝牙4.0BLE协议栈为BLE-CC254x-1.4.0,即现在的版本是1.4版本的。可以从TI官方下载或从附件中下载安装,默认是安装在C盘中。因为上一篇博文提到进行空中固件升级,当时没有安装在C盘下,死活生成不了bin文件,改在C盘下生成了。所以,我个人建议,还是默认安装吧,也占不了多大空间。

TI蓝牙4.0BLE协议栈的结构如下图所示:

20140316164134267.jpg

由控制器和主机两部分构成,分层的思想很明晰。

主机包括物理层PHY、数据链路层LL和主机控制器接口HCI构成。物理层PHY1Mbps自适应跳频的GFSK射频,工作于免许可证的2.4G频段。数据链路层LL用于控制设备的射频状态,使设备工作于Standby(准备)、Advertising(广播)、Scanning(扫描)、Initiating(初始化)、Connected(连接)五种状态中的一种。主机控制器接口HCI为主机和控制器之前提供标准的通信接口。

主机包括逻辑链路控制及自适应协议层L2CAP、安全管理层SM、属性协议层ATT、通用访问配置文件层GAP、通用属性配置文件层GATT构成。逻辑链路控制及自适应协议层L2CAP为上层提供数据封装服务,允许逻辑上的点对点通信。安全管理层SM配对和密钥分发服务,实现安全连接和数据交换。属性协议层ATT允许设备向其他设备展示一块特定的数据,这块数据称之为“属性”。通用属性配置文件层GATT定义了使用ATT的服务框架和配置文件(profile),BLE中所有数据的通信都要通过GATT层。通用访问配置文件层GAP提供设备通信的接口,负责处理访问模式和程序,包括设备发现、建立连接、终止连接、初始化安全和设备配置等。对于我们来说,直接接触的是GAPGATT两个层。

最早接触这个项目的时候,听说CC2540/254151内核的SOC,当时我心想,毛毛雨啦,51的东东还不简单。等真接手了才发现,头大了,TI的工程师把协议栈封装和规划得都很好,不能不佩服。

先分析协议栈的流程吧,这里以TIKeyFobDemo为例,该工程位于C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\KeyFob中。先看下工程的架构。对于我们开发来说,AppProfile两个文件夹中的内容是最主要的。

20140316164218308.jpg

先从main()函数入手,打开App文件夹下的KeyFob_Main.c,找到main()函数:

int main(void)

{

  /* Initialize hardware */

  HAL_BOARD_INIT();//初始化硬件

 

  // Initialize board I/O

  InitBoard( OB_COLD );//初始化板卡IO

 

  /* Initialze the HAL driver */

  HalDriverInit();//初始化HAL层驱动

 

  /* Initialize NV system */

  osal_snv_init();//初始化Flash

 

  /* Initialize LL */

 

  /* Initialize the operating system */

  osal_init_system();//初始化OSAL

 

  /* Enable interrupts */

  HAL_ENABLE_INTERRUPTS();//使能中断

 

  // Final board initialization

  InitBoard( OB_READY );//完成板卡初始化

 

  #if defined ( POWER_SAVING )

    osal_pwrmgr_device( PWRMGR_BATTERY );//开启低功耗模式

  #endif

   

  /* Start OSAL */

  osal_start_system(); // No Return from here //启动OSAL

 

  return 0;

}

////////////////

上述代码,我加入了简单的中文注释,会发现有个很重要的东西——OSALOperation System Abstraction Layer,操作系统抽象层。OSAL还不是操作系统,但是实现了OS的很多功能。从前面的代码中我们可以看到,跟OSAL相关的有两个函数osal_init_system()osal_start_system()osal_pwrmgr_device()暂时先不去理会)。我们依次来看看。

IAR环境中,可以在代码中osal_init_system()上单击鼠标右键,打开“Go to definition of osal_init_system”,

20140316215303364.jpg

osal_init_system()OSAL.c中,下面就是该函数的代码:

uint8 osal_init_system( void )

{

  // Initialize the Memory Allocation System

  osal_mem_init();//初始化内存分配系统

 

  // Initialize the message queue

  osal_qHead = NULL;//初始化消息队列

 

  // Initialize the timers

  osalTimerInit();//初始化定时器

 

  // Initialize the Power Management System

  osal_pwrmgr_init();//初始化电源管理系统

 

  // Initialize the system tasks.

  osalInitTasks();//初始化系统任务

 

  // Setup efficient search for the first free block of heap.

  osal_mem_kick();

 

  return ( SUCCESS );

}

该函数是完成一系列的初始化,跟操作系统有关的,仿佛是osalInitTasks(),我们进到这个函数里面。osalInitTasks()OSAL_KeyfobDemo.c中。

void osalInitTasks( void )

{

  uint8 taskID = 0;

 

  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);

  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));

 

  /* LL Task */

  LL_Init( taskID++ );

 

  /* Hal Task */

  Hal_Init( taskID++ );

 

  /* HCI Task */

  HCI_Init( taskID++ );

 

#if defined ( OSAL_CBTIMER_NUM_TASKS )

  /* Callback Timer Tasks */

  osal_CbTimerInit( taskID );

  taskID += OSAL_CBTIMER_NUM_TASKS;

#endif

 

  /* L2CAP Task */

  L2CAP_Init( taskID++ );

 

  /* GAP Task */

  GAP_Init( taskID++ );

 

  /* GATT Task */

  GATT_Init( taskID++ );

 

  /* SM Task */

  SM_Init( taskID++ );

 

  /* Profiles */

  GAPRole_Init( taskID++ );

  GAPBondMgr_Init( taskID++ );

 

  GATTServApp_Init( taskID++ );

 

  /* Application */

  KeyFobApp_Init( taskID );

}

从每行代码,可以看到整个事件初始化的过程也是分层的。从链路层任务初始化(LL_Init)到硬件抽象层(Hal_Init)、主机控制器接口(HCI_Init)、逻辑链路控制及自适应协议层(L2CAP_Init)、GAP层(GAP_Init)、GATT层(GATT_Init)、安全管理层(SM_Init)。然后完成GAP层的配制(GAPRole_Init)、蓝牙绑定的管理初始化(GAPBondMgr_Init)及GATT层服务的初始化(GATTServApp_Init)。最后完成的是应用层的初始化(KeyFobApp_Init)。程序是一行一行地执行,各层的任务也是依次的完成初始化。  

文章评论2条评论)

登录后参与讨论

用户377235 2015-4-14 17:02

无线通信(zigbee,wifi,ble)367702028现在里面人不是太多,但是都是openwrt研发高手在里面,有学习需要或学习上有问题和想交流下的欢迎一起探讨提高。

用户377235 2014-12-5 14:12

附件里面有么?
相关推荐阅读
飞言走笔 2017-01-06 21:56
2017,新的博客旅程
EDNChina 改版终于成功了!祝贺! 2017年,开始新的旅程~ ...
飞言走笔 2016-06-01 10:17
【博客大赛】《白鹿原》读后
《白鹿原》这本书已经买了很久,多次以来,都是只翻看几页,顶多几章就放下了,觉得这是一个大部头,得有足够的时间才行。前几天陈忠实先生去世的消息传来,让我很震惊和惭愧。 一口气读完这本书,畅快淋漓,又意...
飞言走笔 2016-03-26 16:42
【博客大赛】《毛斯朝》读后
这本书最早是在凤凰卫视曾子墨主持的一期关于沈志华先生的《世纪大讲堂》节目中知晓的。但是一直拖到今天才读完。 说实话,书的主要内容与当前官方的宣传口径有很多不一致的地方,而沈先生作为中国掌握苏联档...
飞言走笔 2016-03-08 13:46
【博客大赛】蓝牙4.0低功耗技术及其认证要求
详见附件 ...
飞言走笔 2016-02-02 14:20
【转】蓝牙4.0协议官方手册(一)——通用属性配置文件
转自:http://blog.csdn.net/jinzhichaoshuiping/article/details/43370009 通用属性配置文件 (GATT)——该说明书定义了通用属性配置...
飞言走笔 2016-01-31 23:24
【博客大赛】脑洞大开、三观重塑——《人类简史》读后
终于读完了《人类简史》,没有把这本书拖到二月份,这也是2016年读完的第一本书。之前也有所耳闻,但是没有太在意,倒是罗胖子的跨年演讲上偶然提到,不知怎么就勾起了阅读此书的欲望。 本文的标题用了“脑洞...
我要评论
2
19
关闭 站长推荐上一条 /2 下一条