完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
状态回调函数依赖于SDK的framework框架,且已经为用户预留了自定义回调函数的框架,audio,bt,fs,net的状态回调框架都是完全公开的,参照编写即可。如何创建自定义状态回调函数。
|
|
相关推荐
1个回答
|
|
解决方法
1 添加自定义状态回调类型 在projectcommonframeworksys_ctrlsys_ctrl.h文件中,修改ctrl_msg_type结构体,在CTRL_MSG_TYPE_USER后添加自定义类型,如CTRL_MSG_TYPE_TEST。 typedef enum ctrl_msg_type{ CTRL_MSG_TYPE_SYSTEM = 0, CTRL_MSG_TYPE_NETWORK, CTRL_MSG_TYPE_VKEY, CTRL_MSG_TYPE_VOLUME, CTRL_MSG_TYPE_SDCARD, CTRL_MSG_TYPE_FS, CTRL_MSG_TYPE_AUDIO, CTRL_MSG_TYPE_HANDLER, /* message defined by user starts from CTRL_MSG_TYPE_USER */ CTRL_MSG_TYPE_USER = 0x100, CTRL_MSG_TYPE_TEST, //自主添加的回调函数 } ctrl_msg_type; 2 创建回调函数 在.h文件中添加状态类型 enum test_status { TEST_MSG_STATE_FIRSR, //状态1 TEST_MSG_STATE_SECOND, //状态2 TEST_MSG_STATE_UNDEFINE, }; 在.c文件中添加实体函数 /* 处理状态变化 */ static void test_ctrl_msg_process(uint32_t event, uint32_t data, void *arg) { switch (EVENT_SUBTYPE(event)) { case TEST_MSG_STATE_FIRSR: test_act_first(data); break; case TEST_MSG_STATE_SECOND: test_act_second(data); break; default: break; } } /* 创建回调函数 */ int test_init(void) { observer_base *base = sys_callback_observer_create(CTRL_MSG_TYPE_TEST, //监控event类型 0xFFFF, //监控类型可分类,可参考fs_ctrl.h test_ctrl_msg_process, //回调函数 NULL); if (base == NULL) { printf("create failn"); return -1; } /* 挂载到观察链表 */ if (sys_ctrl_attach(base) != 0) { printf("attach failn"); return -1; } } 3 发送状态 当线程中状态发生变化时,通过projectcommonframeworksys_ctrlsys_ctrl.h中定义的API,会调用步骤2中设置好的回调函数。 常规用法 /* 实体 */ int sys_event_send(uint16_t type, uint16_t subtype, uint32_t data, uint32_t wait_ms); /* 例,其中wait_ms为队列等待超时时间,队列深度默认为6 */ sys_event_send(CTRL_MSG_TYPE_TEST,TEST_MSG_STATE_FIRSR,0,0); 特殊用法,发送完成后自动释放数据 /* 实体 */ int sys_event_send_with_free(uint16_t type, uint16_t subtype, void *data, uint32_t wait_ms); /* 例,其中data是希望传输到回调函数的数据,使用该API能在传输完成后释放内存 */ struct STtest *testdata = malloc(sizeof(*testdata)); memset(testdata,0,sizeof(*testdata); testdata = dataget(testdata) //数据赋值 sys_event_send_with_free(CTRL_MSG_TYPE_TEST,TEST_MSG_STATE_FIRSR,testdata ,0);//发送完成后会自动释放数据 特殊用法,自定义销毁方式 /* 实体 */ int sys_event_send_with_destruct(uint16_t type, uint16_t subtype, void *data, void (*destruct)(event_msg *), uint32_t wait_ms) 该API和sys_event_send_with_free差异点为,sys_event_send_with_free执行完回调后,会固定执行free(data),但是sys_event_send_with_destruct在执行完回调后,继续执行destruct函数,destruct函数由用户自主编写,可以选择销毁data,也可以选择特殊处理。 |
|
|
|
只有小组成员才能发言,加入小组>>
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发
622 浏览 0 评论
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS编译开发说明
529 浏览 0 评论
1172 浏览 1 评论
2990 浏览 0 评论
为了学习内核开发,大佬手搓了一个轻量级操作系统YiYiYa OS
2936 浏览 0 评论
【开源硬件大赛】基于全志V853设计的全功能BTB学习开发板
3455浏览 8评论
3111浏览 5评论
1879浏览 4评论
全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
89094浏览 3评论
3615浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 10:15 , Processed in 0.757459 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号