在作者之前发表的《全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析》、《全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗》、《全球最低功耗蓝牙单芯片DA14580的软件体系-RW内核和消息处理机制》三篇文章分析了DA14580的SDK开发目录结构、硬件架构、低功耗、RW内核和消息处理机制。本篇文章将深入到具体的源码去分析DA14580平台的软件层次架构和具体的BLE消息处理过程,以此佐证前面发表的文章。

一、软件层次架构

1.1 BLE协议栈

  从中,我们可以看到,BLE协议栈可以大致分为应用层、profile服务层、BLE Host层(软件实现)、BLE controller层(硬件实现,属于基带部分),实际上硬件物理层还有射频层radio,即将基带信息调制到2.4G进行发射或者进行解调。

  BLE host实现数据适配L2CAP、链路管理GAP、基础属性协议ATT,GATT是基于ATT进行封装并向上层提供接口服务,以让用户更方便地使用ATT来进行数据交互。他们都分别对应RW内核的一个或者多个task,例如GAP包括GAP管理和GAP控制两个task。

  Profile层是基于GATT来向应用层提供数据通信服务的,每个profile都负责自己的专有的服务功能。例如,有电池服务、设备信息服务和自定义的一些profile等等。

  GATT是负责基础的数据通信,而profile则是在GATT的基础上进行数据的本地处理。例如,GATT收到对方的写请求时会通知profile,由profile来决定怎么处理接收到的数据,可以写到属性字段中,也可以不写,profile也可以进一步给task_app发送通知。

  各个profile是独立并且平等的,因为各个GATT都是平等服务的。每个profile都对应RW内核的一个task。

  应用层是基于多个profile来实现自己的需求。由于RW内核实质是一个单任务内核,所以应用层是一个特别的task。其和所有的profile打交道,其控制所有profile,并处理各个profile的消息回调。

1.2  task层次

根据上面的分析,我们可以得到以下task层次图:

1.3  task列表

其定义在rwip_config.h中,如下:

  可见,RW内核最大支持64个task,链路层task的优先级高,接着是profile,再是TASK_APP。

二、基于状态机的RW内核消息处理机制

Task数据结构如下:

  RW内核是基于状态机对消息进行处理的。从ke_task_desc看来,一个task包括显式的状态处理state_handler和默认的状态处理default_handler。

  state是task的状态机变量,task可能有多个状态,那么state_handler是状态处理集合,每个状态可能会处理多个消息回调,例如上层task会发送消息来执行调用,或者下层task发送消息来执行回调。

  default_handler处理的消息代表该task在任意状态时都可能受到的消息,例如底层task发出的断开连接消息。

  我们也可以得出,ke_state_handler代表一个状态下的多个消息处理。因此,state_handler是一个ke_state_handler数组,而default_handler则是ke_state_handler元素。

三、app_task

  如上所述,app_task是一个特殊的task,它和所有的profile_tasks进行交互,执行调用和回调。基于RW内核的状态机消息处理机制,调用和回调都是通过发送消息来进行完成回调的。

  app_task是通过ke_task_create(TASK_APP, &TASK_DESC_APP)来注册消息回调的,而TASK_DESC_APP赋值为:

  TASK_DESC_APP= {NULL, &app_default_handler,                                             app_state,APP_STATE_MAX, APP_IDX_MAX};

  可见,app_task只有默认的消息回调接口集app_default_handler。如下:

  默认的消息回调接口集包括了GAP相关的消息(红色圈的部分),如BLE初始化过程的消息事件,和profile应用相关的数据通信消息事件。

  接下来,我们着重分析GAP相关的消息事件,阐述BLE初始化的主要过程。

四、初始化过程

4.1 BLE初始化

  Main_func函数中调用rwip_init()接口对RW的BLE部分进行初始化。该接口是固化代码,不对外公开。BLE初始化执行的过程中会发出相应的消息事件给app_task,以告诉app_task相应的状态,便于app_task主动执行调用下一阶段的初始化。

4.2  初始化过程分析

1.     GAPM_DEVICE_READY_IND

  可见,当BLE初始化好后发出的第一个消息事件是GAPM_DEVICE_READY_IND。内核会执行回调gapm_device_ready_ind_handler,在该回调里面会向TASK_GAPM发出GAPM_RESET_CMD消息,即reset GAP管理模块。

2.     GAPM_CMP_EVT

  当TASK_GAPM reset好管理模块后,会向task_app发出GAPM_CMP_EVT消息事件,内核会执行gapm_cmp_evt_handler,该回调会向TASK_GAPM发出GAPM_SET_DEV_CONFIG_CMD命令,以完成BLE设备配置。

3.     GAPM_CMP_EVT

  当TASK_GAPM完成设备配置时,会再次向task_app发送GAPM_CMP_EVT消息,内核会执行gapm_cmp_evt_handler,这时会调用app_set_dev_config_complete_func,里面调用app_db_init创建GATT属性数据库。

app_db_init里面会向各个profileXXX_task发送一条XXX_CREATE_DB_REQ创建属性数据库的命令消息。

4.     XXX_CREATE_DB_CFM

  各个profile调用GATT接口完成创建后,会向task_app发送XXX_CREATE_DB_CFM消息事件。内核会执行相应的回调,回调会向task_app(即自己发给自己)发送一个APP_MODULE_INIT_CMP_EVT消息。

