TI BLE协议栈软件框架分析

看源代码的时候,一般都是从整个代码的入口处开始,TI  BLE 协议栈源码也不例外。它的入口main()函数就是整个程序的入口,由系统上电时自动调用。

它主要做了以下几件事情:

(一)底层硬件初始化配置

(二)创建任务并初始化任务配置

(三)检测并执行有效的任务事件

Main() 函数源码如下:

一:底层硬件初始化设置

75行,设置系统时钟,使能内存缓冲功能。

78行,关中断,刚启动时,系统运行不稳定,一般会首先关中断。

81行,硬件相关的I/O 口配置。

84行,初始化mcu 内部的flash。

92行,开中断,当系统运行到这里的时候,状态已经很稳定,可以将中断打开。

95行,I/O功能配置,及设置按键回调函数指针。

98行,配置省电模式。

二:创建任务并初始化任务配置

89行,最主要的功能就是给创建所有的任务。

三:检测并执行有效的任务事件

102行,此函数是整个程序运行的核心,一旦进入,就循环执行所有的任务,永远不会结束。

下面分别列出这3个部分的主要源代码,并以按键KEY的配置为线索进行分析:

===================================================================

一:底层硬件初始化设置

a.        HalDriverInit() 主要是硬件抽象层初始化,配置PIN脚的工作模式。

比如ADC,UART,KEY,LCD等。

147行,HalKeyInit()是按键I/O配置,下面以此举例说明:

211-223行,将相应的PIN配置为GPIO,输入模式。

226行,初始化按键回调函数指针pHalKeyProcessFunction为NULL。

此回调函数在程序中的作用是,当driver层检测到按键中断后,只需要调用回调函数指针即可,至于函数执行什么功能则完全由用户层自己决定,这样的做的好处是将用户层与driver层分离,提高代码的模块化及可操作特性。

b.        InitBoard( OB_READY ),配置KEY  GPIO的中断功能

126行,HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback)此函数中配置中断使能,设置按键回调函数指针pHalKeyProcessFunction为OnBoard_KeyCallback。

OnBoard_KeyCallback()里面会继续调用函数OnBoard_SendKeys(),其功能是发送按键message给相应的任务。

硬件配置好后,只能说明硬件具备完成相应功能的条件,但是如何让它的功能实现,那就需要创建相应的应用程序来让硬件工作起来,这个程序就叫task,那task是如何创建的呢?

下面接着分析,如何创建task。

二:创建任务并初始化任务配置

前面讲过主函数main()89行osal_init_system(),主要功能是初始化系统设置,其中最重要的一个功能就是创建task,下面是创建task的源代码

122行,申请tasksEvents内存空间

123行,清零tasksEvents内存空间

126行,链路层task初始化

129行,硬件抽象层task初始化

132行,主机控制接口层task初始化

141行,逻辑链路控制及自适应协议层task初始化

144-156行,通用属性配置文件层task初始化

150行,安全管理层task初始化

159行,客户应用层task初始化

每个task 初始化时都会分配一个taskID,而且是从0 递增。

以Hal_Init(taskID++ )为例,从上面代码可以看出来,硬件抽象层的taskID值是1

92行,将task_id形参赋值给Hal_TaskID,故初始化后Hal_TaskID等于1

由于Hal_TaskID是定义为一个全局变量,因此,整个程序中,只要是与Hal_TaskID有关系的事情,都会交给Hal 层的task处理。

同样的道理,SimpleBLECentral_Init(taskID++)中会定义一个simpleBLETaskId,那么所有与simpleBLETaskId有关系的事情,也都会交给应用层任务函数处理。

那各层的任务函数是在哪里定义的呢?

在OSAL_simpleBLECentral.c文件中,定义了一个函数指针数组如下:

87行,Hal_ProcessEvent即为Hal层的任务处理函数指针,它是数组的第2个元素tasksArr[1],也就是说如果程序中要调用Hal层任务,直接写语句“tasksArr[1]();”

函数Hal_ProcessEvent()就会被执行了。

Task虽然被创建好了,但是task是要执行我们给它规定的功能的,那它是在哪里执行的呢?

接下来详细分析task 的执行的问题。

三:检测并执行有效的任务事件

系统中task 的执行,是由事件(evnet)来驱动的,程序会循环检测所有的task,如果发现某个task有新的event未被处理,那么这个task就会被调用。

osal_start_system()是整个程序的核心,里面是一个for死循环,不停调用函数osal_run_system(),它的实际功能就是不停检测是否有event产生,如果有event,就执行对应的task,请看源码:

1105行,定时器查询函数,它会检查所有的定时器,如果某个定时时间到达,就将相应的event 加入到tasksEvents[task_id],这里task_id的值是添加定时器时设置好的,具体请看osal_set_event()函数代码。

1110-1115行,检查所有任务,是否有需要执行的event发生,并记录这个event的索引idx。

1117行,taskCnt 是系统添加的任务个数,也就是tasksArr[]数组中元素的个数。

1123行,保存当前任务的将要执行的所有event。

1124行,清除当前任务的所有event。

1127行,保存当前任务的idx,供系统自己使用。

1128行,根据当前任务索引idx,在指针数组tasksArr[]中寻址当前任务的函数指针,调用当前任务函数,处理其中一个event,处理完毕后,返回还未处理的event。

