關(guān)于ucos中os_tmr.c中的代碼分析_第1頁
關(guān)于ucos中os_tmr.c中的代碼分析_第2頁
關(guān)于ucos中os_tmr.c中的代碼分析_第3頁
關(guān)于ucos中os_tmr.c中的代碼分析_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、關(guān)于ucos中os_tmr.c中的代碼分析(2011-08-0420:07:41)轉(zhuǎn)載w我本身也是個(gè)初學(xué)者,喜歡嵌入式而自學(xué)ucos系統(tǒng),ucos是個(gè)開源的代碼,短小而又簡(jiǎn)單,這是我學(xué)習(xí)的筆記,希望能對(duì)喜歡ucos的人有一點(diǎn)幫助,因本人也是初學(xué)者,如有錯(cuò)誤迎指點(diǎn)。一般的書多是2.5版本,沒有os_tmr.c,所以我寫了關(guān)于這部分代碼的分析。我讀ucos.中的os_tmr.c:我想這個(gè)文件里就是為了寫一個(gè)建立在操作系統(tǒng)的定時(shí)器,原來我們學(xué)的時(shí)鐘節(jié)拍就像cpu總線時(shí)鐘脈沖一樣。我們建立的是定時(shí)器結(jié)構(gòu)體,在os_tmr.c中有一個(gè)函數(shù)OSTmr_Task()這個(gè)函數(shù)對(duì)定時(shí)器結(jié)構(gòu)體的信息進(jìn)行處理,在定

2、時(shí)時(shí)間到了時(shí)候,該定時(shí)器中的一個(gè)指向回調(diào)函數(shù)的指針就調(diào)用這個(gè)回調(diào)節(jié)器函數(shù)進(jìn)行工作,當(dāng)然,你要寫回調(diào)函數(shù),不然就什么也不做,以前做過ucos移植的人知道要寫一個(gè)硬件定時(shí)器中斷函數(shù),這回要加個(gè)OSTmrSignal()這里有個(gè)發(fā)送信號(hào)。我們學(xué)硬件時(shí)知道,用到硬件定時(shí)器時(shí)要給它一個(gè)計(jì)算脈沖。這個(gè)軟件定時(shí)器也要一個(gè)計(jì)算脈沖。我們建立的定時(shí)器結(jié)構(gòu)體都會(huì)掛到OSTmrWheelTblOS_TMR_CFG_WHEEL_SIZE上面,OS_TMR_CFG_WHEEL+SIZE是要自己定義的,至于掛到OSTmrWheelTbl0到OSTmrWheelTblOS_TMR_CFG_WHEEL_SIZE-1哪一個(gè)上,

3、只要看一下OSTmr_Link(OS_TMR*ptmr,INT8Utype)就明白了,而且一個(gè)OSTmrWheelTbln上可以掛很多個(gè)定時(shí)器結(jié)構(gòu)體。一、定時(shí)器的建立:定時(shí)器是在我們的應(yīng)用程序中建立的,OS_TMR*OSTmrCreate(INT32Udly,INT32Uperiod,INT8Uopt,OS_TMR_CALLBACKcallback,void*callback_arg,INT8U*pname,INT8U*perr)想使用定時(shí)器那些函數(shù)要在os_cfg.h中定義OS_TMR_EN。返回值是os_tmr結(jié)構(gòu)體(定義在ucos_ii.h中)。typedefstructos_tmrIN

4、T8UOSTmrType;OS_TMR_CALLBACKOSTmrCallback;void*OSTmrCallbackArg;void*OSTmrNext;void*OSTmrPrev;INT32UOSTmrMatch;當(dāng)OSTmrTime=OSTmrMatch定時(shí)器到時(shí)間了。INT32UOSTmrDly;INT32UOSTmrPeriod;#ifOS_TMR_CFG_NAME_EN0uINT8U*OSTmrName;#endifINT8UINT8UOSTmrOpt;OSTmrState;OS_TMR;OSTmrType類型定義在ucos_ii.h中:OS_TMR_TYPEOS_ARG_CH

