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

嵌入式框架Zorb Framework搭建过程

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

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

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

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

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

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

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

一、前言

  在嵌入式开发中,我们常常会用到定时器,我们可以用芯片的定时器外设,可以用内核的systick,也可以使用操作系统的定时器。本篇要设计的定时器类似与操作系统的定时器,是软件定时器。如果Zorb Framework运行在操作系统上面,大可以不使用本篇的功能,直接使用操作系统自带的定时器。

二、定时器设计

  我们先来看看要实现的定时器提供什么功能:

  初步要提供的功能如下:

  1、可以设置定时时间

  2、可以设置定时器是单次还是重复运行

  3、可以设置定时器处理函数

  4、定时器函数可以直接运行或者推送异步事件

  5、可以打开和关闭定时器

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

 /* 定时器处理程序 */
typedef void (*ITimerProcess)(void); /* 定时器结构 */
typedef struct _Timer
{
uint8_t Priority; /* 事件优先级 */
uint32_t Interval; /* 时间间隔(ms) */
uint32_t AlarmTime; /* 定时到达时间 */
bool IsAutoReset; /* 重复运行(默认开) */
bool IsRunning; /* 是否正在运行(默认关) */
/* 事件的处理者,事件将推送到处理者的队列 */
/* 不设置处理者则本地执行(挂载Timer_process的地方) */
EventHandler *pEventHandler;
/* 处理事件 */
ITimerProcess TimerProcess; /* 开始定时器 */
void (*Start)(struct _Timer * const pTimer); /* 关闭定时器 */
void (*Stop)(struct _Timer * const pTimer); /* 重新运行定时器 */
void (*Restart)(struct _Timer * const pTimer); /* 销毁定时器(释放空间) */
bool (*Dispose)(struct _Timer * const pTimer);
} Timer;

  事件和事件处理器已经设计好了,再把定时器的处理程序添加到系统滴答程序中即可:

 /******************************************************************************
* 描述 :系统滴答程序(需挂在硬件的时间中断里边)
* 参数 :无
* 返回 :无
******************************************************************************/
void ZF_timeTick (void)
{
/* 系统滴答计数 */
ZF_tick++; /* 软件定时器程序 */
Timer_process();
}

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

三、定时器结果测试

  简单的测试代码如下:

 /**
*****************************************************************************
* @file app_timer.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 定时器测试的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "app_timer.h"
#include "zf_includes.h" /* 事件处理器 */
static EventHandler *pEventHandler;
/* 定时器1 */
static Timer *pTimer1;
/* 定时器2 */
static Timer *pTimer2; /******************************************************************************
* 描述 :定时器程序1
* 参数 :void
* 返回 :无
******************************************************************************/
void TimerProcess1(void)
{
ZF_DEBUG(LOG_D, "%dms:timer process 1 run\r\n", ZF_SYSTIME_MS());
} /******************************************************************************
* 描述 :定时器程序2
* 参数 :void
* 返回 :无
******************************************************************************/
void TimerProcess2(void)
{
ZF_DEBUG(LOG_D, "%dms:timer process 2 run\r\n", ZF_SYSTIME_MS());
} /******************************************************************************
* 描述 :任务初始化
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Timer_init(void)
{
/* 初始化事件处理器 */
EventHandler_create(&pEventHandler); /* 创建定时器1 */
Timer_create(&pTimer1);
pTimer1->Priority = ;
pTimer1->Interval = ;
pTimer1->TimerProcess = TimerProcess1;
pTimer1->IsAutoReset = true;
pTimer1->pEventHandler = pEventHandler;
pTimer1->Start(pTimer1); /* 创建定时器2 */
Timer_create(&pTimer2);
pTimer2->Priority = ;
pTimer2->Interval = ;
pTimer2->TimerProcess = TimerProcess2;
pTimer2->IsAutoReset = true;
pTimer2->pEventHandler = pEventHandler;
pTimer2->Start(pTimer2);
} /******************************************************************************
* 描述 :任务程序
* 参数 :无
* 返回 :无
******************************************************************************/
void App_Timer_process(void)
{
while()
{
/* 执行事件 */
if (pEventHandler->GetEventCount(pEventHandler) > )
{
pEventHandler->Execute(pEventHandler);
}
else
{
/* 可在此实现低功耗 */
}
}
}
/******************************** END OF FILE ********************************/

  结果:

500ms:timer process  run
1000ms:timer process run
1002ms:timer process run
1500ms:timer process run
2000ms:timer process run
2002ms:timer process run
2500ms:timer process run
3000ms:timer process run
3002ms:timer process run
3500ms:timer process run
4000ms:timer process run
4002ms:timer process run
4500ms:timer process run
5000ms:timer process run
5002ms:timer process run 省略...

  在测试程序中,定时器1周期为500ms,定时器2周期为1000ms。至于定时器2程序第一次执行的时间为1002ms的原因:定时器1和定时器2同时在1000ms处响应,但定时器1 的优先级比定时器2的优先级高,因此事件处理器先处理完定时器1的事件再处理定时器2的事件,而调试串口波特率115200,定时器1程序把调试数据发送完的时间大约2ms,因此定时器2的第一次执行时间为1002ms。

四、最后

  本篇为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. 进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)

    原文:进化计算简介和遗传算法的实现--AForge.NET框架的使用(六) 开学了,各种忙起来了… 上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾.matlab用着实在不 ...

  8. 浅谈一下SSI+Oracle框架的整合搭建

    浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...

  9. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

随机推荐

  1. [C#]委托和事件(转载)

    原文地址:http://blog.csdn.net/dingxiaowei2013/article/details/20249163 引言 委托 和 事件在 .Net Framework中的应用非常广 ...

  2. 动态获取Drawable图片资源

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...

  3. python入门9 条件语句

    条件语句: if 条件为真: 执行语句块 (执行完结束不执行elif,else) elif 条件为真: 执行语句块 (执行完结束不执行else) else: 执行语句块 #coding:utf-8 # ...

  4. Android(java)学习笔记15:匿名内部类实现多线程

    1. 使用匿名内部类实现多线程 二话不说,首先利用代码体现出来,给大家直观的感觉: package cn.itcast_11; /* 4 * 匿名内部类的格式: 5 * new 类名或者接口名() { ...

  5. jmeter报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported"的解决方法

    1.报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supporte ...

  6. C# .Net Framework4.5中配置和使用managedCUDA及常见问题解决办法

    主要参考英文帖子.我就不翻译了哈.很容易懂的. 先说明我的运行平台: 1.IDE:Visual Studio 2012 C# .Net Framework4.5,使用默认安装路径: 2.显卡类型:NV ...

  7. 【JeeSite】角色和权限的修改

    @RequiresPermissions("sys:role:edit") @RequestMapping(value = "save") public Str ...

  8. JS JavaScript中的文档碎片 DocumentFragement JS性能优化

    文档碎片是什么: 如果我们要在一个ul中添加100个li,如果不使用文档碎片,那么我们就需要使用append经常100次的追加,这会导致浏览器一直不停的渲染,是非常消耗资源的.但是如果我们使用文档碎片 ...

  9. Interview Question Overload、Refactoring和Override?

    Overload Overload我们百度翻译知道是超载的意思,不过我们一般称其为重载,在这里我们不纠结于它的翻译,我们来讲讲重载是什么意思,重载的好处.在下面我们以Overload来代表重载(为了记 ...

  10. Struts2中期(这框架目前正处于淘汰状态)

    Struts2的第二天 Struts2的第二天的内容 1. Struts2框架中的Servlet的API的使用 2. Struts2中Action接收请求参数 3. Struts2中自定义拦截器 案例 ...