uCOS ii 學習心得及體會

2021-06-16 07:31:29 字數 3439 閱讀 9285

1、首先發布 任哲的《嵌入式實時作業系統ucos-ii原理及應用》 

這本書非常適合初學者學習 ucos-ii

2、   請問:空閒任務和統計任務是否建立任務控制塊呢?

任務塊鍊錶中是否存在空閒任務和統計任務的任務控制塊呢?如果沒有的話,作業系統如何排程呢?

標準答案:

在ucos/ii核心中,呼叫osinit()函式中會首先建立空閒任務,同時當使用者「允許」統計任務時,也會接著建立統計任務。

因此任務塊鍊錶中存在空閒任務和統計任務的任務控制塊。

3、   請問:為什麼有了正在使用任務控制塊鍊錶ostcblist和空閒任務控制塊鍊錶ostcbfreelist,還要再定義ostcbpriotbl[]呢?

標準答案:

陣列ostcbpriotbl[]是以任務號為索引,裡面儲存的任務0到最大任務的任務控制塊(tcb)的首位址,據此可以通過任務優先順序號(任務號)快速找到當前任務在任務控制塊中的首指標,而不必到任務控制塊鍊錶中一步一步的查詢,加快訪問時間。加快任務切換時間。

4、   ucos/ii中,能夠引起任務排程的系統函式有哪些?

(1)、osstart() ucos/ii啟動

(2)、ostasksuspend()掛起任務

(3)、ostaskresume()恢復任務

