找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 11482|回复: 22

[其他] da14580

[复制链接]
连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
发表于 2016-7-4 14:45:06 | 显示全部楼层 |阅读模式

马上注册,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册  

×
Dialog的协议栈在出厂时已经固化在ROM中,对于应用层的代码,并没有真正的主函
入口,是通过一个跳转表jump_table_base将函数指针放到某个固定的位置。
图1
上面的宏BLE_APP_PRESENT表示的是整个应用是同一个芯片中完成,不需要用到GTL(Generic Transport Layer) (通用传输层)。所以一般这个宏是需要打开的。这个表是将内核和应用用到的函数指针放到这里,当应用或者内核需要使用时,可以通过数组调用某个函数,例如当系统启动时,需要运行应用的主函数int main_func(void),这个函数也在这个表中(249行),当然这个调用是在协议中的主函数启动之后进行调用的:
PtrFunc= (my_function)(jump_table_struct[main_pos]);
上面实际上就是调用应用层的main_func()函数了。当然在应用层也可以进行这样的调用,例如图2:




楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:45:46 | 显示全部楼层
da14580之2. main_func()函数调用启动

arch_main.c
  intmain_func(void)
   à app_init(); //初始化一些环境参数设置。
      àapp_init_func();//初始化底层硬件模块。
       àke_task_create(TASK_APP, &TASK_DESC_APP);//创建TASK_APP任务以及将回调函数一起注册到内核。
       àke_state_set(TASK_APP, APP_DISABLED);//将TASK_APP的任务设置为DISABLED状态,这个状态一旦设置,内核检测GAP是否可以为上层提供服务了。如果可以就会发送一个” GAPM_DEVICE_READY_IND”消息给TASK_APP任务,从而开始了整个系统的运行之旅。



积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:46:33 | 显示全部楼层
da14580之3. ke_task_create(TASK_APP, &TASK_DESC_APP)参数详解
3.1.  TASK_APP
即为任务ID,也就是每个任务都有唯一的ID号,供内核调用。在头文件dk_apps\src\modules\rwip\api\rwip_config.h中定义了一个KE_TASK_TYPE的枚举类型,其中包含了内核所有的任务ID,当自己添加任务时,也需要在这里添加。

3.2.  TASK_DESC_APP具体内容如下:


这个结构体的原型
这个结构体的作用是将应用层的回调函数和消息都注册到内核中。共有5个参数:
l  State_handler:因为每个任务可以有多个状态,每个状态可以都多个消息和对用的回调函数,所以这里是注册不同状态下相应的消息和回调函数;
l  Default_handler:默认的消息和回调函数,这个消息和回调函数的作用是在任何状态下都能执行的回调,也就是说这个状态是一个万能的状态,如果在上面的状态句柄中没有相应的回调函数,那么就到这个默认的句柄中来查看有没有相应的回调函数。
l  State:指向状态列表,每一个实例对应一个元素
l  State_max:这个任务共有多少个状态
Idx_max:?不知道


3.4.  app_default_handler深入


也就是
app_default_handler={app_default_state,sizeof(app_default_state)/sizeof(structke_msg_handler)}
那么app_default_state又是什么?

其实这个就是最终这个任务和内核进行通信的消息和回调函数的集合。也就是说至此TASK_APP任务和内核可以的通信搭建已经完成。




积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:47:08 | 显示全部楼层
da14580之4. TASK_APP和Profile的关系
对于GATT来说上层就是profile,而在profile的上面就是应用层了,然而对于RW系统来说,无论是profile和应用app都是平等的,也就是对于内核来说,他们都是某个任务,所以TASK_APP这个任务的作用是:
l  作为应用层的入口,也就是程序员可以操作的入口
l  和其它profile进行通信以及和内核进行通信的枢纽
所以是不是可以分析出为什么在上节中的State_handler是NULL,而Default_handler为一系列的消息和回调函数,因为这些回调函数有可能会被任何一个profile或者内核发送过来的消息进行回调。但是为什么这个任务又有状态呢 (在第一节中ke_state_set(TASK_APP, APP_DISABLED)将任务设置为APP_DISABLED)?



从上面的枚举中的状态基本可以知道,这个状态主要是GAP中使用到的状态,也就是这个状态的作用是和通用属性规范(GAP)进行通信。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:47:48 | 显示全部楼层
da14580之5.TASK_APP任务状态机


下面的图 很重要   没有文字  慢慢看,文字会在下一个帖子里面发送


积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:48:19 | 显示全部楼层
da14580之6.内核和APP消息回调工作剖析

6.1.  内核发出的GAPM_DEVICE_READY_IND消息
    从app_default_state[]中可以看到第一个消息即为”GAPM_DEVICE_READY_IND”,其回调函数为:


第69行是判断目的任务的状态是不是APP_DISABLED,显然是的。所以发送消息给TASK_GAPM这个任务,并且消息内容是GAPM_RESET,字面上表示复位GAP管理模块。当TASK_GAPM reset好管理模块后,会向task_app发出GAPM_CMP_EVT消息事件。
6.2.  TASK_GAPM复位完成后内核发送的GAPM_CMP_EVT消息


这个回调函数是所有内核完成事件的回调函数,通过参数传进来的具体操作选择进行什么样的操作。内核会执行gapm_cmp_evt_handler,第120行中的函数app_configuration_func(dest_id, cmd)是对目的任务参数的设置,这里的目的任务是TASK_GAPM。该回调函数会向TASK_GAPM发出GAPM_SET_DEV_CONFIG_CMD命令,以完成BLE设备配置。那么完成了那些配置呢?看看app_configuration_func()这个函数:
6.3.  内核完成GAPM_SET_DEV_CONFIG_CMD再次发出GAPM_CMP_EVT消息对应的回调函数还是上面的那个函数,只是操作变为了如下操作


