关于DA14580的SDK

消息ID关联处理函数

消息ID实际上是一个枚举变量或者数据常量。

消息ID关联处理函数,在C语言上的实现,是底层函数通过判别变量的值(消息ID),将程序转向对应的处理函数。思想类似于switch。

UUID实际上也是一个枚举变量。

 

attmdb_att_set_value()获得属性句柄的方法

STREAMDATAD_DIR_VAL_HANDLE(1) = STREAMDATAD_IDX_STREAMDATAD_D0_VAL+4*1;

在对应的枚举变量表里恰好转化为STREAMDATAD_IDX_STREAMDATAD_D1_VAL,从而得到了所需属性在数据库中的编号(即得到了handle),属性的句柄是唯一的,该句柄指向的属性的UUID为0xfff5(可修改)

 

interrupt pending :未决中断

中断来了以后,会置位中断标志位,在中断服务之前,都叫未决中断。顾名思义,就是未解决的中断,即因处理其它事务,暂时悬挂起来。

 

根据观察,DA14580似乎一上电就会执行一遍第一个中断,原因不明,且DA14580进入深度休眠状态后将无法仿真。

 

  • BLE4.0基本概念简介:

属性协议层(attribute protocol,简称ATT),允许设备向对等设备展示一块特定的数据,这些数据被称为“attribute”,其中展示者名为server,访问者名为client。这两个概念与链路层的主机扫描,从机广播的概念是相互独立的。

通用属性配置文件层(generic attribute profile,简称GATT)定义了使用ATT层的服务的框架,规定了配置文件(profile)的结构,所有被服务使用到的attribute被称为“characteristic”。两个建立连接的设备之间所有的数据通讯都是通过GATT层实现。

服务是对等设备之间完成特定功能的数据和相关行为的集合,这个概念一般存在于ATT层和GATT层。从编程角度看,profile可以理解为服务内容的具体代码实现。

 

  •  官方SDK代码流程分析:

以下表述中,message=消息,task=任务,app=应用层,handler=处理函数

官方SDK中,在DA14580上嵌入RW系统,驱动BLE4.0协议栈,运行服务的大致实现方法简介如下:

一个服务的profile通常由八个文件组成,,包括app_xx.c和.h,app_xx_task.c和.h, xx.c和.h,xx_task.c和.h。顾名思义,xx文件和xx_task文件通常是用于定义与服务profile有关的数据【characteristic table(即database),environment structure,database handle等】,任务,消息以及消息处理函数等;而app_xx和app_task文件则是定义了该profile的应用层接口函数,相关数据,应用层任务,消息以及消息处理函数等。

服务,协议层,profile,Charateristic是BLE4.0的概念;task,message是RW系统的概念;这两类概念都不是C语言本身的概念,而且相互之间是没有必然联系的。task可以理解为人类需要机器完成的事项,message可以理解为在task之间传递信息的载体,一个task往往含有多个message。message的创建,传递,处理和task的创建,都有赖于系统内核的调度与操作。为了完成一个蓝牙服务可能需要创建多个task,传递多个message等等。message和task在C语言上表现为一系列的数据变量集合。消息通常包括消息ID,源ID,目标ID,消息参数,消息状态等;任务通常包括任务ID,任务类型,任务描述符,任务状态等。此处注意,消息状态和任务状态本身并不是消息和任务的固有内容,而是官方SDK检错机制中的概念,用于确保任务和消息运行情况正确。各个成员的具体C语言数据构成方法,分散于SDK的部分工程文件中。依据rwip_config.h中的任务类型表,笔者认为,蓝牙协议各层和SDK中定义的app层,以及各类蓝牙服务profile都有着自己的一个或多个task

在DA14580的官方SDK中,开发人员已经创建了一系列的task和message,用于实现不同的服务或者系统功能,并关联了对应的message handler,当然也允许用户自行创建。笔者认为,handler都是针对message而言,对于task不存在handler的概念。此处注意,广义上说,应用层定时器任务(app_timer_task)也属于上述的task概念,有对应的task message ID和handler,关联的方法与其他任务一样,只是不属于系统任务。

其大致流程如下:源任务和目的任务被用户创建à事件,动作或者请求发生à与事件或动作有关的消息被源任务创建à消息从源任务传递至目标任务à系统(目标任务)调用消息处理函数处理消息à处理完成后目标任务返回回执消息给源任务à源任务调用回执消息处理函数。

 例如,在app.c和streamdatad.c的初始化函数中,应用层任务和streamdatad任务被创建;在app_streamdatad.c中STREAMDATAD_CREATE_DB_REQ消息被创建,并从app任务传递给streamdatad任务;在streamdatad_task.c中,streamdatad任务调用 streamdatad_create_db_req_handler处理消息,创建database,完成后返回STREAMDATAD_CREATE_DB_CFM给app任务;app任务调用stream_create_db_cfm_handler处理消息à若一个profile database(比如streamdatad和battery)初始化完成,app任务向自身发送APP_MODULE_INIT_CMP_EVT消息,调用app_module_init_cmp_evt_handler检查是否所有profile database均初始化完成à若完成则开始蓝牙广播。流程结束。

猜你喜欢

转载自blog.csdn.net/WangJianlin3/article/details/83063989
今日推荐