第5講 內(nèi)核結(jié)構(gòu).ppt_第1頁
第5講 內(nèi)核結(jié)構(gòu).ppt_第2頁
第5講 內(nèi)核結(jié)構(gòu).ppt_第3頁
第5講 內(nèi)核結(jié)構(gòu).ppt_第4頁
第5講 內(nèi)核結(jié)構(gòu).ppt_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五講 內(nèi)核結(jié)構(gòu),2020/8/5,2,主要內(nèi)容,1. 幾個概念 2. 內(nèi)核結(jié)構(gòu),2020/8/5,3,1.幾個概念,代碼的臨界段 共享資源 任務 關中斷,2020/8/5,4,代碼的臨界段,代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。一旦這部分代碼開始執(zhí)行,則不允許任何中斷。 為確保臨界段代碼的執(zhí)行,在進入臨界段之前要關中斷,而臨界段代碼執(zhí)行完以后要立即開中斷。,2020/8/5,5,共享資源,資源 :任何為任務所占用的實體都可稱為資源。資源可以是打印機、鍵盤、顯示器,資源也可以是一個變量,一個結(jié)構(gòu)或一個數(shù)組等 共享資源:可以被一個以上任務使用的資源叫做共享資源。為了防止數(shù)據(jù)被破壞,每

2、個任務在與共享資源打交道時,必須獨占該資源。這叫做互斥(mutual exclusion),2020/8/5,6,任務,任務是一個具有獨立功能的無限循環(huán)的程序段或者只執(zhí)行一次的程序段的一次運行活動,是實時內(nèi)核調(diào)度的單位; 任務主要包含以下內(nèi)容: 代碼:一段可執(zhí)行的程序 數(shù)據(jù):程序所需要的相關數(shù)據(jù)(變量、工作空間、緩沖區(qū)等) 堆棧 程序執(zhí)行的上下文環(huán)境,2020/8/5,7,High Priority Task,Low Priority Task,Task,Task,Task,Task,Task,Task,Event,Event,Each Task,Infinite Loop,Importanc

3、e,Splitting an application into Tasks,2020/8/5,8,關中斷,C/OS-為了處理臨界段代碼需要關中斷,處理完畢后再開中斷。這使得C/OS-能夠避免同時有其它任務或中斷服務進入臨界段代碼 ; C/OS-提供兩個宏調(diào)用,允許用戶在應用程序的C代碼中關中斷然后再開中斷: OS_ENTER_CRITICAL() OS_EXIT_CRITICAL(),2020/8/5,9,兩個宏調(diào)用的使用法,2020/8/5,10,2. 內(nèi)核結(jié)構(gòu),基本知識: 任務參數(shù) 任務狀態(tài) 任務切換 數(shù)據(jù)結(jié)構(gòu): 任務控制塊 空任務鏈表 就緒任務鏈表,2020/8/5,11,系統(tǒng)調(diào)用: 任

4、務調(diào)度函數(shù)OSSched() 調(diào)度器上鎖和開鎖函數(shù)OSSchedlock() /OSSchedUnlock() 空閑任務 OSTaskIdle() 統(tǒng)計任務 OSTaskStat() 中斷處理 OSIntEnter() /OSIntExit() 時鐘節(jié)拍 OSTickISR 獲取當前C/OS-的版本號OSVersion() C/OS-初始化OSInit() C/OS-的啟動 OSStart(),2020/8/5,12,void YourTask (void *pdata) for (;) /* USER CODE */ Call one of uC/OS-IIs services: OSFla

5、gPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* USER CODE */ void YourTask (void *pdata) /* USER CODE */ OSTaskDel(OS_PRIO_SELF); ,任務所包含的程序通常為一個具有無限循環(huán)的程序 ; 或者一次執(zhí)行,例: UCOSII中的任務內(nèi)容,2020/8/5,13,任務參數(shù),一個任

6、務看起來像其它C的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量; 但是任務是絕不會返回的,故返回參數(shù)必須定義成void 形式參數(shù)變量是由用戶代碼在第一次執(zhí)行的時候帶入的。形式參數(shù)變量類型是一個指向void的指針。 這是為了允許用戶應用程序傳遞任何類型的數(shù)據(jù)給任務,2020/8/5,14,任務狀態(tài),C/OS-控制下的任務狀態(tài)轉(zhuǎn)換圖。在任一給定的時刻,任務的狀態(tài)一定是在這五種狀態(tài)之一。,2020/8/5,15,正在運行的任務可以通過調(diào)用兩個函數(shù)之一將自身延遲一段時間,函數(shù)為OSTimeDly()或OSTimeDlyHMSM(),這個任務于是進入等待狀態(tài) 正在運行的任務期待某一事件的發(fā)生時也要等待,手段

