我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
一、前言
事件有同步事件和异步事件,在这一篇中,我们将为Zorb Framework提供异步事件功能。在很多时候,我们来不及处理部分操作或者对操作的实时性要求不高时,可以考虑使用异步事件功能。如在中断中处理大量的操作是不太明智的,这时候就可以发出一个事件出来,等待事件处理程序在中断外完成。
二、事件功能设计
我们先来看看要实现的事件提供什么功能:
初步要提供的功能如下:
1、可以生成事件
2、事件里边应该有事件处理函数
3、可以添加事件处理函数的参数
4、最好事件可以有优先级,优先级高的先执行
5、最好事件可以自动回收
因此,初步设计的数据结构如下:
1 /* 事件结构 */ 2 struct _Event 3 { 4 uint8_t Priority; /* 优先级 */ 5 IEventProcess EventProcess; /* 事件程序 */ 6 List *pArgList; /* 事件程序的参数指针 */ 7 8 /* 增加程序参数(深拷贝,按先后顺序入队列) */ 9 bool (*AddArg)(Event * const pEvent, void *pArg, uint32_t size);10 11 /* 销毁事件 */12 bool (*Dispose)(Event * const pEvent);13 };14 15 /* 事件处理器结构 */16 struct _EventHandler17 {18 List *pEventList; /* 事件列表 */19 bool IsRunning; /* 是否正在运行:默认开 */20 21 /* 获取事件数 */22 uint32_t (*GetEventCount)(EventHandler * const pEventHandler);23 24 /* 增加事件(按优先级排序) */25 bool (*Add)(EventHandler * const pEventHandler, Event *pEvent);26 27 /* 删除事件(释放空间) */28 bool (*Delete)(EventHandler * const pEventHandler, Event *pEvent);29 30 /* 清空事件列表(释放空间) */31 bool (*Clear)(EventHandler * const pEventHandler);32 33 /* 销毁事件处理器(释放空间) */34 bool (*Dispose)(EventHandler * const pEventHandler);35 36 /* 执行事件(按列表位置) */37 void (*Execute)(struct _EventHandler * const pEventHandler);38 };
事件和事件处理器已经设计好了,再定义一个宏来帮助推送事件。
1 /* 推送事件 */2 #define EVENT_POST(handler_, event_) handler_->Add(handler_, event_)
具体实现请看附件代码或在文末的github地址拉框架源码。
三、事件结果测试
简单的测试代码如下:
1 /** 2 ***************************************************************************** 3 * @file app_event.c 4 * @author Zorb 5 * @version V1.0.0 6 * @date 2018-06-28 7 * @brief 事件测试的实现 8 ***************************************************************************** 9 * @history 10 * 11 * 1. Date:2018-06-28 12 * Author:Zorb 13 * Modification:建立文件 14 * 15 ***************************************************************************** 16 */ 17 18 #include "app_event.h" 19 #include "zf_includes.h" 20 21 /* 事件处理器 */ 22 static EventHandler *pEventHandler; 23 24 /****************************************************************************** 25 * 描述 :事件程序1 26 * 参数 :(in)-pArgList 事件参数列表指针 27 * 返回 :无 28 ******************************************************************************/ 29 void EventProcess1(List *pArgList) 30 { 31 uint32_t i; 32 33 ZF_DEBUG(LOG_D, "\r\n"); 34 ZF_DEBUG(LOG_D, "event1 arg count is %d\r\n", pArgList->Count); 35 for (i = 0; i < pArgList->Count; i ++) 36 { 37 ZF_DEBUG(LOG_D, "event1 arg %d is %s\r\n", i, 38 pArgList->GetElementDataAt(pArgList, i)); 39 } 40 } 41 42 /****************************************************************************** 43 * 描述 :事件程序2 44 * 参数 :(in)-pArgList 事件参数列表指针 45 * 返回 :无 46 ******************************************************************************/ 47 void EventProcess2(List *pArgList) 48 { 49 uint32_t i; 50 51 ZF_DEBUG(LOG_D, "\r\n"); 52 ZF_DEBUG(LOG_D, "event2 arg count is %d\r\n", pArgList->Count); 53 for (i = 0; i < pArgList->Count; i ++) 54 { 55 ZF_DEBUG(LOG_D, "event2 arg %d is %s\r\n", i, 56 pArgList->GetElementDataAt(pArgList, i)); 57 } 58 } 59 60 /****************************************************************************** 61 * 描述 :任务初始化 62 * 参数 :无 63 * 返回 :无 64 ******************************************************************************/ 65 void App_Event_init(void) 66 { 67 Event *pEvent; /* 事件指针 */ 68 69 /* 初始化事件处理器 */ 70 EventHandler_create(&pEventHandler); 71 72 /* 创建事件1 */ 73 Event_create(&pEvent); 74 pEvent->EventProcess = EventProcess1; 75 pEvent->AddArg(pEvent, "hello", sizeof("hello") + 1); 76 77 /* 推送事件1 */ 78 EVENT_POST(pEventHandler, pEvent); 79 80 /* 创建事件2 */ 81 Event_create(&pEvent); 82 pEvent->EventProcess = EventProcess2; 83 pEvent->AddArg(pEvent, "zorb", sizeof("zorb") + 1); 84 pEvent->AddArg(pEvent, "framework", sizeof("framework") + 1); 85 86 /* 推送事件2 */ 87 EVENT_POST(pEventHandler, pEvent); 88 } 89 90 /****************************************************************************** 91 * 描述 :任务程序 92 * 参数 :无 93 * 返回 :无 94 ******************************************************************************/ 95 void App_Event_process(void) 96 { 97 while(1) 98 { 99 /* 执行事件 */100 if (pEventHandler->GetEventCount(pEventHandler) > 0)101 {102 pEventHandler->Execute(pEventHandler);103 }104 else105 {106 /* 可在此实现低功耗 */107 }108 }109 }110 111 /******************************** END OF FILE ********************************/
结果:
event1 arg count is 1event1 arg 0 is helloevent2 arg count is 2event2 arg 0 is zorbevent2 arg 1 is framework
四、最后
本篇为Zorb Framework提供了事件功能。事件功能主要用于搭建基于事件驱动的程序,如果一直习惯于开发时间驱动程序(轮询程序)的你,尝试一下事件驱动程序,你会发现别有一番风味。
Zorb Framework github:
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