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

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

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

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

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

冬至子 ? 來源:microLite裸機系統(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裸機系統(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ù)運行的時間。接口函數(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提供兩類定時器機制:

  • 第一類是周期觸發(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());
        }
    }
}

運行效果:

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

運行效果:

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

    文章

    1595

    瀏覽量

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

    關(guān)注

    0

    文章

    18

    瀏覽量

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

    關(guān)注

    14

    文章

    2033

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    2404
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

    51定時器計算軟件

    MCS51_timer軟件說明:快速計算MCS51系列單片機定時器時間常數(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 ?9861次閱讀
    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 ?38次下載
    ESP32 之 ESP-IDF 教學(xué)(三)——通用硬件<b class='flag-5'>定時器</b>(<b class='flag-5'>Timer</b>)

    msp432快速入門第十節(jié)之timer32定時器

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

    FreeRTOS軟件定時器的使用步驟

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

    基礎(chǔ)定時器實驗

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

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

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

    STM32L4定時器(TIMER)介紹

    電子發(fā)燒友網(wǎng)站提供《STM32L4定時器(TIMER)介紹.pdf》資料免費下載
    發(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 ?779次閱讀
    關(guān)于<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的一些討論
    主站蜘蛛池模板: 亚洲黄色官网 | 97影院3| 中文字幕亚洲一区 | 午夜美女视频在线观看高清 | 精品四虎免费观看国产高清 | 日本亚洲精品色婷婷在线影院 | 久久久久九九精品影院 | 国产看午夜精品理论片 | 人人澡人人人人夜夜爽 | 99香蕉精品视频在线观看 | 日韩欧美亚洲综合一区二区 | 欧美成人性色 | 日本午夜大片 | 韩国三级久久精品 | 一本大道一卡二卡四卡 | 欧美女同在线观看 | 伊人网址 | 干得好爽 | 男人资源网 | 午夜精品久久久久久久久 | 亚洲国产成人久久一区www | 国产99在线 | 亚洲黄色一区 | 亚洲地址一地址二地址三 | 亚洲合集综合久久性色 | 在线视频免费视频网站 | 国产黄网站在线观看 | 久久午夜精品视频 | 日本资源在线观看 | 婷婷深爱 | 精品国产一区二区三区成人 | 福利观看 | 天堂资源在线bt种子 | 亚洲高清日韩精品第一区 | 一久久 | 欧亚激情偷乱人伦小说视频 | 男人j进女人j的视频一进一出 | 一区二区三区伦理高清 | 日本三级免费网站 | 最新色视频 | 国内一国产农村妇女一级毛片 |