7、是調(diào)用以下3個函數(shù)之一:OSSemPend(),OSMboxPend(),或OSQPend(),調(diào)用后任務進入了等待狀態(tài)(WAITING) 下一個優(yōu)先級最高的、并進入了就緒態(tài)的任務立刻被賦予了CPU的控制權(quán) 當所有的任務都在等待事件發(fā)生或等待延遲時間結(jié)束,C/OS-執(zhí)行空閑任務(idle task),執(zhí)行OSTaskIdle()函數(shù),2020/8/5,16,任務切換,任務切換(context switching) 保存當前任務的上下文,并恢復需要執(zhí)行的任務的上下文的過程。 當發(fā)生任務切換時: 當前正在運行的任務的上下文就需要通過該任務的任務控制塊保存起來; 把需要投入運行的任務的上下文從對應的

8、任務控制塊中恢復出來。,2020/8/5,17,在時刻8即發(fā)生了任務切換,任務1的上下文需要保存到任務1的任務控制塊中去。 經(jīng)過調(diào)度程序的處理,在時刻10任務2投入運行,需要把任務2的任務控制塊中關于上下文的內(nèi)容恢復到CPU的寄存器。,2020/8/5,18,任務1執(zhí)行一段時間后,由于某種原因,需要進行任務切換,進入實時內(nèi)核的調(diào)度程序。調(diào)度程序首先把當前的上下文內(nèi)容保存到任務1的任務控制塊TCB1中,然后又把任務2的上下文從TCB2中恢復到CPU寄存器,隨后任務2得到執(zhí)行。任務2執(zhí)行一段時間后,由于某種原因,需要進行任務切換,進入實時內(nèi)核的調(diào)度程序。調(diào)度程序首先把當前的上下文內(nèi)容保存到任務2的

9、任務控制塊TCB2中,然后又把任務1的上下文從TCB1中恢復到CPU寄存器,隨后任務1得到執(zhí)行。,2020/8/5,19,任務控制塊,任務管理是通過對任務控制塊(task control block,TCB)的操作來實現(xiàn)的; 任務控制塊是一個數(shù)據(jù)結(jié)構(gòu),當任務的CPU使用權(quán)被剝奪時,C/OS-用它來保存該任務的狀態(tài); 當任務重新得到CPU使用權(quán)時,任務控制塊能確保任務從當時被中斷的那一點絲毫不差地繼續(xù)執(zhí)行;,2020/8/5,20,任務控制塊是包含任務相關信息的數(shù)據(jù)結(jié)構(gòu) 包含了任務執(zhí)行過程中所需要的所有信息。 任務控制塊大都包括以下信息: 任務的名字 任務執(zhí)行的起始地址 任務的優(yōu)先級 任務的狀態(tài)

10、 任務的硬件上下文(堆棧指針、PC和寄存器等)、任務的隊列指針等內(nèi)容,2020/8/5,21,TCB of ucOS,2020/8/5,22,OSTCBStkPtr是指向當前任務棧頂?shù)闹羔?; OSTCBNext和OSTCBPrev用于任務控制塊OS_TCBs的雙重鏈接,雙重連接的鏈表使得任一成員都能被快速插入或刪除; OSTCBEventPtr是指向事件控制塊的指針 ; OSTCBMsg是指向傳給任務的消息的指針 ; OSTCBDly當需要把任務延時若干時鐘節(jié)拍時要用到這個變量,或者需要把任務掛起一段時間以等待某事件的發(fā)生 ; OSTCBStat是任務的狀態(tài)字。當OSTCBStat為0,任務

11、進入就緒態(tài) ; OSTCBPrio是任務優(yōu)先級 ; OSTCBDelReq是一個布爾量,用于表示該任務是否需要刪除 ;,2020/8/5,23,在C/OS-初始化的時候,所有任務控制塊OS_TCBs被鏈接成單向空任務鏈表; 一旦建立任務,空任務控制塊指針OSTCBFreeList指向的任務控制塊便賦給了該任務,然后OSTCBFreeList的值調(diào)整為指向下鏈表中下一個空的任務控制塊; 一旦任務被刪除,任務控制塊就還給空任務鏈表;,Free TCBs after OS_TCBInit() in ucOS,空任務鏈表,2020/8/5,24,就緒表,每個任務被賦予不同的優(yōu)先級等級,從0級到最低優(yōu)先

12、級OS_LOWEST_PRIO,包括0和OS_LOWEST_PRIO在內(nèi); 每個任務的就緒態(tài)標志都放入就緒表中的,就緒表中有兩個變量OSRdyGrp和OSRdyTbl ; 在OSRdyGrp中,任務按優(yōu)先級分組,8個任務為一組。OSRdyGrp中的每一位表示8組任務中每一組中是否有進入就緒態(tài)的任務。任務進入就緒態(tài)時,就緒表OSRdyTbl中的相應元素的相應位也置位。 就緒表OSRdyTbl數(shù)組的大小取決于OS_LOWEST_PRIO 任務優(yōu)先級的低三位用于確定任務在就緒表OSRdyTbl中的所在位。接下去的三位用于確定是在OSRdyTbl數(shù)組的第幾個元素。,2020/8/5,25,2020/8