ostimedly()/ostimedlyhmsm()、等待乙個事件的發生(包括ossempend(), osmutexpend, osflagpend, osmboxpend(), osqpend(),

5、   請問:既然有了任務就緒表int8u osrdytbl[64],為什麼還要再定義

int8u  osrdygrp[8]呢?這樣做的好處是什麼?

標準答案:

osrdytbl[64]是任務就緒表,當表中 元素的值=1時,表示 任務處於就緒狀態。 例如: osrdytbl[0]= 1,則表示:任務級別號=0的任務處於就緒狀態,可以被排程器立即置於「執行態」。

為了節省查詢時間(如果讓作業系統每次查詢處於就緒狀態的最高優先順序別的任務時,都從下標0開始查詢,有點太浪費時間了),因此又專門定義了乙個陣列osrdygrp[8]。

其中:

(1)、osrdygrp[0]對應osrdytb[0]~osrdytbl[7]

(2)、osrdygrp[1]對應osrdytb[8]~osrdytbl[15]

(3)、osrdygrp[2]對應osrdytb[16]~osrdytbl[23]

這樣,每次查詢就緒表中最高優先順序別的任務,就可以這樣查詢,首先查詢依次從osrdygrp[0]~osrdygrp[7]開始查詢不等於0的項,假如osrdygrp[1] >=1,則表示任務號8到任務號15有級別最高的就緒任務。

最終查詢範圍從0-64縮小到8-15。最終節省了查詢時間。

6、 請問:任務排程的核心是什麼?

標準答案:

在多工作業系統中,命令cpu中止當前正在執行的任務轉而去執行另外乙個任務的工作叫做任務切換。

任務排程主要完成兩個工作:

(1)、在任務就緒表中查詢具有最高優先順序別的就緒任務。

(2)、實現任務切換

說的更明白一些,就是將找到的的最高優先順序別的任務的「任務號」---> 「當前任務的任務號ospriocur」;從ostcbpriotbl[]取出最高優先級別任務的任務控制塊首位址---> 「當前任務的任務控制塊指標ostcbcur」

最後呼叫os_task_sw()完成現場切換(即將cpu的暫存器資訊儲存到當前正執行任務的私棧中,然後從待執行的高優先順序別的任務私棧中彈出原先儲存暫存器資訊到cpu)。

//-----------------------------------

ospriocur 是全域性變數,用於儲存當前正在執行任務的任務號

ostcbcur是全域性變數,用於指向當前正在執行任務的任務控制塊首位址。

7、任務切換的關鍵:其實是堆疊的切換。

切換時:

(1)、第一步:將當前cpu的sp暫存器的值儲存到「待中止任務」的任務控制塊中。即儲存到結構體os_tcb的ostcbstkptr成員中。  

(2)、第二步:從「待執行任務」的任務控制塊的ostcbstkptr成員中取出待執行任務的堆疊指標,然後送給cpu的sp暫存器。

8、(ostcb *)1 是什麼意思

(原檔名:ostcb_1是什麼意思.jpg) 引用

9、 啟動任務函式osstart()之前必須遵守的約定:

ucos/ii執行之前,必須呼叫系統函式osstart()。▲▲▲此時切記:

呼叫系統函式osstart()之前,「必須」已經建立了乙個任務,並賦予它最高優先級別,從而使它成為起始任務;然後在這個起始任務中,再建立其它「低優先順序別」的任務。

10、 什麼時候開啟全域性中斷?

(1)、由於啟動任務函式osstart()之前必須遵守的約定:

在呼叫系統函式osstart()之前,先建立乙個任務,並賦予它最高優先級別,從而使它成為起始任務;然後在這個起始任務中,再建立其它任務。

(2)、因此執行系統函式osstart()後,ucos/ii會自動排程使用者建立的最高優先順序別的任務,所有在這個「最高優先順序別的任務」中開啟全域性中斷最合適。

例如:下面的例子為:在系統函式osstart()之前,建立了乙個「最高優先順序別的任務」taskstart()--->

ostaskcreate(taskstart,......)

因此在taskstart()任務首次被排程時,開啟全域性中斷。

注意:千萬不要在系統函式osstart()之前開啟全域性中斷,否則作業系統會崩潰。因為此時ucos/ii內部環境還沒有完全初始化完成。

(原檔名:什麼時候開啟全域性中斷.jpg) 引用

(原檔名:os_exit_critical()就是開啟全域性中斷.jpg) 引用

11、 執行系統函式osstart()的時候,為什麼還要增加如下的條件:

if (osrunning == false)

此時應該沒有任務被排程呀(即:osrunning 應該等於 false)!

只有當執行了系統函式osstarthighrdy()的時候,即排程最高優先級別任務的時候,才置   osrunning = true。   

難道我的理解錯了嗎?

為什麼呀!

(原檔名:執行osstart()的時候,為什麼需要判斷 if (osrunning == false) 呢?.jpg) 引用

12、ucos/ii中所說的中斷服務程式排程,是否僅僅是指時鐘節拍中斷服務程式呢?

例如:是否僅僅時鐘節拍中斷服務程式中才能呼叫osintexit(),串列埠中斷服務中不允許呼叫osintexit()進行任務排程呢?

一般使用者程式,例如:串列埠中斷服務程式是否

(1)、不能呼叫系統函式 : osintexit()進行任務排程

(2)、可以呼叫系統函式 : osintexit()進行任務排程,也可以不呼叫系統函式 : osintexit()進行任務排程。

UCOS II 學習心得

1.任務優先順序 osrdygrp與osrdytbl類似於乙個二維陣列,可大概表達為prio osrdygrp osrdytbl 要知道哪個任務就緒,只要知道osrdygrp,osrdytbl的值,然後從表中找出就可以了 驗證 例如優先順序為22的任務,轉為二進位制為00 010 110 轉為x 2...

學習心得體會1

首先我定義了乙個類 sealed class usermodel set public string username set public usermodel string name,int32 age public void displaymember userage this.username...

angular學習心得體會

1 ionic的自定義服務factory,service,provide等.factory hots function hots 這個名字是自定義服務的名字,可以注入到不同controller裡面公用,一般邏輯處理,資料處理,都會放在自定義服務內,當你初試 angular 時,很自然地就會往 con...