转自:https://www.cnblogs.com/yueqian-scut/p/5398209.html

软件版本:5.0.4

编辑器: Keil5

基于工程:\5.0.4\projects\target_apps\ble_examples\ble_app_ota\Keil_5

1,

task列表:   rwip_config.h文件中

/// Tasks types definition
enum KE_TASK_TYPE
{TASK_NONE           = 0xFF,// Link Layer TasksTASK_LLM            = 0   ,TASK_LLC            = 1   ,TASK_LLD            = 2   ,TASK_DBG            = 3   ,TASK_L2CM           = 4   ,TASK_L2CC           = 5   ,TASK_SMPM           = 6   ,TASK_SMPC           = 7   ,TASK_ATTM           = 8   ,   // Attribute Protocol Manager TaskTASK_ATTC           = 9   ,   // Attribute Protocol Client TaskTASK_ATTS           = 10  ,   // Attribute Protocol Server TaskTASK_GATTM          = 11  ,   // Generic Attribute Profile Manager TaskTASK_GATTC          = 12  ,   // Generic Attribute Profile Controller TaskTASK_GAPM           = 13  ,   // Generic Access Profile ManagerTASK_GAPC           = 14  ,   // Generic Access Profile ControllerTASK_PROXM          = 15  ,   // Proximity Monitor TaskTASK_PROXR          = 16  ,   // Proximity Reporter TaskTASK_FINDL          = 17  ,   // Find Me Locator TaskTASK_FINDT          = 18  ,   // Find Me Target TaskTASK_HTPC           = 19  ,   // Health Thermometer Collector TaskTASK_HTPT           = 20  ,   // Health Thermometer Sensor TaskTASK_ACCEL          = 21  ,   // Accelerometer Sensor TaskTASK_BLPS           = 22  ,   // Blood Pressure Sensor TaskTASK_BLPC           = 23  ,   // Blood Pressure Collector TaskTASK_HRPS           = 24  ,   // Heart Rate Sensor TaskTASK_HRPC           = 25  ,   // Heart Rate Collector TaskTASK_TIPS           = 26  ,   // Time Server TaskTASK_TIPC           = 27  ,   // Time Client TaskTASK_DISS           = 28  ,   // Device Information Service Server TaskTASK_DISC           = 29  ,   // Device Information Service Client TaskTASK_SCPPS          = 30  ,   // Scan Parameter Profile Server TaskTASK_SCPPC          = 31  ,   // Scan Parameter Profile Client TaskTASK_BASS           = 32  ,   // Battery Service Server TaskTASK_BASC           = 33  ,   // Battery Service Client TaskTASK_HOGPD          = 34  ,   // HID Device TaskTASK_HOGPBH         = 35  ,   // HID Boot Host TaskTASK_HOGPRH         = 36  ,   // HID Report Host TaskTASK_GLPS           = 37  ,   // Glucose Profile Sensor TaskTASK_GLPC           = 38  ,   // Glucose Profile Collector TaskTASK_NBPS           = 39  ,   // Nebulizer Profile Server TaskTASK_NBPC           = 40  ,   // Nebulizer Profile Client TaskTASK_RSCPS          = 41  ,   // Running Speed and Cadence Profile Server TaskTASK_RSCPC          = 42  ,   // Running Speed and Cadence Profile Collector TaskTASK_CSCPS          = 43  ,   // Cycling Speed and Cadence Profile Server TaskTASK_CSCPC          = 44  ,   // Cycling Speed and Cadence Profile Client TaskTASK_ANPS           = 45  ,   // Alert Notification Profile Server TaskTASK_ANPC           = 46  ,   // Alert Notification Profile Client TaskTASK_PASPS          = 47  ,   // Phone Alert Status Profile Server TaskTASK_PASPC          = 48  ,   // Phone Alert Status Profile Client TaskTASK_LANS           = 49  ,   // Location and Navigation Profile Server TaskTASK_APP            = 50  ,   // Do not Alter. TASK_LANC           = 51  ,   // Location and Navigation Profile Client TaskTASK_CPPS           = 52  ,   // Cycling Power Profile Server TaskTASK_CPPC           = 53  ,   // Cycling Power Profile Client Task// Start of conditionally assigned task types#if (BLE_BM_SERVER)TASK_BMSS           ,   // BMSS Task#endif#if (BLE_BM_CLIENT)TASK_BMSC         ,   // BMSC Task#endif#if BLE_SPOTA_RECEIVERTASK_SPOTAR         ,   // SPOTA Receiver task#endif#if BLE_STREAMDATA_DEVICETASK_STREAMDATAD    ,   // Stream Data Device Server task#endif#if BLE_STREAMDATA_HOSTTASK_STREAMDATAH    ,   // Stream Data Device Server task#endif#if BLE_ANC_CLIENTTASK_ANCC           ,   // ANCS Client Task#endif#if BLE_WPT_CLIENTTASK_WPTC           ,   // A4WP Wireless Power Transfer Client Profile Task#endif#if BLE_WPTSTASK_WPTS           ,   // A4WP Wireless Power Transfer Server Profile Task#endif#if BLE_APP_PTUTASK_APP_PTU       ,   // A4WP Wireless Power Transfer Client App Task#endif#if BLE_IEUTASK_IEU            ,   // Integrated Environmantal Unit Task#endif#if BLE_MPUTASK_MPU            ,   // Motion Processing Unit Task#endif#if BLE_WSS_SERVERTASK_WSSS           ,   // Weight Scale Server Task#endif#if BLE_WSS_COLLECTORTASK_WSSC           ,   // Weight Scale Collector Task#endif#if BLE_UDS_SERVERTASK_UDSS           ,   // User Data Server Task#endif#if BLE_UDS_CLIENTTASK_UDSC           ,   // User Data Server Task#endif#if BLE_SPS_SERVERTASK_SPS_SERVER     ,   // Serial Proert Service Server Task#endif#if BLE_SPS_CLIENTTASK_SPS_CLIENT     ,   // Serial Proert Service Server Task#endif#if BLE_ADC_NOTIFYTASK_ADC_NOTIFY     ,   // Serial Proert Service Server Task#endif#if BLE_DEVICE_CONFIGTASK_DEVICE_CONFIG  ,   // Serial Proert Service Server Task#endif#if (BLE_BCS_SERVER)TASK_BCSS          ,   // Body Composition Server Task#endif#if (BLE_BCS_CLIENT)TASK_BCSC          ,   // Body Composition Client Task#endif#if (BLE_CTS_SERVER)TASK_CTSS          ,   // Current Time Server Task#endif#if (BLE_CTS_CLIENT)TASK_CTSC          ,   // Current Time Client Task#endif#if BLE_CUSTOM2_SERVERTASK_CUSTS2          ,   // 2nd Custom profile server#endif#if BLE_CUSTOM1_SERVERTASK_CUSTS1         ,   // 1st Custom profile server#endif// End of conditionally assigned task typesTASK_HCI            = 60  ,TASK_HCIH           = 61  ,TASK_GTL            = 63  ,#if USE_AESTASK_AES            = 62  ,   // Task for asynchronous AES API#endif    TASK_MAX            = 64,  //MAX is 64. Do  not exceed.
};

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