如果没有错误,那么将执行第136行的函数:
上面的函数中,首先将TASK_APP任务的状态设置为APP_DB_INIT状态,也就是数据库初始化状态。而下面的操作就是将所有用到的profile的数据库进行初始化,也就是建立GATT数据库。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:48:55 | 显示全部楼层
da14580之6.4. GATT数据库建立

调用app_db_init()函数:
实际上就是调用app_db_init_func()函数:注意下面的函数返回值,只有当所有的GATT数据库建立完毕,也就是当app_env.next_prf_init这个参数大于等于APP_PRF_LIST_STOP时才会返回true,也就是只用当所有的数据库建立完毕才能进行广播。
上面的函数就是进行profile的数据库建立的入口。函数中用到了app_env.next_prf_init参数,这个参数是指向下一个需要建立数据库的索引。从函数可以看到,每次只能建立一个GATT数据库。在第一节有讲到app_init()函数有设置一些环境参数,其中就对app_env.next_prf_init参数进行了设置:


以第一个BLE_PROX_REPORTER为例,看看做了什么?
上面函数TASK_APP任务发送PROXR_CREATE_DB_REQ消息给TASK_PROXR任务。实际上调用的函数如下:


当数据库建立完成,任务TASK_PROXR发送PROXR_CREATE_DB_CFM消息给TASK_APP任务。实际上调用的函数如下
而上面的函数最终TASK_APP任务发送APP_MODULE_INIT_CMP_EVT消息给TASK_APP任务。即:
上面的函数中323行再次进行数据库的添加,如果数据库建立完毕,那么调用void app_db_init_complete_func(void)函数,进行广播。可以知道,每个GATT数据库建立完毕时TASK_APP任务都会发送APP_MODULE_INIT_CMP_EVT消息给TASK_APP任务。


    oidapp_db_init_complete_func(void)函数如下:
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:49:35 | 显示全部楼层
da14580之7.开始广播app_adv_start()

看看广播是一个什么情况
这个函数是TASK_APP任务发送一个GAPM_START_ADVERTISE_CMD消息给TASK_GAPM任务,同时通过app_adv_func()函数将传入的参数进行初始化,主要参数:
还有一个长度的参数,这个参数一定要和实际广播的数据长度一样,否则内核将忽略这个信息
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:50:10 | 显示全部楼层
da14580之8.设备连接

当设备进入到连接状态,GAPC将发送一个GAPC_CONNECTION_REQ_IND消息给TASK_APP
任务。也就是调用gapc_connection_req_ind_handler函数句柄。
实际上是调用app_connection_fun()函数
而这个里面基本上是各个profile调用一个使能函数,然后将TASK_APP任务的状态设置为连接状态,并且如果有安全管理的就进行设置,当然会这个函数app_connect_confirm传递一个消息给GAPC。


1149行函数:
就是TASK_APP发送一个PROXR_ENABLE_REQ消息给TASK_PROXR。也就是:
就是对一些属性值以及属性访问的权限的设置。


1163行函数:
也就是TASK_APP传送一个消息GAPC_CONNECTION_CFM给TASK_GAPC。从而建立了连接,如果有安全管理,那么内核会调用app_security_enable()函数。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:492天
签到总奖励:7016金币
 楼主| 发表于 2016-7-4 14:50:49 | 显示全部楼层
da14580之9.睡眠模式 10.睡眠模式下唤醒事件

9.     睡眠模式
共有3种:
l  活动模式
l  扩展睡眠模式
l  深度睡眠模式
9.1.    活动模式
活动状态,芯片的所有功能都处于活动状态
9.2.    扩展睡眠模式
这种模式下只有SysRAM是处于上电状态的,但是这个模式下这个ram是不能访问的,仅仅是保存数据而已
9.3.    深度睡眠模式
这种模式下芯片整个都处于power off状态。
10.     睡眠模式下唤醒事件
睡眠模式下共有2种方式将设备唤醒:
l  同步模式:通过BLEtimer能唤醒系统处理BLE协议栈事件,而这个唤醒事件是因为产生了BLE协议栈上面的事件,例如:广播事件、连接事件或者其他无线通信的事件。
l  异步模式:通过WakeupTimer 或者Quadrature Decoder(正交解码)唤醒,这个唤醒事件是由于外部设备触发的事件,例如GPIO中断。
之所叫着同步和异步,因为毕竟整个芯片还是围绕BLE协议运行的,肯定得以协议栈为主,所以当产生异步事件时,可能不能立即产生BLE通信事件,必须同步BLE协议栈。因为协议栈运行需要一些时间信息,然而这些时间信息在睡眠模式下是不可使用的。
10.1.    同步模式唤醒睡眠模式
对于同步模式下的唤醒,在上面的几个章节中的内核和TASK_APP的通信,特别是建立
连接时就更明显了。
10.2.    异步模式唤醒睡眠模式
对于异步模式的话主要讲WakeUpTimer即唤醒定时器,其实这个唤醒定时器并不是真正的定时器,仅仅是一个中断,也就是外部GPIO中断产生,唤醒睡眠然后执行回调函数。




随便贴的图


积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-29 21:12 , Processed in 0.231748 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表