5、K_EN要在os_cfg.h中定義一下,來確定要不要一些功能。OS_TMR_CFG_NAME_EN要你自己在os_cfg.h中定義,來控制要不要用OSTmrNameOSTmrState在ucos_ii.h中有以下幾種類型:OS_TMR_STATE_UNUSED不存在這個(gè)定時(shí)器OS_TMR_STATE_RUNNING這個(gè)定時(shí)器正在運(yùn)行OS_TMR_STATE_COMPLETED這個(gè)定時(shí)器已經(jīng)跑完了OS_TMR_STATE_STOPPED這個(gè)定時(shí)器停止了參數(shù):1、Dly定時(shí)時(shí)間,如果是這個(gè)定時(shí)器只用一次,那么就用這個(gè),如果定時(shí)器要反復(fù)用那么它是第一次時(shí)用,以后用period。2、Period定時(shí)器

6、從復(fù)用時(shí)會(huì)用到這個(gè)作定時(shí)時(shí)間。3、Opt這里有兩種選項(xiàng),告訴我們是只用一次還是反復(fù)使用。只用一次OS_TMR_OPT_ONE_SHOT,反復(fù)使用OS_TMR_OPT_PERIODIC。這些定義在ucos_ii.h中。定時(shí)器選項(xiàng)有五種#defineOS_TMR_OPT_NONE0u沒有選擇#defineOS_TMR_OPT_ONE_SHOT1u定時(shí)器不會(huì)自動(dòng)重復(fù)使用#defineOS_TMR_OPT_PERIODIC2u定時(shí)器會(huì)自動(dòng)重裝#defineOS_TMR_OPT_CALLBACK3uOSTmrStop()中使用,調(diào)用回調(diào)函數(shù),但不帶參數(shù)#defineOS_TMR_OPT_CALLBACK

7、_ARG4u也是OSTmrStop()中使用,調(diào)用回調(diào)函數(shù),但有參數(shù)。4、Callback指向回調(diào)函數(shù)的指針,這個(gè)函數(shù)這樣聲明,voidmycallback(OS_TMR*ptmr,voidp_arg);5、Callback_arg參數(shù)給callback的。6、Pname定時(shí)器的名字7、Perr錯(cuò)誤指針*OS_ERR_NONE沒有錯(cuò)誤OS_ERR_TMR_INVALID_DLY無效的定時(shí)時(shí)間OS_ERR_TMR_INVALID_PERIOD無效的周期OS_ERR_TMR_INVALID_OPT無效的選項(xiàng)OS_ERR_TMR_ISR在中斷中調(diào)用OS_ERR_TMR_NON_AVAIL空的定時(shí)器用

