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

嵌入式框架Zorb Framework搭建过程

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

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

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

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

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

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

嵌入式框架Zorb Framework搭建七:任务的实现

一、前言

  事件有同步事件和异步事件,在这一篇中,我们将为Zorb Framework提供异步事件功能。在很多时候,我们来不及处理部分操作或者对操作的实时性要求不高时,可以考虑使用异步事件功能。如在中断中处理大量的操作是不太明智的,这时候就可以发出一个事件出来,等待事件处理程序在中断外完成。

二、事件功能设计

  我们先来看看要实现的事件提供什么功能:

  初步要提供的功能如下:

  1、可以生成事件

  2、事件里边应该有事件处理函数

  3、可以添加事件处理函数的参数

  4、最好事件可以有优先级,优先级高的先执行

  5、最好事件可以自动回收

  因此,初步设计的数据结构如下:

 /* 事件结构 */
struct _Event
{
uint8_t Priority; /* 优先级 */
IEventProcess EventProcess; /* 事件程序 */
List *pArgList; /* 事件程序的参数指针 */ /* 增加程序参数(深拷贝,按先后顺序入队列) */
bool (*AddArg)(Event * const pEvent, void *pArg, uint32_t size); /* 销毁事件 */
bool (*Dispose)(Event * const pEvent);
}; /* 事件处理器结构 */
struct _EventHandler
{
List *pEventList; /* 事件列表 */
bool IsRunning; /* 是否正在运行:默认开 */ /* 获取事件数 */
uint32_t (*GetEventCount)(EventHandler * const pEventHandler); /* 增加事件(按优先级排序) */
bool (*Add)(EventHandler * const pEventHandler, Event *pEvent); /* 删除事件(释放空间) */
bool (*Delete)(EventHandler * const pEventHandler, Event *pEvent); /* 清空事件列表(释放空间) */
bool (*Clear)(EventHandler * const pEventHandler); /* 销毁事件处理器(释放空间) */
bool (*Dispose)(EventHandler * const pEventHandler); /* 执行事件(按列表位置) */
void (*Execute)(struct _EventHandler * const pEventHandler);
};

  事件和事件处理器已经设计好了,再定义一个宏来帮助推送事件。

 /* 推送事件 */
#define EVENT_POST(handler_, event_) handler_->Add(handler_, event_)

  具体实现请看附件代码或在文末的github地址拉框架源码。

三、事件结果测试

  简单的测试代码如下:

 /**
*****************************************************************************
* @file app_event.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 事件测试的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "app_event.h"
#include "zf_includes.h" /* 事件处理器 */
static EventHandler *pEventHandler; /******************************************************************************
* 描述 :事件程序1
* 参数 :(in)-pArgList 事件参数列表指针
* 返回 :无
******************************************************************************/
void EventProcess1(List *pArgList)
{
uint32_t i; ZF_DEBUG(LOG_D, "\r\n");
ZF_DEBUG(LOG_D, "event1 arg count is %d\r\n", pArgList->Count);
for (i = ; i < pArgList->Count; i ++)
{
ZF_DEBUG(LOG_D, "event1 arg %d is %s\r\n", i,
pArgList->GetElementDataAt(pArgList, i));
}
} /******************************************************************************
* 描述 :事件程序2
* 参数 :(in)-pArgList 事件参数列表指针
* 返回 :无
******************************************************************************/
void EventProcess2(List *pArgList)
{
uint32_t i; ZF_DEBUG(LOG_D, "\r\n");
ZF_DEBUG(LOG_D, "event2 arg count is %d\r\n", pArgList->Count);
for (i = ; i < pArgList->Count; i ++)
{
ZF_DEBUG(LOG_D, "event2 arg %d is %s\r\n", i,
pArgList->GetElementDataAt(pArgList, i));
}
} /******************************************************************************
* 描述 :任务初始化
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Event_init(void)
{
Event *pEvent; /* 事件指针 */ /* 初始化事件处理器 */
EventHandler_create(&pEventHandler); /* 创建事件1 */
Event_create(&pEvent);
pEvent->EventProcess = EventProcess1;
pEvent->AddArg(pEvent, "hello", sizeof("hello") + ); /* 推送事件1 */
EVENT_POST(pEventHandler, pEvent); /* 创建事件2 */
Event_create(&pEvent);
pEvent->EventProcess = EventProcess2;
pEvent->AddArg(pEvent, "zorb", sizeof("zorb") + );
pEvent->AddArg(pEvent, "framework", sizeof("framework") + ); /* 推送事件2 */
EVENT_POST(pEventHandler, pEvent);
} /******************************************************************************
* 描述 :任务程序
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Event_process(void)
{
while()
{
/* 执行事件 */
if (pEventHandler->GetEventCount(pEventHandler) > )
{
pEventHandler->Execute(pEventHandler);
}
else
{
/* 可在此实现低功耗 */
}
}
} /******************************** END OF FILE ********************************/

  结果:

