zoukankan      html  css  js  c++  java
  • 嵌入式框架Zorb Framework搭建五:事件的实现

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

    嵌入式框架Zorb Framework搭建过程

    嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    嵌入式框架Zorb Framework搭建三:列表的实现

    嵌入式框架Zorb Framework搭建四:状态机的实现

    嵌入式框架Zorb Framework搭建五:事件的实现

    嵌入式框架Zorb Framework搭建六:定时器的实现

    嵌入式框架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 _EventHandler
    17 {
    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, "
    ");
     34     ZF_DEBUG(LOG_D, "event1 arg count is %d
    ", pArgList->Count);
     35     for (i = 0; i < pArgList->Count; i ++)
     36     {
     37         ZF_DEBUG(LOG_D, "event1 arg %d is %s
    ", 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, "
    ");
     52     ZF_DEBUG(LOG_D, "event2 arg count is %d
    ", pArgList->Count);
     53     for (i = 0; i < pArgList->Count; i ++)
     54     {
     55         ZF_DEBUG(LOG_D, "event2 arg %d is %s
    ", 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         else
    105         {
    106             /* 可在此实现低功耗 */
    107         }
    108     }
    109 }
    110 
    111 /******************************** END OF FILE ********************************/

      结果:

    event1 arg count is 1
    event1 arg 0 is hello
    
    event2 arg count is 2
    event2 arg 0 is zorb
    event2 arg 1 is framework

    四、最后

      本篇为Zorb Framework提供了事件功能。事件功能主要用于搭建基于事件驱动的程序,如果一直习惯于开发时间驱动程序(轮询程序)的你,尝试一下事件驱动程序,你会发现别有一番风味。

     

      Zorb Framework github:https://github.com/54zorb/Zorb-Framework

      版权所有,转载请打赏哟

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

  • 相关阅读:
    centos中安装docker
    docker es
    Linux 定时备份数据库
    Linux 防火墙firewalld
    Linux Systemd
    Linux at定时任务
    Linux运行级别
    原来这就是网络
    LeetCode-897-递增顺序搜索树
    SSM整合配置文件
  • 原文地址:https://www.cnblogs.com/54zorb/p/9325298.html
Copyright © 2011-2022 走看看