RW内核消息处理机制

Task数据结构:

ke_task_desc:     ke_task.h中

/// Task descriptor grouping all information required by the kernel for the scheduling.
struct ke_task_desc
{/// Pointer to the state handler table (one element for each state).const struct ke_state_handler* state_handler;/// Pointer to the default state handler (element parsed after the current state).const struct ke_state_handler* default_handler;/// Pointer to the state table (one element for each instance).ke_state_t* state;/// Maximum number of states in the task.uint16_t state_max;/// Maximum index of supported instances of the task.uint16_t idx_max;
};

ke_state_handler:  ke_task.h中

/// Element of a state handler table.
struct ke_state_handler
{/// Pointer to the message handler table of this state.const struct ke_msg_handler *msg_table;/// Number of messages handled in this state.uint16_t msg_cnt;
};

ke_msg_handler:  ke_task.h中

/// Element of a message handler table.
struct ke_msg_handler
{/// Id of the handled message.ke_msg_id_t id;/// Pointer to the handler function for the msgid above.ke_msg_func_t func;
};

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赋值为:   app.c中

/// Application Task Descriptor
static const struct ke_task_desc TASK_DESC_APP = {NULL,&app_default_handler,app_state,APP_STATE_MAX,APP_IDX_MAX};

app_task有默认的消息回调接口集app_default_handler:     app_task.c中

/* Default State handlers definition. */
const struct ke_msg_handler app_default_state[] =
{{KE_MSG_DEFAULT_HANDLER,                (ke_msg_func_t)app_entry_point_handler},#if USE_LED{APP_TIMER_API_MES1,         (ke_msg_func_t)app_second_timer_handler},
#endif
};

(ke_msg_func_t)app_entry_point_handler 内容:

这里是注册 app_process_handle[]数组里面定义的是 函数指针

