0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡潔、小巧精干的軟件定時器—microLite_timer

冬至子 ? 來源:microLite裸機(jī)系統(tǒng) ? 作者:stevenLyan ? 2023-07-17 16:06 ? 次閱讀

01

掃描周期與時鐘節(jié)拍

一般小型系統(tǒng)由Background和Foreground構(gòu)成。Background稱為任務(wù)區(qū),F(xiàn)oreground稱為中斷區(qū)。對實時性要求很高的操作要由中斷區(qū)的中斷服務(wù)程序來完成。位于Background區(qū)域的任務(wù)響應(yīng)時間取決于超級循環(huán)(Super-Loops)執(zhí)行一次的時間,也稱之為掃描周期ScanCycleTime。掃描周期并不固定,任務(wù)執(zhí)行過程中掃描周期的最大值意味著任務(wù)最壞的響應(yīng)時間。

圖片

microLite裸機(jī)系統(tǒng)最小的時間單位是時鐘節(jié)拍(Tick),時鐘節(jié)拍是特定的周期性中斷,這個中斷可以看做是系統(tǒng)心跳,時鐘節(jié)拍由硬件定時器產(chǎn)生,當(dāng)中斷到來時,將調(diào)用一次ml_tick_increase()。不同硬件定時器的中斷實現(xiàn)不同,下面的中斷函數(shù)以 STM32 定時器作為示例:

void SysTick_Handler(void)
{
    ml_tick_increase();
}

在中斷函數(shù)中調(diào)用 ml_tick_increase()對全局變量 ml_tick 進(jìn)行自加,代碼如下:

void ml_tick_increase(void)
{
    ml_tick++;
}

通過調(diào)用 ml_tick_get會返回當(dāng)前 ml_tick 的值,即可以獲取到當(dāng)前的時鐘節(jié)拍值。此接口可用于獲取系統(tǒng)的最大掃描周期,或者測量某任務(wù)運(yùn)行的時間。接口函數(shù)如下:

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

02

microLite_timer介紹

軟件定時器microLite_timer提供兩類定時器機(jī)制:

  • 第一類是周期觸發(fā)定時器(MLPeriod),這類定時器會周期性的觸發(fā)定時器,并且“一旦啟動,永不停止”。
  • 第二類是單次觸發(fā)定時器(MLShot),這類定時器在啟動后只會觸發(fā)一次定時器事件,然后定時器自動停止。

03

應(yīng)用場景

周期觸發(fā)定時器(MLPeriod),適用于對首次觸發(fā)時間要求不嚴(yán)格的場合。比如,讓LED以280ms周期性亮滅。這種情況下我們并不關(guān)心LED首次由滅到亮用了多長時間,我們只要求LED在以后的時間以準(zhǔn)確的280ms周期性亮滅。

單次觸發(fā)定時器(MLShot),適用于對首次觸發(fā)時間要求嚴(yán)格的場合。另外MLshot定時器自動停止后,調(diào)用啟動函數(shù)MLShot.start,亦可實現(xiàn)周期觸發(fā)。

04

API接口

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

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

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

  • MLShot.start,啟動定時器;
  • MLShot.stop,停止定時器;
  • MLShot.check,檢查定時器是否超時。

05.1

MLPeriod編程范例

需求:讓4個任務(wù)分別以1000ms、500ms、500ms、800ms周期性執(zhí)行。

代碼實現(xiàn):

#include "microLite_timer.h"
#include "stdio.h"
void test1(void)
{
    MLPeriod.init();
    printf("microLite - Bare metal system, 2021 Copyright by stevenLyanrnrn");   
    printf("microLite timer sample, current tick is %d rn", ml_tick_get());
    while (1) {
        MLPeriod.run();
        if (MLPeriod.check(1000)) {
            printf("task1, current tick is %drn", ml_tick_get());
        }
        if (MLPeriod.check(500)) {
            printf("task2, current tick is %drn", ml_tick_get());
        }
        if (MLPeriod.check(500)) {
            printf("task3, current tick is %drn", ml_tick_get());
        }
        if (MLPeriod.check(800)) {
            printf("task4, current tick is %drn", ml_tick_get());
        }
    }
}