5.     APP_MODULE_INIT_CMP_EVT

  内核会执行app_module_init_cmp_evt_handler回调,该回调会再次调用app_db_init,回到第4步继续进行。当app_db_init发现所有profile的属性数据库都创建完毕时,会调用app_db_init_complete_func接口,该接口会开始广播,并开始应用相关的处理过程。

五、GAP建立连接过程的消息回调

  Todo

六、数据通信过程中的消息回调

  Todo

  参考文献:《UM-B-015_DA14580 Software architecture v4.0.pdf》、《RW-BT-KERNEL-SW-FS.pdf》。

下一篇:

  全球最低功耗蓝牙单芯片DA14580的软件体系

  -GAP建立连接和数据通信过程

      嵌入式企鹅圈原创团队由阿里、魅族、nvidia、龙芯、炬力、拓尔思等资深工程师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!

全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程的更多相关文章

  1. 全球最低功耗蓝牙单芯片DA14580的软件体系 -RW内核和消息处理机制

    上一篇文章<蓝牙单芯片DA14580的硬件架构和低功耗>阐述了DA14580的硬件架构和低功耗的工作原理.本文文章阐述该平台的软件体系,并着重分析消息事件的处理机制. 一.DA14580S ...

  2. 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗

    号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场.健康医疗.ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA1458 ...

  3. 全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析

    DA14580是Dialog公司研制的蓝牙单芯片,号称全球功耗最低,是TI CC2541的四分之一,是运动手环等穿戴类电子产品的常用芯片.但是DA14580的开发门槛不低,适合有蓝牙开发经验的团队来开 ...

  4. 全球主流8位MCU芯片详细解剖No.2:英飞凌 XC866 - 全文

    [导读] XC866是新型8位微控制器系列(XC800)的第一代系列产品,集成高性能8051核.片内FLASH及功能强大的外设集.此外,XC800系列产品内部集成的片 内振荡器和支持3.3V或5.0V ...

  5. 13.56mhz自动寻卡功能业界最低功耗:SI522

    随着智能门锁的不断火爆,很多智能门锁产商为了让产品的功耗下降下来,都在不断寻找能自动寻卡的13.56mhz.今天我就为大家推荐一款13.56mhz芯片自动寻卡业界最低功耗,不仅是业界最低另外还完全PI ...

  6. NXP低功耗蓝牙集成芯片QN9080C的时钟配置

    /*************************************************************************************************** ...

  7. 单芯片DP108USB声卡/音频解决方案完全替代CM108/CM108AH

    简介 DP108是一种高度集成的单芯片USB音频解决方案.所有重要的模拟模块嵌入DP108,包括双DAC和耳机放大器,ADC和麦克风助力器,锁相环,调节器,和USB收发器.许多功能与跳线或外部EEPR ...

  8. BL8810|USB 2.0单芯片解决方案闪存读卡器|BL8810替代GL823K

    创惟GL823K是一款USB 2.0单LUN读卡器控制器,可支持SD/MMC/MSPRO闪存卡.它支持USB 2.0高速传输,将Digital TM(SD).SDHC.SDXC.Mini DTM.Mi ...

  9. 单芯片CS5265替代VL102+PS176|设计USB TYPEC转HDMI方案|替代VL102+PS176

    一.PS176概述PS176是一个显示端口 (DP)至HDMI 2.0视频接口转换器适用于需要视频协议转换的电缆适配器.电视接收器.监视器和其他应用.它将接受任何显示端口输入格式,包括DP 1.1a. ...

随机推荐

  1. Java--解决java compiler level does not match the version of the installed java project facet错误

    从网上下载了个项目,导入eclipse时发现如下错误: 检查后发现原来是JDK版本不一致的问题,项目的默认JDK配置是1.5,而自己电脑上是1.7. 需要修改两个地方的配置,如下图所示: 修改一: 修 ...

  2. JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

    编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  3. 红黑树(三)之 Linux内核中红黑树的经典实现

    概要 前面分别介绍了红黑树的理论知识 以及 通过C语言实现了红黑树.本章继续会红黑树进行介绍,下面将Linux 内核中的红黑树单独移植出来进行测试验证.若读者对红黑树的理论知识不熟悉,建立先学习红黑树 ...

  4. [Node.js] ECMAScript 6中的生成器及koa小析

    原文地址:http://www.moye.me/2014/11/10/ecmascript-6-generator/ 引子 老听人说 koa大法好,这两天我也赶了把时髦:用 n 安上了node 0.1 ...

  5. 将excel导入mysql(使用navicat)

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

  6. JS基础---->js中ajax的使用

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.今天我们就简单的学习一下ajax的使用及过程. ajax的使用 先贴出大致的代码,是请求本地的一个servlet,返回json格 ...

  7. Cocos2d-x数据存储

    分别是使用UserDefault,内置文件管理和sqlite3数据库的一般方式: 主要代码: bool DataScene::init(){ if (!Layer::init()){ return f ...

  8. 利用 ELK系统分析Nginx日志并对数据进行可视化展示

    一.写在前面 结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法.而这篇文章介绍的是单独监控nginx 日志分析 ...

  9. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...

  10. SystemTap知识(一)

    SystemTap是一个系统的跟踪探测工具.它能让用户来跟踪和研究计算机系统在底层的实现. 安装SystemTap需要为你的系统内核安装-devel,-debuginfo,-debuginfo-com ...