int app_entry_point_handler(ke_msg_id_t const msgid,void const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{int i = 0;enum ke_msg_status_tag process_msg_handling_result;while (i < (sizeof(app_process_handlers) / sizeof(process_event_func_t))){ASSERT_ERR(app_process_handlers[i]);if (app_process_handlers[i](msgid, param, dest_id, src_id, &process_msg_handling_result) == PR_EVENT_HANDLED){return (process_msg_handling_result);}i++;}//user cannot do anything else than consume the messageif (app_process_catch_rest_cb != NULL){app_process_catch_rest_cb(msgid,param, dest_id, src_id);}return (KE_MSG_CONSUMED);
};

app_process_handle[]数组:代码是注册是注册 app_process_handle[]数组里面定义的函数。

/** GLOBAL VARIABLES DEFINITION*****************************************************************************************/const process_event_func_t app_process_handlers[] = {#if (!EXCLUDE_DLG_GAP)(process_event_func_t) app_gap_process_handler,
#endif#if (!EXCLUDE_DLG_TIMER)(process_event_func_t) app_timer_api_process_handler,
#endif#if (!EXCLUDE_DLG_MSG)(process_event_func_t) app_msg_utils_api_process_handler,
#endif#if ((BLE_APP_SEC) && (!EXCLUDE_DLG_SEC))(process_event_func_t) app_sec_process_handler,
#endif#if ((BLE_DIS_SERVER) && (!EXCLUDE_DLG_DISS))(process_event_func_t) app_diss_process_handler,
#endif#if ((BLE_PROX_REPORTER) && (!EXCLUDE_DLG_PROXR))(process_event_func_t) app_proxr_process_handler,
#endif#if ((BLE_BAS_SERVER) && (!EXCLUDE_DLG_BASS))(process_event_func_t) app_bass_process_handler,
#endif#if (((BLE_FINDME_TARGET) && (!EXCLUDE_DLG_FINDT)) || ((BLE_FINDME_LOCATOR) && (!EXCLUDE_DLG_FINDL)))(process_event_func_t) app_findme_process_handler,
#endif#if ((BLE_SPOTA_RECEIVER) && (!EXCLUDE_DLG_SPOTAR))(process_event_func_t) app_spotar_process_handler,
#endif#if ((BLE_CUSTOM1_SERVER) && (!EXCLUDE_DLG_CUSTS1))(process_event_func_t) app_custs1_process_handler,
#endif#if ((BLE_CUSTOM2_SERVER) && (!EXCLUDE_DLG_CUSTS2))(process_event_func_t) app_custs2_process_handler,
#endif};

注册app_custs1_process_handler任务:

enum process_event_response app_custs1_process_handler(ke_msg_id_t const msgid,void const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id,enum ke_msg_status_tag *msg_ret)
{return app_std_process_event(msgid, param, src_id, dest_id, msg_ret, app_custs1_process_handlers,sizeof(app_custs1_process_handlers) / sizeof(struct ke_msg_handler));
}

每个函数都有一个ID 和一个回调函数。其他的函数注册也一样。

这样注册了可以用

void ke_timer_set(ke_msg_id_t const timer_id, ke_task_id_t const task, uint32_t delay);//来启动对应的事件

void ke_timer_clear(ke_msg_id_t const timer_id, ke_task_id_t const task);//来停止事件

消息回调接口集包括了GAP相关的消息,如BLE初始化过程的消息事件,和profile应用相关的数据通信消息事件。

GAP相关:app_task.c中

static const struct ke_msg_handler app_gap_process_handlers[]=
{{GAPM_DEVICE_READY_IND,                 (ke_msg_func_t)gapm_device_ready_ind_handler},{GAPM_CMP_EVT,                          (ke_msg_func_t)gapm_cmp_evt_handler},{GAPC_CMP_EVT,                          (ke_msg_func_t)gapc_cmp_evt_handler},{GAPC_CONNECTION_REQ_IND,               (ke_msg_func_t)gapc_connection_req_ind_handler},{GAPC_DISCONNECT_IND,                   (ke_msg_func_t)gapc_disconnect_ind_handler},{APP_MODULE_INIT_CMP_EVT,               (ke_msg_func_t)app_module_init_cmp_evt_handler},{GAPM_ADV_REPORT_IND,                   (ke_msg_func_t)gapm_adv_report_ind_handler},
#if (BLE_APP_SEC){GAPC_SECURITY_IND,                     (ke_msg_func_t)gapc_security_ind_handler},
#endif
};

参考:

https://www.cnblogs.com/yueqian-scut/p/5398209.html

https://blog.csdn.net/a369000753/article/details/51456071

https://blog.csdn.net/yueqian_scut/article/details/51111669

DA14580 RW消息事件处理----转相关推荐

  1. DA14580软件开发平台参考(三)

    翻译的是这个文档. 它介绍了整个系统架构,组件,应用程序编程接口(API)以及开发工具链,环境和过程. 问题点请在评论中留言,我看到了回去改正. 7 System Software DA1458x S ...

  2. 【SemiDrive源码分析】【MailBox核间通信】44 - 基于Mailbox IPCC RPC 实现核间通信(RTOS侧 IPCC_RPC Server 消息接收及回复 原理分析篇)

    [SemiDrive源码分析][MailBox核间通信]44 - 基于Mailbox IPCC RPC 实现核间通信(RTOS侧 IPCC_RPC Server 消息接收及回复 原理分析篇) 一.RT ...

  3. 艾伟:C#对游戏手柄的编程开发-API篇(2)

    回顾"被动方式"开发 在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了"被动方式"的开发.在此方式下,我们的程序只扮演一个消息接收者.系统会定时告 ...

  4. 【转】iOS实时卡顿监控

    转自http://www.tanhao.me/code/151113.html/ 在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件 ...

  5. Abp Vnext Vue3 的版本实现

    Abp Vnext Pro 的 Vue3 实现版本 开箱即用的中后台前端/设计解决方案 开始 Github地址 文档地址 演示地址 系统功能 [x] 用户管理 [x] 角色管理 [x] 审计日志 [x ...

  6. 开发 Windows 8 Bing地图应用(2)

    下面是对使用JavaScript的Bing Maps Trip Optimizer示例的介绍,讲述应用的JavaScript部分组织形式,本地的上下文和网络上下文之间的通信. WinRT需要访问网络的 ...

  7. Ionic JPush极光推送 插件实例

    1.需要去这里注册https://www.jiguang.cn 注册成功获取AppKey 备注填写应用包名规范点,在项目还要用那 2.创建ionic 项目 指定你注册时候的包名(假如:com.ioni ...

  8. MFC对话框程序如何添加菜单

    一般创建MFC有四种程序类型,分别是单个文档,多个文档,基于对话框和顶级文档.其中只有基于对话框的类型是不自带菜单栏的,但是如果需要,也可以手动创建,也是非常简单的. 如何添加菜单? 此处以VS201 ...

  9. [cocos2dx]基于Cocos2d-x引擎的游戏框架设计

    游戏架构与实现 目前,很多基于cocos2d-x的代码基本上仅是对引擎功能的使用,完全不能按照游戏项目的标准来参考.作为游戏项目代码,不仅需要实现游戏的诸多功能,还需要从架构层面,从模块设计的角度来思 ...

最新文章

  1. java程序中日志jar包的使用_java – 如何使用jar文件中的Liquibase changelog
  2. 在linux上安装docker
  3. 【CSON原创】 图片滑动展开效果发布
  4. Inner Join, Left Outer Join和Association的区别
  5. lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!
  6. CF700E-Cool Slogans【SAM,线段树合并,dp】
  7. 草稿 爬虫-访问登陆可见的页面-请求时带上cookie数据
  8. Binutils工具集中的一些比较常用的工具
  9. token会被截取吗_做抖音搬运其他网站视频可以吗?
  10. 如何快速开发后台管理系统【未完,待补充,欢迎拍砖】
  11. zblog修改上传服务器,【记录有用】ZBlog备份、恢复与搬家(换空间换服务器)方法...
  12. Java程序设计之扑克牌
  13. 如何把空间数据从CGCS2000转换到WGS84和BD09 ——JAVA语言实现
  14. pycharm远程控制服务器(局域网 内网穿透)
  15. C语言-学习笔记完整版
  16. java rest 图_java – Serenity Rest服务
  17. c语言有n个人围成一圈用指针,C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子...
  18. c语言 英语试卷,英语听力试题及答案
  19. 【Windows】Win 10 无法访问同一网络中Mac 电脑
  20. krpano php,krpano调试模式的开启

热门文章

  1. 假如让我来设计“腾讯视频”的推荐系统
  2. 超级淘为什么能在众多新零售导购平台崛起,并深受大家欢迎
  3. 张志华 统计机器学习
  4. Python可视化扩展库Matplotlib中使用参数cmap实现颜色映射
  5. MT7628 OpenWRT21 SIM8202驱动ppp拨号rndis拨号
  6. 微信小程序的wx.chooseImage如何把图片传给后端
  7. 论文引用参考文献和自动更新的方法
  8. 备份恢复Lesson 11. Performing Recovery I
  9. 联邦学习学习笔记——论文理解《Communication-Efficient Learning of Deep Networks from Decentralized Data》
  10. mysql级联删除_近百道MySQL面试题和答案(2020收藏版)(完结篇)