8、光了,這個(gè)和task一樣意思。用到的函數(shù)OSTmr_Alloc()得到一個(gè)定時(shí)器結(jié)構(gòu)體。、刪除一個(gè)定時(shí)器,也是在我們的功能函數(shù)中使用,返回為是否成功刪除。BOOLEANOSTmrDel(OS_TMR*ptmr,INT8U*perr)1、Ptmr指向定時(shí)器結(jié)構(gòu)體。2、Perr指向錯(cuò)誤的指針。這里用到這兩個(gè)函數(shù)OSTmr_Unlink(ptmr);如果是定時(shí)器在工作時(shí),要用它解除OSTmrState=OS_TMR_STATE_STOPPED。OSTmr_Free(ptmr);釋放這個(gè)定時(shí)器結(jié)構(gòu)體。三、得到定時(shí)器名字的函數(shù),返回名字的長(zhǎng)度。INT8UOSTmrNameGet(OS_TMR*ptmr,

9、INT8U*pdest,指向了一個(gè)指向定時(shí)器名字地址指針的指針。INT8U*perr)四、定時(shí)器還有多長(zhǎng)時(shí)間溢出。返回還有多長(zhǎng)時(shí)間溢出。INT32UOSTmrRemainGet(OS_TMR*ptmr,INT8U*perr)五、獲得定時(shí)器狀態(tài)的函數(shù),返回狀態(tài)。INT8UOSTmrStateGet(OS_TMR*ptmr,INT8U*perr)六、啟動(dòng)你的定時(shí)器,返回是否成功啟動(dòng)。BOOLEANOSTmrStart(OS_TMR*ptmr,OSTmr_Link()先INT8U*perr)散七、停止定時(shí)器,返回是否成功停止。BOOLEANOSTmrStop(OS_TMR*ptmr,INT8Uopt

10、,void*callback_arg,INT8U*perr)回調(diào)函數(shù)在這里使用,callback()Opt為OS_TMR_OPT_NONE不使用回調(diào)函數(shù)。你的應(yīng)用程序使用它要用到OSTmr_Unlink()和解除,再重新用這個(gè)定時(shí)器你的應(yīng)用程序使用它這個(gè)也是個(gè)函數(shù)OS_TMR_OPT_CALLBACK使用回調(diào)函數(shù)不用參數(shù)。OS_TMR_OPT_CALLBACK_ARG要使用參數(shù)。八、發(fā)送信號(hào),這個(gè)是在timertick中使用要您寫到ISR中INT8UOSTmrSignal(void)返回信號(hào)量。九、從定時(shí)器池中得到一個(gè)結(jié)構(gòu)體。在建構(gòu)函數(shù)中用staticOS_TMR*OSTmr_Alloc(vo

11、id);十、釋放定時(shí)器,中刪除函數(shù)中用staticvoidOSTmr_Free(OS_TMR*ptmr)十一、OSTmr_Init(void),在OSInit()中用。十二、staticvoidOSTmr_InitTask(void)在OSTmr_Init中使用。用來建立一個(gè)任務(wù)OSTmr_Task()十三、OSTmr_Task()這個(gè)是調(diào)度你建立的定時(shí)器用的,一但定時(shí)時(shí)間到就調(diào)用回調(diào)函數(shù)。我們建立的定時(shí)器都進(jìn)入定時(shí)器輪盤里OSTmrWheelTbl,十四、staticvoidOSTmr_Link(OS_TMR*ptmr,/OSTmrState=OS_TMR_STATE_RUNNINGINT8

12、Utype)Ptmr-OSTmrMatch的確定方法if(type=OS_TMR_LINK_PERIODIC)ptmr-OSTmrMatch=ptmr-OSTmrPeriod+OSTmrTime;elseif(ptmr-OSTmrDly=0)ptmr-OSTmrMatch=ptmr-OSTmrPeriod+OSTmrTime;elseptmr-OSTmrMatch=ptmr-OSTmrDly+OSTmrTime;掛載定時(shí)器時(shí)spoke=(INT16U)(ptmr-OSTmrMatch%OS_TMR_CFG_WHEEL_SIZE);pspoke=&OSTmrWheelTblspoke;這樣確定的置位,當(dāng)OSTmrTime加到和OSTmrMatch相等時(shí)一定會(huì)來以這個(gè)spoke為下標(biāo)的數(shù)組里找該定時(shí)器。至于定義一個(gè)OSTmrWheelTbl而不是把你所有建立的定時(shí)器串成一串是怕一起處理浪費(fèi)時(shí)間吧,這樣可以一次少處理幾個(gè)定時(shí)器。我想看了OSTmr_Task(void*p_arg)這個(gè)函數(shù)的人可能會(huì)好奇為什么用那種方法掛載定時(shí)器,當(dāng)定時(shí)時(shí)間到了時(shí)會(huì)找到OSTmrWheelTbl正確的下標(biāo),并在那個(gè)OSTmrWheelTblok里找到該定時(shí)器吧。其實(shí)你可以算一下

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論