女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

完善資料讓更多小伙伴認識你,還能領(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ù)響應時間取決于超級循環(huán)(Super-Loops)執(zhí)行一次的時間,也稱之為掃描周期ScanCycleTime。掃描周期并不固定,任務(wù)執(zhí)行過程中掃描周期的最大值意味著任務(wù)最壞的響應時間。

圖片

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

void SysTick_Handler(void)
{
    ml_tick_increase();
}

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

void ml_tick_increase(void)
{
    ml_tick++;
}

通過調(diào)用 ml_tick_get會返回當前 ml_tick 的值,即可以獲取到當前的時鐘節(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

應用場景

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

單次觸發(fā)定時器(MLShot),適用于對首次觸發(fā)時間要求嚴格的場合。另外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),應被調(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)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1593

    瀏覽量

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

    關(guān)注

    0

    文章

    18

    瀏覽量

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

    關(guān)注

    14

    文章

    2031

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    2394
收藏 人收藏

    評論

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

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

    GD32 Timr定時器看起來比較復雜啊。一看GD32E10x 的SPEC:一個高級定時器,三個通用定時器,還有一個基本定時器。 項目上想用來做分時處理程序都不知道用哪個? 就用通用的
    的頭像 發(fā)表于 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_
    發(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)總體特性的功能概述和詳細的程序概述

    在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>)總體特性的功能概述和詳細的程序概述

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

    先說定時器,ESP8266內(nèi)部的定時器分為軟件定時器和硬件定時器。手冊中指出硬件定時器其實就跟單
    的頭像 發(fā)表于 07-29 14:57 ?9817次閱讀
    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 教學(三)——通用硬件定時器Timer

    ESP32 之 ESP-IDF 學習筆記(三)【通用硬件定時器Timer)】文章目錄ESP32 之 ESP-IDF 學習筆記(三)【通用硬件定時器Timer)】通用硬件
    發(fā)表于 11-26 11:36 ?38次下載
    ESP32 之 ESP-IDF 教學(三)——通用硬件<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有兩種:重復性的和一次性的Timer。軟件定時器使用有3步。
    的頭像 發(fā)表于 09-14 15:22 ?2107次閱讀

    基礎(chǔ)定時器實驗

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

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

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

    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)于軟件定時器的一些討論

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