色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    瀏覽量

    108108
  • 軟件定時器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6775
  • 觸發器
    +關注

    關注

    14

    文章

    2000

    瀏覽量

    61215
  • stm32定時器
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2300
收藏 人收藏

    評論

    相關推薦

    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 ?9536次閱讀
    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 ?1914次閱讀

    基礎定時器實驗

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

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

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

    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>的一些討論
    主站蜘蛛池模板: 嫩草影院成人| 久久中文字幕人妻AV熟女| 中文字幕亚洲欧美日韩2019| 午夜片无码区在线观看| 日本一本免费线观看视频| 男人大臿蕉香蕉大视频| 老妇xxxxbbbb| 久色乳综合思思在线视频| 精品国产自在现线拍国语| 国产乱子影视频上线免费观看| 国产短视频精品区| 国产激情文学| 国产精品久久久久久亚洲毛片| 国产精品97久久AV色婷婷| 国产AV精品无码免费看| 俄罗斯孩交精品| 国产69精品久久久久无码麻豆| 高h肉文合集| 国产精品1卡二卡三卡四卡乱码 | 精油按摩日本| 久久99re7在线视频精品| 久久久久久久99精品免费观看| 久久青草费线频观看国产| 久久亚洲精品中文字幕60分钟| 久久这里只有精品国产精品99| 男人叼女人| 日本精品久久久久中文字幕| 色欲AV无码乱码精品国产| 小黄文污到你湿| 亚洲欧美国产综合在线一区| 又长又大又粗又硬3p免费视频| 18禁止观看免费私人影院| 99久久精品国产一区二区三区| xxxxhd17欧美老师| 国产 日韩 欧美 高清 亚洲| 一本久道久久综合狠狠躁AV| 2020亚洲色噜噜狠狠网站| 插骚妇好爽好骚| 国产在线精品国自产拍影院午夜| 久久是热这里只有精品| 欧美亚洲国内日韩自拍视频|