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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

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

冬至子 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-05-23 17:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.什么是軟件定時器

軟件定時器是用程序模擬出來的定時器,可以由一個硬件定時器模擬出成千上萬個軟件定時器,這樣程序在需要使用較多定時器的時候就不會受限于硬件資源的不足,這是軟件定時器的一個優點,即數量不受限制。

但由于軟件定時器是通過程序實現的,其運行和維護都需要耗費一定的CPU資源,同時精度也相對硬件定時器要差一些。

2.軟件定時器的實現原理

Linux,uC/OS,FreeRTOS操作系統中,都帶有軟件定時器,原理大同小異。典型的實現方法是:通過一個硬件定時器產生固定的時鐘節拍,每次硬件定時器中斷到,就對一個全局的時間標記加一,每個軟件定時器都保存著到期時間。

程序需要定期掃描所有運行中的軟件定時器,將各個到期時間與全局時鐘標記做比較,以判斷對應軟件定時器是否到期,到期則執行相應的回調函數,并關閉該定時器。

以上是單次定時器的實現,若要實現周期定時器,即到期后接著重新定時,只需要在執行完回調函數后,獲取當前時間標記的值,加上延時時間作為下一次到期時間,繼續運行軟件定時器即可。

3.基于STM32的軟件定時器

3.1 時鐘節拍

軟件定時器需要一個硬件時鐘源作為基準,這個時鐘源有一個固定的節拍(可以理解為秒針的每次滴答),用一個32位的全局變量tickCnt來記錄這個節拍的變化:

static volatile uint32_t tickCnt = 0;    //軟件定時器時鐘節拍

每來一個節拍就對tickCnt加一(記錄滴答了多少下):

/* 需在定時器中斷內執行 */void tickCnt_Update(void){    tickCnt++;}

一旦開始運行,tickCnt將不停地加一,而每個軟件定時器都記錄著一個到期時間,只要tickCnt大于該到期時間,就代表定時器到期了。

3.2 數據結構

軟件定時器的數據結構決定了其執行的性能和功能,一般可分為兩種:數組結構和鏈表結構。什么意思呢?這是(多個)軟件定時器在內存中的存儲方式,可以用數組來存,也可以用鏈表來存。

兩者的優劣之分就是兩種數據結構的特性之分:數組方式的定時器查找較快,但數量固定,無法動態變化,數組大了容易浪費內存,數組小了又可能不夠用,適用于定時事件明確且固定的系統;鏈表方式的定時器數量可動態增減,易造成內存碎片(如果沒有內存管理),查找的時間開銷相對數組大,適用于通用性強的系統,Linux,uC/OS,FreeRTOS等操作系統用的都是鏈表式的軟件定時器。

本文使用數組結構:

static softTimer timer[TIMER_NUM];        //軟件定時器數組

數組和鏈表是軟件定時器整體的數據結構,當具體到單個定時器時,就涉及軟件定時器結構體的定義,軟件定時器所具有的功能與其結構體定義密切相關,以下是本文中軟件定時器的結構體定義:

typedef struct softTimer {    uint8_t state;           //狀態    uint8_t mode;            //模式    uint32_t match;          //到期時間    uint32_t period;         //定時周期    callback *cb;            //回調函數指針    void *argv;              //參數指針    uint16_t argc;           //參數個數}softTimer;

定時器的狀態共有三種,默認是停止,啟動后為運行,到期后為超時。

typedef enum tmrState {    SOFT_TIMER_STOPPED = 0,  //停止    SOFT_TIMER_RUNNING,      //運行    SOFT_TIMER_TIMEOUT       //超時}tmrState;

模式有兩種:到期后就停止的是單次模式,到期后重新定時的是周期模式。

typedef enum tmrMode {    MODE_ONE_SHOT = 0,       //單次模式    MODE_PERIODIC,           //周期模式}tmrMode;

不管哪種模式,定時器到期后,都將執行回調函數,以下是該函數的定義,參數指針argv為void指針類型,便于傳入不同類型的參數。

typedef void callback(void *argv, uint16_t argc);

上述結構體中的模式state和回調函數指針cb是可選的功能,如果系統不需要周期執行的定時器,或者不需要到期后自動執行某個函數,可刪除此二者定義。

3.3 定時器操作

3.3.1 初始化

首先是軟件定時器的初始化,對每個定時器結構體的成員賦初值,雖說static變量的初值為0,但個人覺得還是有必要保持初始化變量的習慣,避免出現一些奇奇怪怪的BUG。

void softTimer_Init(void)
{
    uint16_t i;
    for(i=0; i

3.3.2 啟動

啟動一個軟件定時器不僅要改變其狀態為運行狀態,同時還要告訴定時器什么時候到期(當前tickCnt值加上延時時間即為到期時間),單次定時還是周期定時,到期后執行哪個函數,函數的參數是什么,交代好這些就可以開跑了。

void softTimer_Start(uint16_t id, tmrMode mode, uint32_t delay, callback *cb, void *argv, uint16_t argc)
{
    assert_param(id < TIMER_NUM);
    assert_param(mode == MODE_ONE_SHOT || mode == MODE_PERIODIC);
    
    timer[id].match = tickCnt_Get() + delay;
    timer[id].period = delay;
    timer[id].state = SOFT_TIMER_RUNNING;
    timer[id].mode = mode;
    timer[id].cb = cb;
    timer[id].argv = argv;
    timer[id].argc = argc;
}

上面函數中的assert_param()用于參數檢查,類似于庫函數assert()。

3.3.3 更新

本文中軟件定時器有三種狀態:停止,運行和超時,不同的狀態做不同的事情。停止狀態最簡單,啥事都不做;運行狀態需要不停地檢查有沒有到期,到期就執行回調函數并進入超時狀態;超時狀態判斷定時器的模式,如果是周期模式就更新到期時間,繼續運行,如果是單次模式就停止定時器。這些操作都由一個更新函數來實現:

void softTimer_Update(void)
{
    uint16_t i;
    
    for(i=0; i

3.3.4 停止

如果定時器跑到一半,想把它停掉,就需要一個停止函數,操作很簡單,改變目標定時器的狀態為停止即可:

void softTimer_Stop(uint16_t id)
{
    assert_param(id < TIMER_NUM);
    timer[id].state = SOFT_TIMER_STOPPED;
}

3.3.5 讀狀態

又如果想知道一個定時器是在跑著呢還是已經停下來?也很簡單,返回它的狀態:

uint8_t softTimer_GetState(uint16_t id)
{
    return timer[id].state;
}

或許這看起來很怪,為什么要返回,而不是直接讀?別忘了在前面3.2節中定義的定時器數組是個靜態全局變量,該變量只能被當前源文件訪問,當外部文件需要訪問它的時候只能通過函數返回,這是一種簡單的封裝,保持程序的模塊化。

3.4 測試

最后,當然是來驗證一下我們的軟件定時器有沒達到預想的功能。

定義三個定時器:

定時器TMR_STRING_PRINT只執行一次,1s后在串口1打印一串字符;

定時器TMR_TWINKLING為周期定時器,周期為0.5s,每次到期都將取反LED0的狀態,實現LED0的閃爍;

定時器TMR_DELAY_ON執行一次,3s后點亮LED1,跟第一個定時器不同的是,此定時器的回調函數是個空函數nop(),點亮LED1的操作通過主循環中判斷定時器的狀態來實現,這種方式在某些場合可能會用到。

static uint8_t data[] = {1,2,3,4,5,6,7,8,9,0};

int main(void)
{
    USART1_Init(115200);
    TIM4_Init(TIME_BASE_MS);
    TIM4_NVIC_Config();
    LED_Init();
    
    printf("I just grabbed a spoon.\\r\\n");
    
    softTimer_Start(TMR_STRING_PRINT, MODE_ONE_SHOT, 1000, stringPrint, data, 5);
    softTimer_Start(TMR_TWINKLING, MODE_PERIODIC, 500, LED0_Twinkling, NULL, 0);
    softTimer_Start(TMR_DELAY_ON, MODE_ONE_SHOT, 3000, nop, NULL, 0);
    
    while(1) {
        softTimer_Update();
        if(softTimer_GetState(TMR_DELAY_ON) == SOFT_TIMER_TIMEOUT) {
            LED1_On();
        }
    }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1596

    瀏覽量

    109590
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3675

    瀏覽量

    131222
  • 軟件定時器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6931
  • FreeRTOS
    +關注

    關注

    12

    文章

    492

    瀏覽量

    64141
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于STM32的軟件定時器設計

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

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

    什么是軟件定時器軟件定時器實現原理是什么?
    發表于 11-24 06:43

    定時器初值計算軟件工具

    定時器初值計算軟件工具
    發表于 03-20 10:23 ?239次下載

    555定時器電路設計軟件

    555定時器電路設計軟件
    發表于 03-02 11:29 ?288次下載

    555定時器應用設計軟件免費下載

    本文檔的主要內容詳細介紹的是555定時器應用設計軟件免費下載,本軟件是一款555定時器設計軟件,使用非常方便。
    發表于 12-17 08:00 ?51次下載
    555<b class='flag-5'>定時器</b>應用設計<b class='flag-5'>軟件</b>免費下載

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

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

    設計軟件定時器

    軟件定時器搬來使用2、自己設計軟件定時器這里我只介紹第二種方法,我們知道,硬件定時器是通過對系統時鐘周期進行計數
    發表于 11-05 18:35 ?2次下載
    設計<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>

    STM32開發項目:軟件虛擬定時器實現

    目錄背景軟件定時器庫特性源碼介紹softwaretimer.csoftwaretimer.h使用指南背景在不運行實時操作系統的單片機中,面對一些復雜的項目需求時,僅有的幾個硬件定時器顯得有些捉襟見肘
    發表于 12-24 19:15 ?1次下載
    STM32開發項目:<b class='flag-5'>軟件</b>虛擬<b class='flag-5'>定時器</b>的<b class='flag-5'>實現</b>

    軟件定時器簡介及程序配置

      軟件定時器就是允許函數設置一定的等待時間,然后執行。定時器執行的函數被稱為定時器的回調函數。定時器從啟動到執行回調函數之間的時間稱為
    的頭像 發表于 12-06 16:10 ?4450次閱讀
    <b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>簡介及程序配置

    單片機軟件定時器實現方法

    定時器個數一般都比較少,在一些有多個周期性操作的應用場合就無法滿足要求。這時,就可以基于硬件定時器派生出軟件定時器,來滿足這種多種周期性或多個單次延時操作的需求。
    的頭像 發表于 01-17 15:14 ?5755次閱讀
    單片機<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>的<b class='flag-5'>實現</b>方法

    freeRTOS軟件定時器的使用

    freeRTOS中加入了軟件定時器這個功能組件,是一個可選的、不屬于freeRTOS內核的功能,由定時器服務(其實就是一個定時器任務)來提供。
    的頭像 發表于 02-10 13:55 ?2968次閱讀

    Free RTOS的軟件定時器

    軟件定時器是FreeRTOS中的一個重要模塊,使用軟件定時器可以方便的實現一些與超時或周期性相關的功能。
    的頭像 發表于 02-10 15:53 ?2911次閱讀
    Free RTOS的<b class='flag-5'>軟件</b><b class='flag-5'>定時器</b>

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

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

    如何實現一個軟件定時器

    在Linux,uC/OS,FreeRTOS等操作系統中,都帶有軟件定時器,原理大同小異。典型的實現方法是:通過一個硬件定時器產生固定的時鐘節拍,每次硬件
    的頭像 發表于 04-29 11:00 ?1120次閱讀
    主站蜘蛛池模板: 秋霞三级理伦免费观看 | 99精品电影一区二区免费看 | 欧美写真视频一区 | 王雨纯羞羞 | 色男人综合 | 欧美日韩亚洲第一区在线 | 蜜臀AV久久国产午夜福利软件 | 国产跪地吃黄金喝圣水合集 | 无码国产伦一区二区三区视频 | 欧美精品成人一区二区在线观看 | 亲胸揉胸膜下刺激视频网站APP | 别停好爽好深好大好舒服视频 | 免费看a视频 | www伊人网| 国产精品综合AV一区二区国产馆 | 一本道本线中文无码 | 久爱精品亚洲电影午夜 | 美女打开双腿扒开屁股男生 | 久久一本岛在免费线观看2020 | 国产精品成人A蜜柚在线观看 | 久青草国产在线观看视频 | 欧美日韩免费看 | 视频一区亚洲视频无码 | 69日本人XXXX护士HD | 亚洲日本欧美国产在线视 | 日韩娇小性hd | 免费国产午夜理论不卡 | 亚洲.日韩.欧美另类 | 91精品国产色综合久久不 | 97在线看视频福利免费 | 欧美激情视频一区二区 | 丁香美女社区 | 欧美激情一区二区三区四区 | 久久国产欧美日韩精品免费 | 亚洲日本香蕉视频观看视频 | 最美女人体内射精一区二区 | 国产精品久久久久久人妻精品流 | a国产成人免费视频 | 久久精品天天爽夜夜爽 | 久久久精品久久久久久 | 我的奶头被客人吸的又肿又红 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品