嵌入式第六章 任務(wù)管理 第七章 時(shí)間管理概要_第1頁(yè)
嵌入式第六章 任務(wù)管理 第七章 時(shí)間管理概要_第2頁(yè)
嵌入式第六章 任務(wù)管理 第七章 時(shí)間管理概要_第3頁(yè)
嵌入式第六章 任務(wù)管理 第七章 時(shí)間管理概要_第4頁(yè)
嵌入式第六章 任務(wù)管理 第七章 時(shí)間管理概要_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第六章 任務(wù)管理C/OS-II中的任務(wù)n任務(wù)看起來(lái)與任何C函數(shù)一樣,具有一個(gè)返回類型和一個(gè)參數(shù),只是它從不返回。n任務(wù)的返回類型必須被定義成void型。n任務(wù)可以是一個(gè)無(wú)限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉。任務(wù)代碼并不是被真正的刪除了,而只是C/OS-不再理會(huì)該任務(wù)代碼,所以該任務(wù)代碼不會(huì)再運(yùn)行n哪個(gè)參數(shù)是任務(wù)的標(biāo)識(shí)符? C/OS-II最多能夠管理多少任務(wù)?用戶可以使用多少個(gè)任務(wù)?用戶如何使用優(yōu)先級(jí)?設(shè)計(jì)任務(wù)n例如:采集三個(gè)通道的數(shù)據(jù),經(jīng)過(guò)A/D轉(zhuǎn)換后使用圖形顯示。n任務(wù)設(shè)計(jì)方式1:三通道的數(shù)據(jù)采集和A/D轉(zhuǎn)換繪圖任務(wù)編程任務(wù)有重復(fù),無(wú)法通過(guò)優(yōu)先級(jí)選擇通道n任務(wù)設(shè)計(jì)方式2:?jiǎn)瓮ǖ赖臄?shù)據(jù)

2、的采集和A/D轉(zhuǎn)換(通道號(hào)和數(shù)據(jù)變量作為參數(shù)),在程序中使用不同參數(shù)調(diào)用三次繪圖任務(wù)編程任務(wù)簡(jiǎn)單,能夠定義不同通道的優(yōu)先級(jí),任務(wù)調(diào)度需要一定時(shí)間任務(wù)管理的內(nèi)容n6.1/6.2 建立任務(wù)n6.3 任務(wù)堆棧n6.4 堆棧檢驗(yàn)n6.5 刪除任務(wù)n6.6 請(qǐng)求刪除任務(wù)n6.7 改變?nèi)蝿?wù)的優(yōu)先級(jí)n6.8 掛起任務(wù)n6.9 恢復(fù)任務(wù)n6.10 獲得有關(guān)任務(wù)的信息建立任務(wù)n通過(guò)調(diào)用函數(shù)OSTaskCreate()或者OSTaskCreateExt()建立任務(wù)。OSTaskCreateExt()是OSTaskCreate()的擴(kuò)展版本,使用更多的參數(shù)提供附加功能。n任務(wù)可以在多任務(wù)開(kāi)始調(diào)度前建立,也可以在其他

3、任務(wù)執(zhí)行過(guò)程中建立。n在開(kāi)始多任務(wù)調(diào)度前,至少要建立一個(gè)任務(wù)。n任務(wù)不能通過(guò)中斷服務(wù)程序(ISR)建立6.1 OSTaskCreate()nINT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio ) void (*task)(void *pd)/傳遞任務(wù)的地址n任務(wù)的地址是任務(wù)函數(shù)的函數(shù)名void *pdata/任務(wù)中用戶參數(shù)的指針OS_STK *ptos/堆棧的棧頂n必須設(shè)置OS_CPU.H中的OS_STACK_GROWTH通知系統(tǒng)堆棧的類型。ntypedef unsigned int

4、 OS_STK;INT8U prio/任務(wù)的優(yōu)先級(jí)ntypedef unsigned char INT8U ; 6.1 OSTaskCreate()nOSTaskCreate(Display_Task,(void *)0, (OS_STK*)&Display_Task_StackSTACKSIZE-1, Display_Task_Prio);/ 20/ 堆棧是一個(gè)數(shù)組,長(zhǎng)度由STACKSIZE決定n優(yōu)先級(jí)定義為206.1 OSTaskCreate()n函數(shù)的功能校驗(yàn)優(yōu)先級(jí)初始化任務(wù)的堆棧初始化任務(wù)控制塊n其他初始化功能6.1 OSTaskCreate()n校驗(yàn)優(yōu)先級(jí)1n判斷優(yōu)先級(jí)是否有