運(yùn)行效果:

microLite - Bare metal system, 2021 Copyright by stevenLyan


microLite timer sample, current tick is 9 
task2, current tick is 513
task3, current tick is 515
task4, current tick is 813
task1, current tick is 1013
task2, current tick is 1015
task3, current tick is 1018
task2, current tick is 1513
task3, current tick is 1515
task4, current tick is 1613
task1, current tick is 2013
task2, current tick is 2015
task3, current tick is 2018
task4, current tick is 2413

05.2

MLShot編程范例

需求:見下面“代碼實現(xiàn)”的注釋。

代碼實現(xiàn):

#include "microLite_timer.h"
#include "stdio.h"
static ml_shotTimer_TypeDef test2_timer1 = {0};
static ml_shotTimer_TypeDef test2_timer2 = {0};
static ml_shotTimer_TypeDef test2_timer3 = {0};
void test2(void)
{ 
    printf("microLite - Bare metal system, 2021 Copyright by stevenLyanrnrn");
    printf("microLite timer sample, current tick is %d rn", ml_tick_get());
    MLShot.start(&test2_timer1, 800);
    MLShot.start(&test2_timer2, 500);
    while (1) {
        /*----------------------------------------------------------------------------*/
        /* Schedules the specified task for execution after the specified delay.
              [the specified delay]:  [timer1]800 ticks */
        if (MLShot.check(&test2_timer1)) {
            printf("timer1 stop(auto), current tick is %d!!!rn", ml_tick_get());
        }
        /*----------------------------------------------------------------------------*/
        /* Schedules the specified task for repeated fixed-delay execution, beginning
                 after the specified delay.
                    [the specified delay]:  [timer2]500 ticks
                [repeated fixed-delay]: [timer3]1000 ticks
            */
        if (MLShot.check(&test2_timer2)) {
            MLShot.start(&test2_timer3, 1000);
            printf("timer2 stop(auto) and timer3 start, current tick is %d!!!rn", ml_tick_get());
        }
        if (MLShot.check(&test2_timer3)) {
            MLShot.start(&test2_timer3, 1000);
            printf("timer3 timeout, current tick is %drn", ml_tick_get());
        }
    }
}

運(yùn)行效果:

microLite - Bare metal system, 2021 Copyright by stevenLyan
microLite - Bare metal system, 2021 Copyright by stevenLyan


microLite timer sample, current tick is 9 
timer2 stop(auto) and timer3 start, current tick is 513!!!
timer1 stop(auto), current tick is 813!!!
timer3 timeout, current tick is 1514
timer3 timeout, current tick is 2515
timer3 timeout, current tick is 3516
timer3 timeout, current tick is 4517

06