1132行,将未处理的event恢复给当前任务事件变量保存,等待下一次再处理,直至处理问所有的event。

总结:

本节只是讲解了协议栈的主体框架,协议栈只是一个基础平台,在不同的方案中,就有不同的应用功能,相应的就必须为应用添加不同的task来实现实际的功能。

通过本节讲解,添加一个task的基本步骤如下:

1.        在HAL层配置任务要用到的I/O 的属性(如果不涉及I/O操作,则可省略此步骤)

2.        在数组tasksArr[]中添加任务(task)处理函数

3.        在函数osalInitTasks()中初始化任务task

根据上面的步骤我们可以很容易创建一个task。但是,如果程序中没有产生task的事件(event),task永远都不会运行。

这就有一个新的问题:event在什么情况下产生?它又是如何产生?

我们将在【事件和消息工作机制】一节中详细分解。

TI BLE协议栈软件框架分析,布布扣,bubuko.com

时间: 2024-09-29 00:44:10

TI BLE协议栈软件框架分析的相关文章

Android Bitmap 开源图片框架分析(精华三)

主要介绍这三个框架,都挺有名的,其他的框架估计也差不多了 Android-Universal-Image-Loaderhttps://github.com/nostra13/Android-Universal-Image-Loader ImageLoaderhttps://github.com/novoda/ImageLoader Volley(综合框架,包含图片部分)https://github.com/mcxiaoke/android-volley 扯淡时间,可以跳过这段这些开源框架的源码还

软件框架和软件架构的区别?

初学java,遇到jdk,sdk概念:软件开发工具包(外语首字母缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. 软件包:(SoftWare Package)是指具有特定的功能,用来完成特定任务的一个程序或一组程序. 开发工具:包含编辑.编译.解释执行(C中是链接执行)等功能. 一.软件框架 ?软件框架是面向领域(如ERP.计算领域等)的.可复用的"半成品"软件

【转】TI Z-stack协议栈学习-添加新任务

开始学习TI的zigbee协议栈,无线龙的资料看得比较乱,在网络找到不少分析协议栈的文章,先贴上来,等自己有空了再好好原创一下吧. 协议栈版本:ZStack-1.4.3-1.2.1 TI Z-stack协议栈学习-添加新任务 1.Zstack中如何实现自己的任务 http://zhenling.chen.blog.163.com/blog/static/1940851920097710392587/ 在Zstack(TI的Zigbee协议栈)中,对于每个用户自己新建立的任务通常需要两个相关的处理

VS2010/MFC编程入门之四(MFC应用程序框架分析)

VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行流程. 一.SDK应用程序与MFC应用程序运行过程的对比        程序运行都要有入口函数,在之前的C++教程中都是main函数,

需求评审五个维度框架分析及其带来的启示-3-典型需求评审

典型情境是指软件开发的常见情境,本文选择如下来进行分析: 1. 传统瀑布模型开发下的需求评审 2. 使用IEEE Std. 1028的需求评审 3. 敏捷开发下的需求评审 传统瀑布模型下的需求评审 对传统瀑布模型现有需求评审的分析 传统瀑布模型在需求阶段末期安排有关键的需求里程碑评审,其特征参见2.8节情况1.在业界实际操作中,往往出现如下情况: 1,召集包括领导在内的各方代表,历经1-2小时会议,评审30页以上需求规格说明书,走过场式各方签字通过评审: 2,各方对需求规格书有各种各样意见,历经

DM8168 DVRRDK软件框架研究

转载注明:http://blog.csdn.net/guo8113/article/details/41120491 Netra(DM8168)处理器是个多核处理器,每个核之间相互独立却又相互关联,如何高效简洁地利用每个核完成一套系统功能是非常关键的,RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案,主要用于DVR.NVR.IPNC之类的产品. 这个软件框架结构允许用户创建不同的多路数据流来实现视频的采集.视频处理(DEI.Noise Filter.Encode.Decode.

netfilter-IPv4实现框架分析(一)

基于Linux-2.6.30版本,具体实现net\ipv4\netfilter目录下,入口文件为net\ipv4\netfilter\iptable_filter.c,入口/出口函数为模块的init函数iptable_filter_init()和uninit函数iptable_filter_fini() iptable_filter_init()函数流程如下 1.register_pernet_subsys(&iptable_filter_net_ops),其作用初步看是用于注册报文匹配目标规则

微享商盟小程序开发系统框架分析

从微信小程序发布这段时间,陆陆续续开发了不少小程序相关的项目,总结了一些通用性的组件,但是对于小程序如何做测试,依然是一头雾水,直到做了不少的项目,积累的一些经验和开源库之后才理清如何做测试,下面将会介绍如何对小程序做UI测试和单元测试. 微信小程序微享商盟具体做什么? --举例,顾客到某水果店购买商品后通过微信小程序共享链支付成功后进入微信小程序微享商盟小程序,该小程序里面会显示消费者的消费金额,奖励金额和已经到账金额,之后其他消费者也到该水果店消费,那微信小程序微享商盟系统会做一个时间排序,

深入浅出低功耗蓝牙(BLE)协议栈

BLE协议栈为什么要分层?怎么理解BLE"连接"?如果BLE协议只有ATT层没有GATT层会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提.在深入BLE协议栈各个组成部分之前,我们先看一下BLE协议栈整体架构. 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己