计时器的贯彻

本身是卓波,小编是一名嵌入式程序员,我相对没悟出笔者会在这里边跟大家吹嘘皮。

嵌入式框架Zorb Framework搭建进度

嵌入式框架Zorb Framework搭建生龙活虎:嵌入式蒙受搭建、调试输出和成立时间类别

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

嵌入式框架Zorb Framework搭建三:列表的贯彻

嵌入式框架Zorb Framework搭建四:状态机的贯彻

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

嵌入式框架Zorb Framework搭建六:电火花计时器的贯彻

嵌入式框架Zorb Framework搭建七:职务的得以达成

 

一、前言

  在嵌入式开荒中,大家平日会用到机械漏刻,大家能够用集成电路的反应计时器外设,能够用基本的systick,也得以动用操作系统的停车计时器。本篇要设计的反应计时器相符与操作系统的机械漏刻,是软件反应计时器。如若Zorb Framework运营在操作系统下面,大能够不行使本篇的效果,直接动用操作系统自带的机械漏刻。

 

二、电火花计时器设计

  大家先来拜候要达成的反应计时器提供怎么样效用:

  开头要提供的作用如下:

  1、能够设置准时时间

  2、能够安装停车计时器是单次照旧重国民党的新生活运动行

  3、能够设置计时器管理函数

  4、定时器函数能够平素运营照旧推送异步事件

  5、能够张开和关闭停车计时器

  因而,开始设计的数据结构如下: 

 1 /* 定时器处理程序 */
 2 typedef void (*ITimerProcess)(void);
 3 
 4 /* 定时器结构 */
 5 typedef struct _Timer
 6 {
 7     uint8_t Priority;               /* 事件优先级 */
 8     uint32_t Interval;              /* 时间间隔(ms) */
 9     uint32_t AlarmTime;             /* 定时到达时间 */
10     bool IsAutoReset;               /* 重复运行(默认开) */
11     bool IsRunning;                 /* 是否正在运行(默认关) */
12     /* 事件的处理者,事件将推送到处理者的队列 */
13     /* 不设置处理者则本地执行(挂载Timer_process的地方) */
14     EventHandler *pEventHandler;
15     /* 处理事件 */
16     ITimerProcess TimerProcess;
17     
18     /* 开始定时器 */
19     void (*Start)(struct _Timer * const pTimer);
20     
21     /* 关闭定时器 */
22     void (*Stop)(struct _Timer * const pTimer);
23     
24     /* 重新运行定时器 */
25     void (*Restart)(struct _Timer * const pTimer);
26     
27     /* 销毁定时器(释放空间) */
28     bool (*Dispose)(struct _Timer * const pTimer);
29 } Timer;

  事件和事件微电脑已经规划好了,再把计时器的管理程序增添到系统滴答程序中就能够:

 1 /******************************************************************************
 2  * 描述  :系统滴答程序(需挂在硬件的时间中断里边)
 3  * 参数  :无
 4  * 返回  :无
 5 ******************************************************************************/
 6 void ZF_timeTick (void)
 7 {
 8     /* 系统滴答计数 */
 9     ZF_tick  ;
10     
11     /* 软件定时器程序 */
12     Timer_process();
13 }

  具体完成请看附属类小构件代码或在文末的github地址拉框架源码。

 

三、反应计时器结果测量检验

  轻松的测量检验代码如下:

 1 /**
 2   *****************************************************************************
 3   * @file    app_timer.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_timer.h"
19 #include "zf_includes.h"
20 
21 /* 事件处理器 */
22 static EventHandler *pEventHandler;
23 /* 定时器1 */
24 static Timer *pTimer1;
25 /* 定时器2 */
26 static Timer *pTimer2;
27 
28 /******************************************************************************
29  * 描述  :定时器程序1
30  * 参数  :void
31  * 返回  :无
32 ******************************************************************************/
33 void TimerProcess1(void)
34 {
35     ZF_DEBUG(LOG_D, "%dms:timer process 1 runrn", ZF_SYSTIME_MS());
36 }
37 
38 /******************************************************************************
39  * 描述  :定时器程序2
40  * 参数  :void
41  * 返回  :无
42 ******************************************************************************/
43 void TimerProcess2(void)
44 {
45     ZF_DEBUG(LOG_D, "%dms:timer process 2 runrn", ZF_SYSTIME_MS());
46 }
47 
48 /******************************************************************************
49  * 描述  :任务初始化
50  * 参数  :无
51  * 返回  :无
52 ******************************************************************************/
53 void App_Timer_init(void)
54 {
55     /* 初始化事件处理器 */
56     EventHandler_create(&pEventHandler);
57     
58     /* 创建定时器1 */
59     Timer_create(&pTimer1);
60     pTimer1->Priority = 1;
61     pTimer1->Interval = 500;
62     pTimer1->TimerProcess = TimerProcess1;
63     pTimer1->IsAutoReset = true;
64     pTimer1->pEventHandler = pEventHandler;
65     pTimer1->Start(pTimer1);
66     
67     /* 创建定时器2 */
68     Timer_create(&pTimer2);
69     pTimer2->Priority = 2;
70     pTimer2->Interval = 1000;
71     pTimer2->TimerProcess = TimerProcess2;
72     pTimer2->IsAutoReset = true;
73     pTimer2->pEventHandler = pEventHandler;
74     pTimer2->Start(pTimer2);
75 }
76 
77 /******************************************************************************
78  * 描述  :任务程序
79  * 参数  :无
80  * 返回  :无
81 ******************************************************************************/
82 void App_Timer_process(void)
83 {
84     while(1)
85     {
86         /* 执行事件 */
87         if (pEventHandler->GetEventCount(pEventHandler) > 0)
88         {
89             pEventHandler->Execute(pEventHandler);
90         }
91         else
92         {
93             /* 可在此实现低功耗 */
94         }
95     }
96 }
97 /******************************** END OF FILE ********************************/

  结果:

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

省略...

  在测验程序中,电火花计时器1周期为500ms,反应计时器2周期为1000ms。至于放大计时器2程序首先次进行的时光为1002ms的缘由:机械漏刻1和电磁打点计时器2同有时候在1000ms处响应,但计时器1 的先行级比停车计时器2的先行级高,因而事件微处理器先管理完停车计时器1的风云再管理放大计时器2的风波,而调节和测量试验串口Porter率115200,计时器1程序把调节和测验数据发送完的小时大致2ms,因而电火花计时器2的首先次实施时间为1002ms。

 

四、最后

  本篇为Zorb Framework提供了反应计时器功效。在对准时精度供给不高(阿秒级),完全能够动用软件放大计时器。软件电磁打点计时器是在硬件机械漏刻的底子上开垦的,好处在于能够挂载四个机械漏刻,不用再为集成电路的反应计时器能源相当不够而抑郁。

 

  Zorb Framework github:

  版权全体,转发请打赏哟

 

倘令你喜欢作者的稿子,能够经过Wechat扫一扫给自家打赏哟

图片 1

本文由星彩网app下载发布于计算机编程,转载请注明出处:计时器的贯彻

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。