event1 arg count is
event1 arg is hello event2 arg count is
event2 arg is zorb
event2 arg is framework

四、最后

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

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

  版权所有,转载请打赏哟

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

嵌入式框架Zorb Framework搭建五:事件的实现的更多相关文章

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

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

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

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

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

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

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

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

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

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  6. 嵌入式框架Zorb Framework搭建七:任务的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  7. iOS9全新的联系人相关框架——Contacts Framework

    iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...

  8. BBS项目分布搭建五(评论相关功能实现)

    BBS项目分布搭建五(评论相关) 1. 根评论逻辑实现 # 在models.py文件中 修改: # 7. 评论表 parent = models.ForeignKey(to='self', null= ...

  9. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

随机推荐

  1. Windows远程桌面,出现身份验证错误,要求的函数不正确

    升级windows10 1803后,mstsc远程桌面出现 mstsc 远程桌面要求的函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正.如图所示: 运行(win+r) gpedit ...

  2. dede如何调用一级栏目和子集栏目及其文章

    {dede:channelartlist row=6} <a href='{dede:field name='typeurl'/}'>{dede:field name='typename' ...

  3. 插上翅膀,让Excel飞起来——xlwings(三)

    xlwings基本对象 xlwings基本对象 App相当于Excel程序,Book相当于工作簿.N个Excel程序则由apps表示,N个工作簿由books表示. 对工作簿的操作 #导入xlwings ...

  4. css盒模型-BFC

    BFC(边距重叠解决方案) 1.BFC的基本概念:块级格式化上下文 2.BFC的原理(说白了就是BFC的渲染规则): 这个规则是什么呢?我觉得大家能说出4点就够了 第一个就是BFC可以解决这个元素的垂 ...

  5. MyBatis的settings设置描述

    settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...

  6. 通过sql语句查询出来的结果字段没有到对应实体类时的处理方法

    通过sql语句查询出来的结果字段没有到对应实体类时的处理方法,对于Person类获取用户第一个名字和年龄两个字段,常见的有两种方式: 1.在创建一个与查询结果字段对应的类,然后通过构造函数实现: Qu ...

  7. 【题解】洛谷P2426删数

    链接 https://www.luogu.org/problemnew/show/P2426 念念碎 第一次接触到区间DP(瑟瑟发抖) 所以象征性地看了一下题解 这好像是一道比较基础的区间DP吧 但是 ...

  8. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  9. AngularJS 二 指令介绍

    初始化AngularJS框架 ng-app指令: 在NG-程序指令是AngularJS应用程序的起点.它自动初始化AngularJS框架.AngularJS框架将在加载整个文档之后首先检查HTML文档 ...

  10. 话说"登录页面"怎么测试

    今天无聊突然想起web登录页面怎么测试,看似简单的问题杀机重重,怎么说呢,一般没有测试思维的人说简单啦,主要有以下几点 .1.账号密码框输入正确的a-z,A-Z,0-9字符,特殊的字符组合测试.2.账 ...