5、效if (prio OS_LOWEST_PRIO) return (OS_PRIO_INVALID); 如果任務(wù)的優(yōu)先級(jí)大于定義的最低優(yōu)先級(jí),返回錯(cuò)誤信息:優(yōu)先級(jí)無(wú)效!prio OS_LOWEST_PRIO63n校驗(yàn)優(yōu)先級(jí)2n判斷此優(yōu)先級(jí)任務(wù)是否存在OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) OSTCBPrioTblprio = (OS_TCB *)1;OS_EXIT_CRITICAL();/*其他功能*/ else OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); 6.1 OSTask

6、Create()n初始化任務(wù)的堆棧nOS_STK_GROWTH 定義為1;堆棧地址由高向低遞減nOS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)npsp = (void *)OSTaskStkInit(task, pdata, ptos, 0); npsp;/返回棧頂指針n初始化任務(wù)的寄存器初值SP為ptos,設(shè)置其他寄存器值時(shí)SP遞減PC/LR為函數(shù)地址R1-R12為任意設(shè)定的初始值R0用來(lái)保存用戶信息pdataCPSR/SPSR設(shè)置為管理模式6.1 OSTaskCre

7、ate()n初始化任務(wù)控制塊nINT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt);nerr = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); 6.1 OSTaskCreate()n其他初始化功能如果正確的初始化TCB關(guān)中斷OSTASkCtr用于保存任務(wù)數(shù)目創(chuàng)建用戶編寫(xiě)的鉤子函數(shù)開(kāi)中斷如果此任務(wù)被其他任務(wù)動(dòng)態(tài)創(chuàng)建,則進(jìn)行一次調(diào)度,因?yàn)槿蝿?wù)創(chuàng)建完畢進(jìn)入就緒狀態(tài)如果存在錯(cuò)誤關(guān)

8、中斷將此優(yōu)先級(jí)任務(wù)清零開(kāi)中斷創(chuàng)建函數(shù)返回錯(cuò)誤代碼if (err = OS_NO_ERR) OS_ENTER_CRITICAL(); OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblprio); OS_EXIT_CRITICAL(); if (OSRunning) OSSched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TCB *)0; OS_EXIT_CRITICAL(); return (err);6.2 OSTaskCreateExt()n自學(xué)6.3 任務(wù)堆棧n特點(diǎn)堆棧的每個(gè)單元必須是OS_S

9、TK類型。ntypedef unsigned int OS_STK;堆棧由連續(xù)的內(nèi)存空間組成。用戶應(yīng)該在任務(wù)執(zhí)行前分配堆??臻g靜態(tài)分配動(dòng)態(tài)分配6.3 任務(wù)堆棧n靜態(tài)分配static OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;n使用全局變量n使用數(shù)組作為堆棧n使用簡(jiǎn)單n存在浪費(fèi)資源的可能n動(dòng)態(tài)分配OS_STK *pstk;pstk = (OS_STK *)malloc(stack_size);if (pstk != (OS_STK *)0) /* 確認(rèn)malloc()能得到足夠地內(nèi)存空間 */ Create the tas

10、k;n在任務(wù)建立前動(dòng)態(tài)創(chuàng)建n使用指針的方法n使用靈活n容易出現(xiàn)錯(cuò)誤6.3 任務(wù)堆棧n內(nèi)存碎片與內(nèi)存泄漏n內(nèi)存碎片:不連續(xù)的內(nèi)存空間n內(nèi)存泄漏:無(wú)法使用的空閑的內(nèi)存空間任務(wù)退出,但是動(dòng)態(tài)分配的內(nèi)存空間卻沒(méi)有被釋放6.3 任務(wù)堆棧n堆棧的使用nOS_STK_GROWTH =0堆棧指針遞增SP+SP初值=&MyTaskStack0nOS_STK_GROWTH =1堆棧指針遞增SP-SP初值=&MyTaskStackstack_size-16.3 任務(wù)堆棧OS_STK TaskStackTASK_STACK_SIZE;#if OS_STK_GROWTH = 0 OSTaskCreate

