日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ucosii定时器

發(fā)布時(shí)間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ucosii定时器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


UCOSII從V2.83版本以后,加入了軟件定時(shí)器,這使得UCOSII的功能更加完善,在其上的應(yīng)用程序開發(fā)與移植也更加方便。在實(shí)時(shí)操作系統(tǒng)中一個(gè)好的軟件定時(shí)器實(shí)現(xiàn)要求有較高的精度、較小的處理器開銷,且占用較少的存儲器資源。
ucosII關(guān)于定時(shí)器的內(nèi)容在os_tmr.c文件內(nèi),需使能os_cfg.h中的OS_CFG_TMR_EN來啟動(dòng)定時(shí)器服務(wù)。
定時(shí)器服務(wù)為在協(xié)議棧處理,IO定時(shí)輪詢的設(shè)備中提供了很大的方便。

1)軟件定時(shí)器工作原理

軟件定時(shí)器同樣由OSTimTick提供時(shí)鐘,但是軟件定時(shí)器的時(shí)鐘還OS_TMR_CFG_TICKS_PER_SEC設(shè)置的控制,也就是在UCOSII的時(shí)鐘節(jié)拍上面再做了一次“分頻”,軟件定時(shí)器的最快時(shí)鐘節(jié)拍就等于UCOSII的系統(tǒng)時(shí)鐘節(jié)拍。這也決定了軟件定時(shí)器的精度。
定時(shí)時(shí)間一到,則系統(tǒng)會調(diào)用用戶函數(shù)實(shí)現(xiàn)特定功能。

2)軟件定時(shí)器在ucos_ii的實(shí)現(xiàn)原理

UCOSII中軟件定時(shí)器的實(shí)現(xiàn)方法是,將定時(shí)器按定時(shí)時(shí)間分組,使得每次時(shí)鐘節(jié)拍到來時(shí)只對部分定時(shí)器進(jìn)行比較操作,縮短了每次處理的時(shí)間。但這就需要?jiǎng)討B(tài)地維護(hù)一個(gè)定時(shí)器組。定時(shí)器組的維護(hù)只是在每次定時(shí)器到時(shí)時(shí)才發(fā)生,而且定時(shí)器從組中移除和再插入操作不需要排序。這是一種比較高效的算法,減少了維護(hù)所需的操作時(shí)間。
UCOSII軟件定時(shí)器實(shí)現(xiàn)了3類鏈表的維護(hù):

OS_EXT OS_TMR OSTmrTbl[OS_TMR_CFG_MAX]; //定時(shí)器控制塊數(shù)組OS_EXT OS_TMR *OSTmrFreeList; //空閑定時(shí)器控制塊鏈表指針OS_EXT OS_TMR_WHEEL OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]; //定時(shí)器輪
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

其中OS_TMR為定時(shí)器控制塊,定時(shí)器控制塊是軟件定時(shí)器管理的基本單元,包含軟件定時(shí)器的名稱、定時(shí)時(shí)間、在鏈表中的位置、使用狀態(tài)、使用方式,以及到時(shí)回調(diào)函數(shù)及其參數(shù)等基本信息。

OSTmrTbl[OS_TMR_CFG_MAX];:以數(shù)組的形式靜態(tài)分配定時(shí)器控制塊所需的RAM空間,并存儲所有已建立的定時(shí)器控制塊,OS_TMR_CFG_MAX為最大軟件定時(shí)器的個(gè)數(shù)。

OSTmrFreeLiSt:為空閑定時(shí)器控制塊鏈表頭指針。空閑態(tài)的定時(shí)器控制塊(OS_TMR)中,OSTmrNext和OSTmrPrev兩個(gè)指針分別指向空閑控制塊的前一個(gè)和后一個(gè),組織了空閑控制塊雙向鏈表。建立定時(shí)器時(shí),從這個(gè)鏈表中搜索空閑定時(shí)器控制塊。

OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:該數(shù)組的每個(gè)元素都是已開啟定時(shí)器的一個(gè)分組,元素中記錄了指向該分組中第一個(gè)定時(shí)器控制塊的指針,以及定時(shí)器控制塊的個(gè)數(shù)。運(yùn)行態(tài)的定時(shí)器控制塊(OS_TMR)中,OSTmrNext和OSTmrPrev兩個(gè)指針同樣也組織了所在分組中定時(shí)器控制塊的雙向鏈表。軟件定時(shí)器管理所需的數(shù)據(jù)結(jié)構(gòu)示意圖如圖所示