注意事項

  • MLPeriod.run在一個掃描周期內(nèi),應(yīng)被調(diào)用一次且僅一次;
  • 不建議將MLPeriod.check的參數(shù)設(shè)置為不固定值;
  • 不建議嵌套使用MLPeriod.check;
  • MLPeriod支持定時周期不同的定時器的個數(shù)為ML_PERIODTIMER_MAX;
  • MLShot觸發(fā)后,定時器自動停止;
  • microLite_timer的定時精度由系統(tǒng)Tick時鐘的周期以及掃描周期決定。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    107682
  • 軟件定時器
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    6723
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    1992

    瀏覽量

    60987
  • stm32定時器
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2283
收藏 人收藏

    評論

    相關(guān)推薦

    GD32對Timer定時器原理的詳細(xì)講解

    GD32 Timr定時器看起來比較復(fù)雜啊。一看GD32E10x 的SPEC:一個高級定時器,三個通用定時器,還有一個基本定時器。 項目上想用來做分時處理程序都不知道用哪個? 就用通用的
    的頭像 發(fā)表于 04-22 17:02 ?1.6w次閱讀
    GD32對<b class='flag-5'>Timer</b><b class='flag-5'>定時器</b>原理的詳細(xì)講解

    基于STM32的軟件定時器設(shè)計

    軟件定時器是用程序模擬出來的定時器,可以由一個硬件定時器模擬出成千上萬個軟件定時器,這樣程序在需
    發(fā)表于 07-03 17:06 ?959次閱讀
    基于STM32的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>設(shè)計

    為什么選擇esp_timer定時器作為esp32首選軟件定時器

    定時器(esp_imer)1、為什么選擇esp_timer定時器作為esp32首選軟件定時器2、esp_
    發(fā)表于 01-07 08:14

    51定時器計算軟件

    MCS51_timer軟件說明:快速計算MCS51系列單片機(jī)定時器時間常數(shù)。
    發(fā)表于 10-23 17:06 ?117次下載
    51<b class='flag-5'>定時器</b>計算<b class='flag-5'>軟件</b>

    通用定時器(Timer)

    在 Stellaris 系列 ARM 內(nèi)部通常集成有 2~4 個通用定時器模塊(General-Purpose Timer Module,GPTM),分別稱為 Timer0、Timer
    發(fā)表于 01-13 16:34 ?23次下載

    通用定時器(Timer

    通用定時器(Timer
    發(fā)表于 10-11 15:10 ?6次下載
    通用<b class='flag-5'>定時器</b>(<b class='flag-5'>Timer</b>

    通用定時器(Timer)總體特性的功能概述和詳細(xì)的程序概述

    在Stellaris系列ARM內(nèi)部通常集成有2~4個通用定時器模塊(General-Purpose Timer Module,GPTM),分別稱為Timer0、Timer1、
    發(fā)表于 05-09 10:32 ?8次下載
    通用<b class='flag-5'>定時器</b>(<b class='flag-5'>Timer</b>)總體特性的功能概述和詳細(xì)的程序概述

    ESP8266的管腳的控制和軟件定時器的使用

    先說定時器,ESP8266內(nèi)部的定時器分為軟件定時器和硬件定時器。手冊中指出硬件定時器其實就跟單
    的頭像 發(fā)表于 07-29 14:57 ?9389次閱讀
    ESP8266的管腳的控制和<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的使用

    基于硬件定時器軟件定時器

    概括硬件定時器很精確,軟件定時器無論如何都有延遲,主要用在不需要精確定時的地方,而且軟件定時比較
    發(fā)表于 11-25 09:51 ?8次下載
    基于硬件<b class='flag-5'>定時器</b>的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

    ESP32 之 ESP-IDF 教學(xué)(三)——通用硬件定時器Timer

    ESP32 之 ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時器Timer)】文章目錄ESP32 之 ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時器Timer)】通用硬件
    發(fā)表于 11-26 11:36 ?37次下載
    ESP32 之 ESP-IDF 教學(xué)(三)——通用硬件<b class='flag-5'>定時器</b>(<b class='flag-5'>Timer</b>)

    FreeRTOS軟件定時器的使用步驟

    FreeRTOS軟件Timer有兩種:重復(fù)性的和一次性的Timer。軟件定時器使用有3步。
    的頭像 發(fā)表于 09-14 15:22 ?1823次閱讀

    基礎(chǔ)定時器實驗

    STM32內(nèi)部共有8個定時器,其中Timer1和Timer8屬于高級定時器,Timer2~Timer
    的頭像 發(fā)表于 03-01 15:59 ?1114次閱讀
    基礎(chǔ)<b class='flag-5'>定時器</b>實驗

    什么是軟件定時器?軟件定時器的實現(xiàn)原理

    軟件定時器是用程序模擬出來的定時器,可以由一個硬件定時器模擬出成千上萬個軟件定時器,這樣程序在需
    的頭像 發(fā)表于 05-23 17:05 ?2615次閱讀

    STM32L4定時器(TIMER)介紹

    電子發(fā)燒友網(wǎng)站提供《STM32L4定時器(TIMER)介紹.pdf》資料免費(fèi)下載
    發(fā)表于 08-01 14:24 ?0次下載
    STM32L4<b class='flag-5'>定時器</b>(<b class='flag-5'>TIMER</b>)介紹

    關(guān)于軟件定時器的一些討論

    這就是簡單的軟件定時器,是的,這就是特別簡潔版本的軟件定時器。當(dāng)然它是有缺點的,比如systick_ms每1ms加1,所以
    的頭像 發(fā)表于 10-13 16:14 ?498次閱讀
    關(guān)于<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的一些討論