microLite_timer,简洁、小巧精干的软件定时器


microLite_timer是裸机软件定时器,源自microLite裸机系统的Kernel组件。​

在本文的文末给出了microLite_timer的开源项目地址

注:在前面一篇文章《microLite裸机系统之内核(Kernel)》,我们简要介绍了microLite裸机系统的Kernel组件(主要由看门狗定时器和软件定时器组成)。microLite_timer相关函数名称与文章《microLite裸机系统之内核(Kernel)》有所不同。


扫描周期与时钟节拍

一般小型系统由Background和Foreground构成。Background称为任务区,Foreground称为中断区。对实时性要求很高的操作要由中断区的中断服务程序来完成。位于Background区域的任务响应时间取决于超级循环(Super-Loops)执行一次的时间,也称之为扫描周期ScanCycleTime。扫描周期并不固定,任务执行过程中扫描周期的最大值意味着任务最坏的响应时间。
在这里插入图片描述
microLite裸机系统最小的时间单位是时钟节拍(Tick),时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳,时钟节拍由硬件定时器产生,当中断到来时,将调用一次ml_tick_increase()。不同硬件定时器的中断实现不同,下面的中断函数以 STM32 定时器作为示例:

void SysTick_Handler(void)
{
   
    ml_tick_increase();
}

在中断函数中调用 ml_tick_increase()对全局变量 ml_tick 进行自加,代码如下:

void ml_tick_increase(void)
{
   
    ml_tick++;
}

通过调用 ml_tick_get会返回当前 ml_tick 的值,即可以获取到当前的时钟节拍值。此接口可用于获取系统的最大扫描周期,或者测量某任务运行的时间。接口函数如下:

ml_tick_t ml_tick_get(void)
{
   
    ml_tick_t t = 0;
    t = ml_tick;
    while (t != ml_tick) {
   
        t = ml_tick;
    }
    return t;
}

microLite_timer介绍

软件定时器microLite_timer提供两类定时器机制:

  • 第一类是周期触发定时器(MLPeriod),这类定时器会周期性的触发定时器,并且“一旦启动,永不停止”。

  • 第二类是单次触发定时器(MLShot),这类定时器在启动后只会触发一次定时器事件,然后定时器自动停止。


应用场景

周期触发定时器(MLPeriod),适用于对首次触发时间要求不严格的场合。比如,让LED以280ms周期性亮灭。这种情况下我们并不关心LED首次由灭到亮用了多长时间,我们只要求LED在以后的时间以准确的280ms周期性亮灭。

单次触发定时器(MLShot),适用于对首次触发时间要求严格的场合。另外MLshot定时器自动停止后,调用启动函数MLShot.start,亦可实现周期触发。


API接口

microLite_timer支持的MLPeriod接口主要包括:

  • MLPeriod.Init,初始化定时器;
  • MLPeriod.run;
  • MLPeriod.check,检查定时器是否超时。

microLite_timer支持的MLShot接口主要包括:

  • MLShot.start,启动定时器;
  • MLShot.stop,停止定时器;
  • MLShot.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值