DA14580 RW消息事件处理----转
转自: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消息事件处理----转相关推荐
- DA14580软件开发平台参考(三)
翻译的是这个文档. 它介绍了整个系统架构,组件,应用程序编程接口(API)以及开发工具链,环境和过程. 问题点请在评论中留言,我看到了回去改正. 7 System Software DA1458x S ...
- 【SemiDrive源码分析】【MailBox核间通信】44 - 基于Mailbox IPCC RPC 实现核间通信(RTOS侧 IPCC_RPC Server 消息接收及回复 原理分析篇)
[SemiDrive源码分析][MailBox核间通信]44 - 基于Mailbox IPCC RPC 实现核间通信(RTOS侧 IPCC_RPC Server 消息接收及回复 原理分析篇) 一.RT ...
- 艾伟:C#对游戏手柄的编程开发-API篇(2)
回顾"被动方式"开发 在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了"被动方式"的开发.在此方式下,我们的程序只扮演一个消息接收者.系统会定时告 ...
- 【转】iOS实时卡顿监控
转自http://www.tanhao.me/code/151113.html/ 在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件 ...
- Abp Vnext Vue3 的版本实现
Abp Vnext Pro 的 Vue3 实现版本 开箱即用的中后台前端/设计解决方案 开始 Github地址 文档地址 演示地址 系统功能 [x] 用户管理 [x] 角色管理 [x] 审计日志 [x ...
- 开发 Windows 8 Bing地图应用(2)
下面是对使用JavaScript的Bing Maps Trip Optimizer示例的介绍,讲述应用的JavaScript部分组织形式,本地的上下文和网络上下文之间的通信. WinRT需要访问网络的 ...
- Ionic JPush极光推送 插件实例
1.需要去这里注册https://www.jiguang.cn 注册成功获取AppKey 备注填写应用包名规范点,在项目还要用那 2.创建ionic 项目 指定你注册时候的包名(假如:com.ioni ...
- MFC对话框程序如何添加菜单
一般创建MFC有四种程序类型,分别是单个文档,多个文档,基于对话框和顶级文档.其中只有基于对话框的类型是不自带菜单栏的,但是如果需要,也可以手动创建,也是非常简单的. 如何添加菜单? 此处以VS201 ...
- [cocos2dx]基于Cocos2d-x引擎的游戏框架设计
游戏架构与实现 目前,很多基于cocos2d-x的代码基本上仅是对引擎功能的使用,完全不能按照游戏项目的标准来参考.作为游戏项目代码,不仅需要实现游戏的诸多功能,还需要从架构层面,从模块设计的角度来思 ...
最新文章
- java程序中日志jar包的使用_java – 如何使用jar文件中的Liquibase changelog
- 在linux上安装docker
- 【CSON原创】 图片滑动展开效果发布
- Inner Join, Left Outer Join和Association的区别
- lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!
- CF700E-Cool Slogans【SAM,线段树合并,dp】
- 草稿 爬虫-访问登陆可见的页面-请求时带上cookie数据
- Binutils工具集中的一些比较常用的工具
- token会被截取吗_做抖音搬运其他网站视频可以吗?
- 如何快速开发后台管理系统【未完,待补充,欢迎拍砖】
- zblog修改上传服务器,【记录有用】ZBlog备份、恢复与搬家(换空间换服务器)方法...
- Java程序设计之扑克牌
- 如何把空间数据从CGCS2000转换到WGS84和BD09 ——JAVA语言实现
- pycharm远程控制服务器(局域网 内网穿透)
- C语言-学习笔记完整版
- java rest 图_java – Serenity Rest服务
- c语言有n个人围成一圈用指针,C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子...
- c语言 英语试卷,英语听力试题及答案
- 【Windows】Win 10 无法访问同一网络中Mac 电脑
- krpano php,krpano调试模式的开启
热门文章
- 假如让我来设计“腾讯视频”的推荐系统
- 超级淘为什么能在众多新零售导购平台崛起,并深受大家欢迎
- 张志华 统计机器学习
- Python可视化扩展库Matplotlib中使用参数cmap实现颜色映射
- MT7628 OpenWRT21 SIM8202驱动ppp拨号rndis拨号
- 微信小程序的wx.chooseImage如何把图片传给后端
- 论文引用参考文献和自动更新的方法
- 备份恢复Lesson 11. Performing Recovery I
- 联邦学习学习笔记——论文理解《Communication-Efficient Learning of Deep Networks from Decentralized Data》
- mysql级联删除_近百道MySQL面试题和答案(2020收藏版)(完结篇)