軟件定時器詳解:RTOS 中的“軟時鐘”機制與源碼解析

????????在嵌入式實時系統開發中,定時器是不可或缺的工具。軟件定時器(Software Timer) 提供了一種無需創建獨立任務、便可在特定延時后執行回調函數的機制。它適用于那些不要求高精度、但需要周期性或一次性延時執行操作的場景。

一、什么是軟件定時器?

????????軟件定時器是在 RTOS 內核中由專門的“定時器服務任務”統一管理的一類定時機制。不同于硬件定時器依賴 MCU 的定時器外設,軟件定時器完全由軟件實現,基于 RTOS 的節拍時鐘(tick)驅動。

本質上:軟件定時器就是一個在若干 tick 后觸發的回調函數。

二、軟件定時器的典型用途

應用場景示例
周期性任務LED 閃爍、數據上傳
延時執行操作延遲關閉設備
替代硬件定時器節省資源GPIO 超時檢測
防抖處理、狀態切換延遲等按鍵防抖、狀態復位

優勢

  • 不占用額外任務資源

  • 系統統一調度,調試方便

  • 可動態創建、刪除、啟動、停止

  • 支持周期性和一次性定時

三、FreeRTOS 中軟件定時器核心結構與源碼解讀

????????FreeRTOS 軟件定時器的核心結構體是 Timer_t,但對用戶公開的類型為 TimerHandle_t。管理定時器的關鍵組件包括:

1. 創建定時器:xTimerCreate

TimerHandle_t xTimerCreate(const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction );

參數說明

  • pcTimerName:定時器名稱(可調試用)

  • xTimerPeriodInTicks:周期時間(tick)

  • uxAutoReload:是否自動重裝(周期性)

  • pvTimerID:用戶定義的數據指針

  • pxCallbackFunction:定時器超時時調用的回調函數

TimerHandle_t myTimer = xTimerCreate("LEDTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, vLEDCallback);

2. 啟動定時器:xTimerStart

xTimerStart(myTimer, 0);

將定時器放入活動鏈表,等待 Tick 累加觸發。

3. 停止定時器:xTimerStop

xTimerStop(myTimer, 0);

可用于手動取消定時操作。

4. 回調函數定義

void vLEDCallback(TimerHandle_t xTimer) {// 執行定時任務,比如切換 LED 狀態
}

注意:回調函數中不能調用阻塞操作(如 vTaskDelay),應盡可能快速完成邏輯。

5. 定時器服務任務機制

FreeRTOS 中有一個專門的任務叫做 定時器服務任務(Timer Service Task),用于處理所有軟件定時器的事件。其本質是一個優先級較高、等待定時器消息隊列的任務。

源碼入口在 timers.c 中的 prvTimerTask

static void prvTimerTask( void *pvParameters )
{for( ;; ){// 等待來自定時器命令隊列的消息(如啟動/停止)xQueueReceive(xTimerQueue, &xMessage, portMAX_DELAY);switch(xMessage.xMessageID) {case tmrCOMMAND_START:// 添加定時器到活動鏈表break;case tmrCOMMAND_EXECUTE_CALLBACK:// 執行用戶回調函數pxTimer->pxCallbackFunction((TimerHandle_t) pxTimer);break;// ...其他命令處理}}
}

其調度機制由 tick 中斷驅動,在 xTaskIncrementTick() 中判斷是否觸發回調。

四、完整使用示例:LED 閃爍控制

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"#define LED_PIN 13TimerHandle_t ledTimer;void vLEDCallback(TimerHandle_t xTimer) {static int led_state = 0;led_state = !led_state;gpio_set_level(LED_PIN, led_state);
}void app_main() {gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);ledTimer = xTimerCreate("LEDTimer", pdMS_TO_TICKS(500), pdTRUE, NULL, vLEDCallback);xTimerStart(ledTimer, 0);
}

