博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程...
阅读量:6476 次
发布时间:2019-06-23

本文共 3156 字,大约阅读时间需要 10 分钟。

在作者之前发表的《全球最低功耗蓝牙单芯片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、龙芯、炬力、拓尔思等资深project师组成。百分百原创,每周两篇,分享嵌入式、Linux、物联网、GPU、Android、自己主动驾驶等技术。欢迎扫码关注微信公众号:嵌入式企鹅圈,
实时推送原创文章!

你可能感兴趣的文章
javascript 字符串转数字的简便写法
查看>>
html之div始终停留在屏幕中间部分
查看>>
Spring中jdbcTemplate的用户实例
查看>>
[模板] 快速傅里叶变换/FFT/NTT
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>
Android 的Margin和Padding属性以及支持的长度单位
查看>>
HDU ACM 1050 Moving Tables
查看>>
Django templates加载css/js/image等静态资源
查看>>
Eclipse C + GTK2.0环境构筑
查看>>
caffe solver
查看>>
Rhel6-heartbeat+lvs配置文档
查看>>
[CF340D]Bubble Sort Graph/[JZOJ3485]独立集
查看>>
ORACLE分科目统计每科前三名的学生的语句
查看>>
第一次冲刺--查看活动详情用户场景分析
查看>>
0317复利计算的回顾与总结
查看>>
函数对象
查看>>
Sharepoint学习笔记—习题系列--70-573习题解析 -(Q70-Q72)
查看>>
最全最新个税计算公式---今天你税了吗?
查看>>
linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)
查看>>
MongoDB--CSharp Driver Quickstart .
查看>>