全球最低功耗蓝牙单芯片DA14580的软件体系 -RW内核和消息处理机制
上一篇文章《蓝牙单芯片DA14580的硬件架构和低功耗》阐述了DA14580的硬件架构和低功耗的工作原理。本文文章阐述该平台的软件体系,并着重分析消息事件的处理机制。
一、DA14580SOC硬件组成和软件体系组成
DA14580芯片硬件架构包括三个部分:
1)使用ARM公司的cortex M0作为CPUprocessor处理器。
2)使用RivieraWaves公司的IP核作为BLEcore和基带、射频部分。
3)集成时钟管理CMU、电源管理PMU、memory控制存储和其他外围模块控制器,如GPIO、UART、I2C、SPI和timer等等。
相应地,DA14580平台SDK的软件组成也包括以下组成部分:
1)ARMcortex M0平台相关的库文件,如启动、CMSIS(the cortex Microcontroller software interface standard)支持的寄存器访问、中断异常访问接口等。
2)RW公司的BLE驱动、射频驱动,此外RW BLE还集成了系统的内核部分,其提供消息处理、定时器和任务调度等核心功能。所以DA14580平台SDK的开发是基于RW公司研发的内核,而不是DIALOG公司研发的。此部分大部分的代码都是固化在ROM里面。
3)SOC集成的其他模块的驱动,由DIALOG公司提供,如UART驱动等,此外其调用RW内核的相关接口来完成消息循环和低功耗功能。
4)应用程序,调用以上三个部分的接口来完成自定义功能。
我们重点分析2)中的RW内核机制和功能。
二、RW内核
RW内核的指导文档为《RW-BT-KERNEL-SW-FS.pdf》。其主要包括以下三个部分:
1)Message,消息处理机制。
2)Taskand Schedule,任务和调度。
3)Timer,定时器使用方法。
三、Task
RW在BLE协议栈层次的基础上抽象了多个任务task,每个task完成一个软件层次的功能。所以说RW内核是支持多个任务task的,但本质上,RW内核也是一个单任务内核,所以各个task可以看成是能够完成特定功能的独立函数体或者函数集合。
每个task都有一个task ID,其具有优先级功能,类似于UCOS的优先级。
RW内核和UCOS的区别是:UCOS是多任务内核,具有时间片轮流执行,并具有互斥同步。
四、Message
4.1 消息标识
一个消息就要区分它是属于哪个task的,而且还要区分同一个task里面的不同消息。所以一个Message包括两个部分:
TASK_TYPE即是task的ID。在调度时,优先级高的task的消息会先得到执行处理。
4.2 消息结构体元素
我们只需要关注红色圈着的这五个元素,第一个元素可以看出消息结构体节点是以链表的形式来管理的。HCI相关的是指USB dongle这种应用形式,由PC主机控制蓝牙BLE,咱们不讨论这种应用。
红色圈到的五个元素分别的是:
1)id,即第一点说到的消息标识。
2)消息由哪个目标task处理。
3)发出消息的task
4)消息参数的长度
5)消息参数的结构体地址
消息参数结构体是可以自定义的,这里通过void*转换传入地址。
4.3 消息动态内存管理
RW内核专门给消息处理提供动态内存管理机制,接口是:
void*ke_msg_alloc(ke_msg_id_t const id, ke_task_id_t const dest_id,
ke_task_id_t const src_id,uint16_t const param_len);
一般给应用提供一个宏,用于简化写法:
#defineKE_MSG_ALLOC(id, dest, src, param_str) \
(struct param_str*) ke_msg_alloc(id, dest, src, sizeof(structparam_str))
释放接口是:void ke_msg_free(struct ke_msg const *param);. 在调度机制里面会通过判断消息处理的返回值对消息进行相应的处理,如释放消息的内存。用户编程一般不用调用释放接口。
4.4 消息接口
1)带参数的消息发送
voidke_msg_send(void const *param_ptr); param_ptr需要通过ke_msg_alloc接口申请动态内存。
一般的命令消息发送写法如下:
structgapm_set_dev_config_cmd* cmd = KE_MSG_ALLOC(GAPM_SET_DEV_CONFIG_CMD,
TASK_GAPM, TASK_APP,gapm_set_dev_config_cmd);
ke_msg_send(cmd);
2)不带参数的消息发送
voidke_msg_send_basic(ke_msg_id_t const id, ke_task_id_t const dest_id,ke_task_id_t const src_id)
五、TIMER
5.1 定时单位
10ms,RW内核提供一个定时器,其并不是DA14580集成的TIMER1和TIMER3。对定时器的初始化等工作是在BLE初始化内部的,不需要用户编程设置。用户只需要调用RW内核的TIMER接口即可。
5.2 设置timer
voidke_timer_set(ke_msg_id_t const timer_id, ke_task_id_t const task, uint16_tconst delay);
timer_id是定时器消息,其属于一种不带参数的MESSAGE,delay是定时时间,10ms为单位,当时间到达时,RW内核会发送timer_id到目标task的消息队列。当内核schedule时即会执行定时器相应的回调。
六、Schedule
1.先取出最高优先级task的消息事件,该消息从消息队列中pop出来
2.根据task的状态和消息ID来得到对应的handler
3.执行该handler回调
4.根据回调的返回值对消息进行处理
1)如果返回KE_MSG_CONSUMED,则内核free掉该消息。
2)如果返回KE_MSG_NO_FREE,则内核不处理该消息,但该消息也不会重新放到消息队列,即内核不能再从消息队列中获得该消息。
3)如果返回KE_MSG_SAVED,则内核不free该消息,并且将该消息重新入列。
七、基于状态机的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元素。
八、参考文献:
《UM-B-015_DA14580 Software architecture v4.0.pdf》、
《RW-BT-KERNEL-SW-FS.pdf》。
下一篇,敬请期待:
全球最低功耗蓝牙单芯片DA14580的软件体系
-层次架构和BLE消息事件处理过程
技术咨询请发邮件:yqwucheng@163.com。
百分百原创,每周两篇,阿里、魅族、nvidia、龙芯、炬力、拓尔思等顶级企业资深工程师分享----嵌入式、Linux、物联网、GPU、Android、自动驾驶等技术,欢迎扫码关注微信公众号:嵌入式企鹅圈,实时推送原创文章!
全球最低功耗蓝牙单芯片DA14580的软件体系 -RW内核和消息处理机制的更多相关文章
- 全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程
在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片 ...
- 全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗
号称全球最低功耗蓝牙单芯片DA14580在可穿戴市场.健康医疗.ibeacon定位等市场得到广泛的应用,但是因为其较为封闭的技术/资料支持导致开发人员有较高的技术门槛,网络上也极少看到有关DA1458 ...
- 全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析
DA14580是Dialog公司研制的蓝牙单芯片,号称全球功耗最低,是TI CC2541的四分之一,是运动手环等穿戴类电子产品的常用芯片.但是DA14580的开发门槛不低,适合有蓝牙开发经验的团队来开 ...
- 全球主流8位MCU芯片详细解剖No.2:英飞凌 XC866 - 全文
[导读] XC866是新型8位微控制器系列(XC800)的第一代系列产品,集成高性能8051核.片内FLASH及功能强大的外设集.此外,XC800系列产品内部集成的片 内振荡器和支持3.3V或5.0V ...
- 13.56mhz自动寻卡功能业界最低功耗:SI522
随着智能门锁的不断火爆,很多智能门锁产商为了让产品的功耗下降下来,都在不断寻找能自动寻卡的13.56mhz.今天我就为大家推荐一款13.56mhz芯片自动寻卡业界最低功耗,不仅是业界最低另外还完全PI ...
- NXP低功耗蓝牙集成芯片QN9080C的时钟配置
/*************************************************************************************************** ...
- 单芯片DP108USB声卡/音频解决方案完全替代CM108/CM108AH
简介 DP108是一种高度集成的单芯片USB音频解决方案.所有重要的模拟模块嵌入DP108,包括双DAC和耳机放大器,ADC和麦克风助力器,锁相环,调节器,和USB收发器.许多功能与跳线或外部EEPR ...
- 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 ...
- 单芯片CS5265替代VL102+PS176|设计USB TYPEC转HDMI方案|替代VL102+PS176
一.PS176概述PS176是一个显示端口 (DP)至HDMI 2.0视频接口转换器适用于需要视频协议转换的电缆适配器.电视接收器.监视器和其他应用.它将接受任何显示端口输入格式,包括DP 1.1a. ...
随机推荐
- Transactional replication 的Snapshot 文件在什么情况下会被清除
Snapshot agent负责收集publication database的信息,将article的内容存储在snapshot文件中.而distribuiton cleanup job(后文简称清除 ...
- 找出链表中倒数第 k 个结点
/* 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct node { int data; struct node * ...
- Sass学习之路:Sass、Compass安装与命令行
导言 CSS不是一门真正意义上的编程语言,很多编程语言理所当然的特性(比如变量),都不被支持.同时再开发模块化的web项目的时候,也要避免相互干扰.为了弥补CSS的这些不足,就产生了CSS预处理器,S ...
- 15款提高工作效率的 Web 项目管理工具
在今天的快节奏的商业世界里,能够通过计划.组织.和管理资源池以及评估开发资源的模式来管理一个项目,是一个很艰巨的任务. 有很多现成的项目管理软件来帮助减轻项目管理的负担,并且他们几乎覆盖了所有类型的业 ...
- 100款免费的圣诞节矢量图标素材(PSD & SVG)
圣诞节的脚步越来越近了.今天,我们给大家收集了100个美丽的圣诞矢量图标素材.这套圣诞矢量图标集包含 PSD 和 SVG 两种格式,基于 Creative Commons 协议,可以在商业和个人项目中 ...
- 实用手册:130+ 提高开发效率的 vim 常用命令
Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...
- iOS-验证码倒计时60秒
一. 要求 1.点击获取验证码按钮,60秒倒计时,按钮变成不可点击状态,按钮文字变成倒计时的秒数. 2.当倒计时为0的时候,释放掉定时器NSTimer,按钮变成可以点击状态,按钮文字变成"获 ...
- Direct3D11学习:(二)基本绘图概念和基本类型
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ...
- EPANET源码中用到的几个简单C语言函数介绍三
引自input2.C int getfloat(char *s, double *y)/***---------------------------------------------------- ...
- SQL Server里的自旋锁介绍
在上一篇文章里我讨论了SQL Server里的闩锁.在文章的最后我给你简单介绍了下自旋锁(Spinlock).基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行 ...