如果使能了定時(shí)器服務(wù),在ucos初始化的時(shí)候,系統(tǒng)便自動(dòng)創(chuàng)建了一個(gè)任務(wù)OSTmr_Task(),每次節(jié)拍到達(dá)便判斷相應(yīng)定時(shí)輪中定時(shí)器的定時(shí)是否到達(dá),如果到達(dá)則調(diào)用相應(yīng)的回調(diào)函數(shù)。

3)軟件定時(shí)器在ucosII的實(shí)現(xiàn)過程

軟件定時(shí)器由硬件定時(shí)器提供基準(zhǔn)Tr,可以通過宏定義OS_TMR_CFG_TICKS_PER_SECOND對硬件定時(shí)器節(jié)拍進(jìn)行分頻即軟件定時(shí)器時(shí)鐘節(jié)拍為 Tr*OS_TMR_CFG_TICKS_PER_SECOND。
硬件定時(shí)器節(jié)拍時(shí)刻到后觸發(fā)中斷。如果使能了定時(shí)器服務(wù),在SysTic_Handler()中斷函數(shù)中通過一系列調(diào)用,最后到執(zhí)行到OSTimeTickhook()函數(shù),在該函數(shù)中會判斷該時(shí)刻是否是軟件定時(shí)器的節(jié)拍時(shí)刻,如果是,則通過釋放一個(gè)信號量OSTmrSemSignal來激活正在等待改信號量的OSTmrTask()任務(wù)。

在ucos初始化的時(shí)候,系統(tǒng)便自動(dòng)創(chuàng)建了一個(gè)任務(wù)OSTmr_Task(),其優(yōu)先級,堆棧大小等于任務(wù)相關(guān)的參數(shù)在os_cfg.h中定義。在OSTmr_Task()任務(wù)中等待OSTmrSemSignal信號量。并定義了一個(gè)變量OSTimTick來計(jì)時(shí)軟件定時(shí)器的節(jié)拍。OSTmrSemSignal信號量一旦有效OSTimTick便加1并判斷相應(yīng)定時(shí)輪中定時(shí)器的定時(shí)是否到達(dá),如果到達(dá)則調(diào)用相應(yīng)的回調(diào)函數(shù)完成定時(shí)器操作。

4)使用軟件定時(shí)器

在ucos_ii.h中,聲明了下面8個(gè)函數(shù)供用戶使用。

OSTmrCreate(); OSTmrDel(); OSTmrNameGet(); OSTmrRemainGet(); OSTmrStateGet(); OSTmrStart(); OSTmrStop(); OSTmrSignal();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1、定時(shí)器任務(wù)參數(shù)配置
定時(shí)任務(wù)有OSInit()在初始化時(shí)創(chuàng)建,其優(yōu)先級,堆棧大小等于任務(wù)相關(guān)的參數(shù)在os_cfg.h中定義。用戶可通過項(xiàng)目實(shí)際需求修改相應(yīng)參數(shù)。

2、創(chuàng)建定時(shí)器

OS_TMR *OSTmrCreate (INT32U dly,INT32U period,INT8U opt,OS_TMR_CALLBACK callback,void *callback_arg,INT8U *pname,INT8U *perr)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、編寫回調(diào)函數(shù)

typedef void (*OS_TMR_CALLBACK)(void *ptmr, void *parg);
  • 1
  • 1

4、啟動(dòng)定時(shí)器

BOOLEAN OSTmrStart ( OS_TMR *ptmr,INT8U *perr)
  • 1
  • 2
  • 1
  • 2

5、關(guān)于回調(diào)函數(shù)
回調(diào)函數(shù)執(zhí)行時(shí)所用到的堆棧是是定時(shí)器任務(wù)堆棧,所以要確保分配的定時(shí)器任務(wù)堆棧大小能夠滿足回調(diào)函數(shù)的堆棧要求回調(diào)函數(shù)的執(zhí)行是根據(jù)它們在定時(shí)器鏈表中的位置先后執(zhí)行(一個(gè)定時(shí)器只能執(zhí)行一個(gè)回調(diào)函數(shù))。

定時(shí)器任務(wù)的執(zhí)行時(shí)間極大程度是有溢出的定時(shí)器個(gè)數(shù)和回調(diào)函數(shù)執(zhí)行時(shí)間決定?;卣{(diào)函數(shù)執(zhí)行期間,調(diào)度是處于被鎖狀態(tài),所以回調(diào)函數(shù)越快執(zhí)行越好,更不要去在回調(diào)函數(shù)中去等待事件。

總結(jié)

以上是生活随笔為你收集整理的ucosii定时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。