uC OS II學習記錄

2021-06-29 09:13:47 字數 2542 閱讀 7025

建立使用者任務

開啟任務排程

執行第乙個任務->系統tick中斷->系統時鐘處理->搜尋最高優先順序任務->如果當前任務不是最高優先順序任務,則觸發一次任務排程->否則進行正常的中斷返回

在明白了uc/os - ii的大致流程後,有點迷茫了,大概有這樣幾個困惑:

對上述困惑,也有了以下的一些分析:

為特定的處理器編寫特定**的過程成為「移植」1。

在閱讀c語言教程時經常會碰到臨界段這個概念,從字面上一直不好理解。查閱了英文資料,臨界段的英文原文叫做critical section或者critical region,意思是特別重要的、不能被中斷打斷執行的**段。所以一般把關中斷的操作叫做進入臨界段,開中斷的操作叫做退出臨界段2。

上下文切換一詞在作業系統中經常提到,對應英文為context switches,本質上是指cpu暫存器內容的切換,實際效果對應於系統執行任務的切換3。

作為系統設計的一條原則,cpu的利用率應該小於60%-70%4。

作業系統中,任務通常是無限迴圈5,形如:

void yourtask(void *pdata)

}

在uc/os - ii中,使任務進入就緒狀態的**如下:

osrdygrp          |= osmaptbl[prio>>3];

osrdytbl[prio>>3] |= osmaptbl[prio&0x07];

其中,osmaptbl陣列內容如下:

下標位掩碼(二進位制)

000000001

100000010

200000100

300001000

400010000

500100000

601000000

710000000

而使得任務脫離就緒狀態的**如下:

if ((osrdytbl[prio>>3] &= ~osmaptbl[prio&0x07]) == 0)

在獲取當前優先順序最高的任務時,為了保證系統的實時性,即不管最高優先順序任務在哪,系統查詢到最高優先順序任務所花費的時間要固定。因此不能採用常規的迴圈查詢的方法,此處,uc/os - ii採用了直接查表的方法,每次都能以相同的時間獲取最高優先順序任務。原理6如下:

1. 先搞個例子感受下

某一時刻osrdygrp的值為0b00010001,而此時osrdytbl中的值為:

osrdytbl[0] = 0b00000110;

osrdytbl[4] = 0b00010000;

則時刻系統中就緒任務優先順序如下:

0 * 8 + 1 = 1;

0 * 8 + 2 = 2;

4 * 8 + 4 = 36;

即系統中的優先順序為1,2,36

2. 分析

在上述例子中,假設osrdygrp二進位制表示下最低位為1的位置為yosrdytbl[y]最低位為1的位置為x,則系統中最高優先順序為:

prio = y * 8 + x;
因此,要想求得系統最高優先順序任務,只需把0x00 - 0xffosrdygrposrdytbl[i]都是8位二進位制數,共有0x00 - 0xff種二進位制表示)二進位制表示的最低位為1的位置列成表就行:

int8u  const  osunmaptbl[256] =

;

最終,求最高優先順序任務**如下:

y = osunmaptbl[osrdygrp];

x = osunmaptbl[osrdytbl[y]];

prio = y * 8 + x;

看懂乙個作業系統,有以下好處:

當中斷程式可能會改變一段**中用到的某些變數的值的時候,就需要關中斷來保證**執行的正確性。執行完這段**後要立即開中斷保證系統對非同步事件的處理速度(實時性)。上述的那段**叫做臨界段。

感覺要自己寫出彙編部分的**還是比較困難

邵貝貝《嵌入式實時作業系統ucos-ii(第2版)》1.04 範例4 ↩

邵貝貝《嵌入式實時作業系統ucos-ii(第2版)》2.01 **的臨界段 ↩

邵貝貝《嵌入式實時作業系統ucos-ii(第2版)》2.06 任務切換 ↩

邵貝貝《嵌入式實時作業系統ucos-ii(第2版)》2.17 任務優先順序分配 ↩

邵貝貝《嵌入式實時作業系統ucos-ii(第2版)》3.01 任務 ↩

解讀ucos中優先順序判定表osunmaptbl原理

uCOSII學習使用記錄

最近學習和使用ucosii,在這裡做一下筆記 串列埠中斷 中斷處理前新增 os enter critical osintnesting os exit critical 退出中斷後 osintexit 有人移植了2.86或者2.88版本後,發現跑的時間長了,會出現某些任務跑步了了,是需要設定將中斷改...

ucosII學習筆記

以前很少接觸過嵌入式作業系統,這次因為要嘗試研究ucosii這個嵌入式作業系統,看看自己能不能盡快的會使用它,查詢了不少資料。ucosii學習筆記。以下是nathan.yu的 ucosii學習筆記 整理的不錯,自己先借鑑。ucosii學習筆記 by nathan.yu ucos ii特性 l 可剝奪...

UC OS II學習小結

由於公司最近的產品都是以uc os ii作為系統平台,雖然自我感覺uc os與linux難易程度相差太大,所以意願上不相去弄uc os,感覺好像落伍來了一樣,不過有些事情是沒辦法的,公司用的這個平台,你不去了解,就什麼都不會做了。經過了乙個多月的學習,忽然感覺到uc os的魅力所在,首先是簡單易學,...