五、常見問題與注意事項

  1. 為什么不在任務中直接用 vTaskDelay
    因為軟件定時器可以統一調度,不占用額外任務資源,更適合事件驅動模型。

  2. 能不能在中斷中操作軟件定時器?
    是的,FreeRTOS 提供 ISR 安全版本,如 xTimerStartFromISR

  3. 軟件定時器精度如何?
    精度取決于系統 tick 周期,一般不適合要求微秒級精度的應用。

  4. 最大支持多少個定時器?
    由系統內存和隊列大小決定,可配置,但通常可支持上百個。

六、小結

特性軟件定時器
精度Tick 周期決定
觸發方式回調函數
ISR 安全性提供 FromISR 版本支持
占用資源少,無需額外任務
適用場景周期任務、延時處理、狀態切換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86317.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從Yocto中獲取源碼用傳統的方式單獨編譯

要獲取 Yocto 構建后的 Linux 內核和 U-Boot 源碼,并進行獨立編譯,需獲取完整的源碼樹(包含所有應用補丁和配置)及原始配置信息。以下是具體步驟: 獲取最終源碼路徑確定構建目錄位置: 內核工作目錄 KERNEL_WORKDIR=$(bitbake -e virtual/kernel | grep ^WORKDIR= | cut…

【記錄】服務器|常見的八種硬盤接口的簡介和清晰的接口圖片(2025年6月)

硬盤接口很多,在管服務器的時候總是要買,但是偶爾會忘記自己的服務器支持什么接口,此時就需要看引腳。 如果沒插滿,就可以直接拍接口的圖片,與下面這些圖片對照一下【文字介紹是AI直接生成的,圖片是我到處…

在一個成熟產品中,如何設計數據庫架構以應對客戶字段多樣化,確保系統的可維護性、可擴展性和高性能。

在SaaS系統、平臺型應用或高度可配置的企業級軟件中,我們常常會遇到一個現實問題:不同客戶對同一個業務表存在差異化字段需求。例如,A客戶需要一個“業務員等級”字段,B客戶不需要;C客戶希望訂單表中增加“海外倉編碼”…

社群營銷應該怎么玩

現在做營銷,光靠打廣告可不行了。大家都喜歡扎堆兒,找志同道合的人一起玩,這就是社群的力量。那怎么用好這股力量呢?咱們慢慢聊。 首先得明白,社群不是拉個群就完事了。關鍵是要讓大家覺得這里有意思,有收…

【論文閱讀筆記】TransparentGS:當高斯濺射學會“看穿”玻璃,如何攻克透明物體重建難題?

文章目錄 TransparentGS: Fast Inverse Rendering of Transparent Objects with GaussiansInfoAbstractIntroductionMethod預備知識3D GS的概念不再贅述渲染方程透明高斯Gaussian Light Field Probes多階段重建實驗結果和評估消融實驗應用討論和限制結論TransparentGS: Fast In…

某視頻網站運維工程師面試題

某視頻網站運維工程師面試題 1、 簡單寫下Xeon和Itanium這兩個產品的本質區別? 2、 ECC內存每Bank的顆粒數是單數還是雙數的? 3、 假如有5塊1T的硬盤,要求組合成盡量多的實際使用空間并至少容忍壞2盤而不影響raid組工作。請問有幾種模式來組…

Java底層原理:深入理解JVM性能調優與監控

一、JVM性能調優概述 JVM性能調優是Java應用優化的重要環節,通過合理配置JVM參數,可以提高Java應用的性能和穩定性。JVM性能調優的主要目標是減少垃圾回收的頻率和時間,提高線程的運行效率,優化內存的使用。 (一&…

Joblib庫多進程/線程使用(一):使用generator參數實現邊響應邊使用

進程與線程的基本概念 特性進程 (Process)線程 (Thread)定義 操作系統分配資源的基本單位(獨立的內存空間) 多進程可真正并行(利用多核 CPU) 進程內的執行單元(共享進程資源)獨立性完全獨立,崩…

css上下滾動文字

效果圖 取得是數組里的數據 上下滾動切換 css .notice-new {background: #222222;border-radius: 19rpx;margin-top: 28rpx;font-size: 24rpx;color: white;font-weight: 500;padding: 0 20rpx;height: 55rpx;line-height: 55rpx;overflow: hidden;.notice-scroll-wrapper {pos…

概念篇: 01-帶你認識Dockerfile

在本篇文章中,我們將帶你認識 Dockerfile —— 構建 Docker 鏡像的"藍圖"。我們會介紹它的基本概念和常用指令,幫助你理解如何使用它來打包你的應用。 簡單了解 Docker(背景知識) 在我們深入 Dockerfile 之前&#xf…

技術倫理之爭:OpenAI陷抄襲風波,法院強制下架宣傳視頻

在AI巨頭OpenAI宣布以65億美元天價收購蘋果前設計總監Jony Ive的硬件公司IO僅一個月后,一場抄襲指控將這家科技明星企業推上風口浪尖。 源自谷歌X實驗室的初創企業IYO將OpenAI告上法庭,指控其竊取智能耳塞核心技術,并通過巨額收購試圖掩蓋抄襲…

前沿解讀:缺陷如何操控二維半導體中的電子摩擦耗散超快動力學

摩擦能耗約占全球一次能源損耗的1/3,在微納器件中尤為突出。二維半導體(如WS?)因其獨特的電子特性成為研究熱點,但電子摩擦的動態機制因電子行為的超快特性長期難以捕捉。近期清華團隊在Nature Communications發表的研究[1]&…

什么是物聯網 (IoT)?

你家是否安裝了智能恒溫器?或者你屬于三分之一的美國健身追蹤器用戶,通過設備記錄運動習慣?如果是,你已在使用物聯網技術。這項技術不僅融入日常生活,更深刻改變著組織的運營方式。物聯網通過多種技術連接數字與物理世…

[特殊字符] Windows 查看端口占用及服務來源教程(以 9018 端口為例)

下面是一份詳細的 Windows 系統中排查 某端口(如 9018)被哪個程序占用 并確定其具體服務來源的完整教程,適合用于日常運維、開發部署排障等場景。 🎯 Windows 查看端口占用及服務來源教程(以 9018 端口為例&#xff09…

異步爬蟲 原理與解析

先遍歷100遍一個程序 import requests import logging import timelogging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s: %(message)s) TOTAL_NUMBER 100 BASE_URL https://ssr4.scrape.center/start_time time.time() for id in range(1,TOTAL_NUM…

vscode管理go多個版本

#1.下載go安裝包 https://developer.aliyun.com/mirror/golang/?spma2c6h.25603864.0.0.55ea7c45IsI4GM # 2.創建 sdk 目錄(如果不存在) mkdir -p ~/sdk # 3.解壓下載的 go1.16.15 到 ~/sdk/ tar -C ~/sdk -xzf go1.16.15.linux-amd64.tar.gz # 4.重…

香港維爾利健康科技集團推出AI輔助醫學影像訓練平臺,助力醫護人才數字化轉型

香港維爾利健康科技集團近日正式發布其自主研發的“AI輔助醫學影像訓練平臺(V-MedTrain)”,這一創新平臺的上線,標志著醫學影像教育邁入智能化輔助教學新時代。依托人工智能與大數據分析技術,香港維爾利健康科技集團在…

互聯網+醫療,醫療服務的全方位革新

近年來,互聯網醫療行業迅速崛起,為醫療健康服務帶來了翻天覆地的變革。新模式、新業態層出不窮,不僅大幅提升了醫療健康服務的可及性,也使得群眾就醫體驗更為舒適、便捷。互聯網技術的廣泛應用,不僅改變了醫療核心業務…

酒店智能門鎖系統常見問題解決方法——東方仙盟

重做系統后 usb發卡器與注冊時發卡器不一致 解決發方法: 用總卡重新注冊軟件,要可以開房間的總卡 房號不存在 2聲---正確提示,表示是設置卡 3聲---門鎖已反鎖,解決方法:用能開反鎖的卡或解除反鎖 6聲---房號不對,解決方法&#…

從零開始理解百度語音識別API的Python實現

大家好!今天我要給大家詳細講解一個使用百度語音識別API的Python代碼。這個代碼可以將音頻文件轉換成文字,非常適合做語音轉文字的應用。我會從最基礎的概念開始講起,確保沒有任何編程基礎的朋友也能理解。 翻譯 一、代碼概覽 這段代碼主要…