13、/5,26,任務調(diào)度函數(shù)OSSched(),確定哪個任務優(yōu)先級最高,下面該哪個任務運行了的工作是由調(diào)度器(Scheduler)完成的; 任務級的調(diào)度是由函數(shù)OSSched()完成的,中斷級的調(diào)度是由另一個函數(shù)OSIntExt()完成的 ;,2020/8/5,27,void OS_Sched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSIntNesting = 0) ,Task scheduling of ucOS,2020/8/5,28,void OSCtxSw (void) PUSH R1, R2, R3 and R4 onto the curren

14、t stack; OSTCBCur-OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy-OSTCBStkPtr; POP R4, R3, R2 and R1 from the new stack; Execute a return from interrupt instruction; ,OS_TASK_SW()調(diào)用OSCtxSW(),2020/8/5,29,Context-switch in ucOS,Data structures before context-switch,2020/8/5,30,Context-swi

15、tch in ucOS,Data structures after saving the context-switch of current task,2020/8/5,31,Context-switch in ucOS,Data structures after restoring the context-switch of high priority task,2020/8/5,32,調(diào)度器上鎖和開鎖函數(shù)OSSchedlock() /OSSchedUnlock(),調(diào)用OSSchedLock()函數(shù)的任務獨占CPU,不管有沒有其他高優(yōu)先級的就緒任務。在這種情況下,中斷仍然可以被接受和執(zhí)行(

16、中斷必須允許) 在調(diào)用了OSSchedLock ()函數(shù)后,OSSchedUnlock ()函數(shù)恢復任務調(diào)度 OSSchedLock ()函數(shù)和OSSchedUnlock ()函數(shù)必須配對使用 警告 任務調(diào)用了OSSchedLock()函數(shù)后,決不能再調(diào)用可能導致當前任務掛起的系統(tǒng)函數(shù):OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因為任務調(diào)度已經(jīng)被禁止,其他任務不能運行,這會導致系統(tǒng)死鎖。,2020/8/5,33,示例:,2020/8/5,34,空閑任務 OSTaskIdle(),C/OS-總是建立一個空閑任務,

17、這個任務在沒有其它任務進入就緒態(tài)時投入運行; 空閑任務OSTaskIdle()什么也不做,只是在不停地給一個32位的名叫OSIdleCtr的計數(shù)器加1,統(tǒng)計任務(使用這個計數(shù)器以確定現(xiàn)行應用軟件實際消耗的CPU時間;,2020/8/5,35,統(tǒng)計任務 OSTaskStat(),提供運行時間統(tǒng)計的任務OSTaskStat(),如果用戶將系統(tǒng)定義常數(shù)OS_TASK_STAT_EN設為1,這個任務就會建立; OSTaskStat()告訴用戶應用程序使用了多少CPU時間,用百分比表示,這個值放在一個有符號8位整數(shù)OSCPUsage中,精讀度是1個百分點; 如果用戶應用程序打算使用統(tǒng)計任務,用戶必須在初

18、始化時建立一個唯一的任務,在這個任務中調(diào)用OSStatInit();,2020/8/5,36,中斷處理 OSIntEnter() /OSIntExit(),OSIntEnter()通知C/OS-一個中斷處理函數(shù)正在執(zhí)行,這有助于C/OS-掌握中斷嵌套的情況; OSIntExit ()通知C/OS-一個中斷服務已執(zhí)行完畢,這有助于C/OS-掌握中斷嵌套的情況; 通常OSIntExit ()和OSIntEnter ()聯(lián)合使用; 當最后一層嵌套的中斷執(zhí)行完畢后,如果有更高優(yōu)先級的任務準備就緒,C/OS-會調(diào)用任務調(diào)度函數(shù),在這種情況下,中斷返回到更高優(yōu)先級的任務而不是被中斷了的任務;,2020/8/5,37,時鐘節(jié)拍服務例程 OSTickISR,C/OS需要用戶提供周期性信號源,用于實現(xiàn)時間延時和確認超時; 節(jié)拍率應在每秒10次到100次之間,或者說10到100Hz; 時鐘節(jié)拍率越高,系統(tǒng)的額外負荷就越重; 用戶必須在多任務系統(tǒng)啟動以后再開啟時鐘節(jié)拍器,也就是在調(diào)用OSStart()之后,2020/8/5,38,2020/8/5,39,例: OSTickISR的示意代碼,時

溫馨提示

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

評論

0/150

提交評論