11、(task, pdata, &TaskStack0, prio);#else OSTaskCreate(task, pdata, &TaskStackTASK_STACK_SIZE-1, prio);#endif6.4 堆棧檢驗(yàn)n通過(guò)任務(wù)的運(yùn)行,判斷任務(wù)實(shí)際使用堆??臻g的方法。n在調(diào)試中使用此方法,可以在發(fā)布時(shí)減小RAM的浪費(fèi)。nOSTaskStkChk()函數(shù)服務(wù)實(shí)現(xiàn)6.4 堆棧檢驗(yàn)n堆棧校驗(yàn)的前提在OS_CFG.H文件中設(shè)OS_TASK_CREATE_EXT為1。用OSTaskCreateExt()建立任務(wù),并給予任務(wù)比實(shí)際需要更多的內(nèi)存空間。保證在使用堆棧前對(duì)堆棧清零。n

12、在OSTaskCreateExt()中,將參數(shù)opt設(shè)置為OS_TASK_OPT_STK_CHK +OS_TASK_OPT_STK_CLR。n注意如果用戶的程序啟動(dòng)代碼清除了所有的RAM,并且從未刪除過(guò)已建立了的任務(wù),那么用戶就不必設(shè)置選項(xiàng)OS_TASK_OPT_STK_CLR了。這樣就會(huì)減少OSTaskCreateExt()的執(zhí)行時(shí)間。6.4 堆棧檢驗(yàn)6.4 堆棧檢驗(yàn)nINT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata) nprio,任務(wù)的優(yōu)先級(jí)。用途?nOS_STK_DATA *pdatapdata指向一個(gè)類型為OS_STK_DATA的數(shù)據(jù)

13、結(jié)構(gòu),其中包含如下信息:INT32U OSFree; /* 堆棧中未使用的字節(jié)數(shù)*/ INT32U OSUsed; /* 堆棧中已使用的字節(jié)數(shù) */n返回值:OS_NO_ERR:函數(shù)調(diào)用成功 6.5 刪除任務(wù)n刪除任務(wù):將任務(wù)轉(zhuǎn)換為休眠狀態(tài)。任務(wù)代碼并未被刪除,只是任務(wù)從調(diào)度列表中刪除。任務(wù)的刪除是動(dòng)態(tài)的。怎么理解?不能刪除空閑任務(wù),不能在ISR中刪除任務(wù)。任務(wù)可以刪除自身。nINT8U OSTaskDel (INT8U prio) 6.6 請(qǐng)求刪除任務(wù)n使用OSTaskDel直接刪除其他任務(wù)的缺點(diǎn)資源丟失例如任務(wù)A刪除任務(wù)B任務(wù)B動(dòng)態(tài)分配了部分內(nèi)存空間,被刪除時(shí)沒(méi)有釋放這些空間,引起內(nèi)存泄漏

14、6.6 請(qǐng)求刪除任務(wù)void RequestorTask (void *pdata) INT8U err; pdata = pdata; for (;) /* 應(yīng)用程序代碼應(yīng)用程序代碼 */ if (TaskToBeDeleted() 需要被刪除需要被刪除) while (OSTaskDelReq(TASK_TO_DEL_PRIO) != OS_TASK_NOT_EXIST) OSTimeDly(1); /*應(yīng)用程序代碼應(yīng)用程序代碼*/void TaskToBeDeleted (void *pdata) INT8U err; pdata = pdata; for (;) /*應(yīng)用程序代碼應(yīng)用程

15、序代碼*/ If (OSTaskDelReq(OS_PRIO_SELF) = OS_TASK_DEL_REQ) 釋放所有占用的資源釋放所有占用的資源; 釋放所有動(dòng)態(tài)內(nèi)存釋放所有動(dòng)態(tài)內(nèi)存; OSTaskDel(OS_PRIO_SELF); else /*應(yīng)用程序代碼應(yīng)用程序代碼*/ 6.7 改變?nèi)蝿?wù)的優(yōu)先級(jí)n任務(wù)優(yōu)先級(jí)的靜態(tài)定義。方法?n任務(wù)優(yōu)先級(jí)的動(dòng)態(tài)改變INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio) 可以改變自身任務(wù)或其他任務(wù)的優(yōu)先級(jí)不能改變空閑任務(wù)的優(yōu)先級(jí)新優(yōu)先級(jí)必須有效,而且必須沒(méi)有被使用。有效的優(yōu)先級(jí)?6.8 掛起任務(wù)n掛起:

16、將一個(gè)運(yùn)行態(tài)的任務(wù)暫時(shí)中止n若掛起時(shí),任務(wù)已經(jīng)在就緒態(tài)或正在延時(shí)等待進(jìn)入就緒態(tài),那么掛起函數(shù)不起作用nINT8U OSTaskSuspend (INT8U prio) 不能掛起空閑任務(wù)優(yōu)先級(jí)有效6.9 恢復(fù)任務(wù)n被掛起的任務(wù)只能被恢復(fù)函數(shù)所恢復(fù)。nINT8U OSTaskResume (INT8U prio) 不能恢復(fù)空閑任務(wù)優(yōu)先級(jí)有效,且該優(yōu)先級(jí)任務(wù)被掛起恢復(fù)掛起的任務(wù)后,首先要進(jìn)行任務(wù)調(diào)度6.10 獲得有關(guān)任務(wù)的信息n任務(wù)的信息:任務(wù)的任務(wù)控制塊的內(nèi)容nINT8U OSTaskQuery (INT8U prio, OS_TCB *pdata) INT8U prio;任務(wù)的優(yōu)先級(jí)OS_TCB

17、 *pdata;保存任務(wù)信息的結(jié)構(gòu)指針第七章 時(shí)間管理內(nèi)容n7.1 任務(wù)延時(shí)函數(shù)n7.2 按時(shí)分秒延時(shí)函數(shù)n7.3 讓處在延時(shí)期的任務(wù)結(jié)束延時(shí)n7.4 系統(tǒng)時(shí)間7.1 任務(wù)延時(shí)函數(shù)n延時(shí)服務(wù)申請(qǐng)?jiān)摲?wù)的任務(wù)可以延時(shí)一段時(shí)間,這段時(shí)間的長(zhǎng)短是用時(shí)鐘節(jié)拍的數(shù)目來(lái)確定的。實(shí)現(xiàn)這個(gè)系統(tǒng)服務(wù)的函數(shù)叫做OSTimeDly()。調(diào)用該函數(shù)會(huì)使C/OS-進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDly()后,一旦規(guī)定的時(shí)間期滿或者有其它的任務(wù)通過(guò)調(diào)用OSTimeDlyResume()取消了延時(shí),它就會(huì)馬上進(jìn)入就緒狀態(tài)。注意,只有當(dāng)該任務(wù)在所有就緒任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才

18、會(huì)立即運(yùn)行。 7.1 任務(wù)延時(shí)函數(shù)nvoid OSTimeDly (INT16U ticks) ticks 1-655360值代表無(wú)延時(shí)任務(wù)延時(shí)代表,進(jìn)行一次任務(wù)調(diào)度時(shí)鐘節(jié)拍=1/OS_TICKS_PER_SEC(參看OS_CFG.H )7.2 按時(shí)分秒延時(shí)函數(shù)nINT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) INT8U hoursINT8U minutesINT8U secondsINT16U milli時(shí)間的準(zhǔn)確度與時(shí)鐘節(jié)拍有關(guān)7.3 讓處在延時(shí)期的任務(wù)結(jié)束延時(shí)nINT8U OSTimeDlyResume (INT8U prio) 用于結(jié)束任務(wù)延時(shí),將任務(wù)轉(zhuǎn)變?yōu)榫途w態(tài)。會(huì)進(jìn)行一次任務(wù)調(diào)度7.4 系統(tǒng)時(shí)間n32位計(jì)時(shí)器用于記錄系統(tǒng)時(shí)間n計(jì)數(shù)范圍4,294,967,295個(gè)時(shí)鐘節(jié)拍n若時(shí)鐘節(jié)拍為10ms,一次計(jì)數(shù)時(shí)間497天n從OSStart()調(diào)用開(kāi)始計(jì)數(shù)或者溢出時(shí)計(jì)數(shù)7.4 系統(tǒng)時(shí)間nINT32U OSTimeGet (void) n返回值:計(jì)數(shù)器的當(dāng)前值nvoid OSTi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論