博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式框架Zorb Framework搭建五:事件的实现
阅读量:5291 次
发布时间:2019-06-14

本文共 5221 字,大约阅读时间需要 17 分钟。

我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。

嵌入式框架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:

  版权所有,转载请打赏哟

 

如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟

转载于:https://www.cnblogs.com/54zorb/p/9325298.html

你可能感兴趣的文章
第四周作业
查看>>
在ListView中获取当前行的索引
查看>>
Android 创世纪 第一天
查看>>
[重温数据结构]一种自平衡二叉查找树avl树的实现方法
查看>>
Java并发编程实战 第3章 对象的共享
查看>>
多线程系列(三):线程池基础
查看>>
【转载】数据库读写分离和垂直分库、水平分表
查看>>
String、StringBuffer和StringBuilder的区别
查看>>
mac terminal基本命令
查看>>
IntelliJ Idea 2017 免费激活方法
查看>>
Java适配器模式
查看>>
SetThreadAffinityMask 把线程限定在CPU上运行
查看>>
初学VUE2.0
查看>>
人不自控必自毁
查看>>
shiro配合html页面完成细粒化权限控制
查看>>
Java在线备份和还原MySQL数据库。
查看>>
useful commands for Mac / iOS
查看>>
nginx问题整理
查看>>
Python学习 day13
查看>>
Kerberos Ticket管理
查看>>