在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

冬至子 ? 來源:microLite裸機系統 ? 作者:stevenLyan ? 2023-07-17 16:06 ? 次閱讀

01

掃描周期與時鐘節拍

一般小型系統由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;
}

02

microLite_timer介紹

軟件定時器microLite_timer提供兩類定時器機制:

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

03

應用場景

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

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

04

API接口

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

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

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

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

05.1

MLPeriod編程范例

需求:讓4個任務分別以1000ms、500ms、500ms、800ms周期性執行。

代碼實現:

#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());
        }
    }
}

運行效果:

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編程范例

需求:見下面“代碼實現”的注釋。

代碼實現:

#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());
        }
    }
}

運行效果:

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在一個掃描周期內,應被調用一次且僅一次;
  • 不建議將MLPeriod.check的參數設置為不固定值;
  • 不建議嵌套使用MLPeriod.check;
  • MLPeriod支持定時周期不同的定時器的個數為ML_PERIODTIMER_MAX;
  • MLShot觸發后,定時器自動停止;
  • microLite_timer的定時精度由系統Tick時鐘的周期以及掃描周期決定。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    108144
  • 軟件定時器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6775
  • 觸發器
    +關注

    關注

    14

    文章

    2000

    瀏覽量

    61226
  • stm32定時器
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2301
收藏 人收藏

    評論

    相關推薦

    GD32對Timer定時器原理的詳細講解

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

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

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

    51定時器計算軟件

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

    通用定時器(Timer)

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

    通用定時器(Timer

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

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

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

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

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

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

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

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

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

    msp432快速入門第十節之timer32定時器

    縱觀整個程序,主要是通過中斷觸發定時器來使LED亮1s(2)配置自己的函數第一步 配置定時器配置定時器Timer32: //配置timer3
    發表于 12-07 18:51 ?9次下載
    msp432快速入門第十節之<b class='flag-5'>timer</b>32<b class='flag-5'>定時器</b>

    FreeRTOS軟件定時器的使用步驟

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

    基礎定時器實驗

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

    什么是軟件定時器軟件定時器的實現原理

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

    STM32L4定時器(TIMER)介紹

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

    關于軟件定時器的一些討論

    這就是簡單的軟件定時器,是的,這就是特別簡潔版本的軟件定時器。當然它是有缺點的,比如systick_ms每1ms加1,所以
    的頭像 發表于 10-13 16:14 ?579次閱讀
    關于<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的一些討論
    主站蜘蛛池模板: 永久福利盒子日韩日韩免费看| 白嫩美女在线啪视频观看| 伊人手机在线观看| 男人扒开美女尿口无遮挡图片| 美女写真mm爽爽爽| 99精品热| 香蕉视频在线观看黄| 天堂伊人| 日本怡红| 五月天婷婷在线观看| 色多多在线观看高清免费| 日韩一区二区视频| 免费视频你懂得| 久久久鲁| 给个网站可以在线观看你懂的| bt天堂资源种子在线| 天天天色| 操人网站| 亚洲男人天堂2020| 91九色porny蝌蚪| 天堂资源在线官网| 色人岛| 欧美大片一区| 国产日本在线观看| 亚洲国产综合视频| 欧美黄色免费大片| 欧美黑人巨大xxx猛交| 美女露出尿口让男人桶爽网站| 亚洲伊人久久大香线蕉啊| 三级色图| 国内精品视频| 毛片美女| 爱我免费视频观看在线www| 天天在线免费视频| 国产免费的野战视频| 91网站在线播放| hdhdhd69日本xxx| 最新国产厕所| 日本天堂影院| 成人精品久久| 久久香蕉国产线看观看亚洲片|