ITRON系統使用方法
ITRON系統使用方法
ITRON系統使用方法
目錄
引言
對於這樣一個處處存在計算機的時代,計算機已經不再是像現在這樣有顯示器和鍵盤的樣子,而是內只與各種各樣的機器裝置中,使用者不會意識到是在使用計算機,而是在不知不覺中愉快的接受了計算機提供的各種服務。
為了實現處處存在計算機的設想,在TRON專案中研製了內建於形式各異的機器裝置中的作業系統ITRON。ITRON與現在的大多數計算機中的作業系統的最大不同就是具有實時性。另外ITRON還有一個特點就是其標準的開放性,由於他的開發體系標準,任何人都可以自由的以ITRON為基準,建立作業系統。
課程目的:
本教材從應用的角度出發,比較詳盡的解析ITRON系統的基本原理,並且理論結合實際,由淺入深,逐步引導大家,從而保證每位學員能夠獨立在基於ITRON系統核心上進行應用軟體的設計和開發。
授課目標:
通過本課程的學習,能夠讓大家對ITRON系統有比較深入的瞭解,並能夠獨立開發基於ITRON系統的應用軟體。
物件導向:
本教材主要面向有一定作業系統原理基礎知識,並立志於基於ITRON體系開發的人。
教材構成:
-
ITRON系統概要
-
ITRON基本功能
-
任務管理
-
同步管理
-
記憶體管理
-
時鐘管理
-
中斷管理
-
-
初始化處理
-
系統呼叫詳細說明
ITRON系統介紹
概要
ITRON(Industrial the Real-Time Operation System Nucleus,工業實時作業系統中心)提出的實時多工系統規範。它具有標準的實時核心,適用於任何小規模的嵌入式系統,日本國內現有很多基於該核心的產品,其中消費電器較多,目前已成為日本事實上的工業標準。
ITRON和日本的精密機械工業相結合,使日本在資料系統、工業機器人、辦公機器方面處於世界領先地位。
ITRON系統具有以下特點:
-
多工支援
-
事件驅動基於優先順序的排程
-
任務間的通訊與同步
-
實時時鐘控制
-
完全可搶佔核心硬實時響應
構成
ITRON系統構成
ITRON系統主要由核心、介面庫、輔助工具這三個基本子系統組成。
核心:ITRON的核心部分,和處理程式一起組裝到目標系統中,進行實時、多工控制。主要包括排程程式、Task管理、同步管理、初始化以及各種資源的管理等。
介面庫:用外部函式的形式提供系統服務,實現將外部函式形式發行的系統呼叫轉變為核心識別管理的形式的介面程式。圖2.2-1 表明介面庫在系統中的位置。
圖2.2.1-1 介面庫的定位
輔助工具:包括編譯工具、Task Debuger等,為使用者方便式用系統提供了可能。
ITRON體系結構
建立在ITRON 基礎上的系統根據功能來分層,每一層都使用下一層提供的功能,系統
圖2.2.2-1ITRON系統體系結構
硬體構成了系統的最底層,緊接著一層包括了最簡單的大多是硬體相關的作業系統,功能最上層是應用程式。
應用領域
隨著資訊終端的高效能化,在終端上搭栽作業系統的例項越來越多。根據TRON協會提供的資料,下面將列舉出ITRON系統的主要應用領域。
-
娛樂/教育裝置
-
通訊裝置
-
AV裝置
-
測量儀器
-
醫療裝置、航空裝置的資料收集以及資料計算系統等
-
家用電器
在上述應用領域中,ITRON規範的作業系統的使用率比較高,普遍超過40%,除去其中沒有使用作業系統的裝置,這些領域中的ITON的使用率將超過60%,因此ITON規範的作業系統還是得到了廣泛的認可和應用的。
如何使用ITRON系統
ITRON規範中定義了一系列C語言介面庫,應用系統可以利用這些介面庫實現應用與作業系統的相連。下面是基於itron系統的軟體構建過程:
圖2.4-1 基於Itron系統的軟體構建過程
ITRON的基本機能
作為通常的實時作業系統,一般需要包含下面這些基本的管理功能:
-
中斷管理
-
任務管理
-
建立、撤消
-
狀態遷移
-
排程
-
同步(任務協調、資源的互斥訪問、任務之間通訊)
-
-
資源管理(記憶體、時間、埠、外設等)
ITRON系統也不例外的實現了這些功能,下面將針對這些機能進行詳細講解。
Task管理機能
Task
任務就是一個具有獨立功能的無限迴圈的程式段的一次執行活動。任務具有動態性並行性非同步獨立性的特點。
動態性任務的狀態是不斷變化的,一般分為:休眠態(dormant), 就緒態(ready),執行態(running), 掛起態suspended 睡眠態sleep 等如圖3.1
並行性是指系統中同時存在多個任務,它們巨集觀上是同時執行的。
非同步獨立性任務是系統中獨立執行的基本單元也是核心分配和排程的基本單元每個任務各自按相互獨立的不可預知的速度執行走走停停。
每個任務都要按排一個決定其重要性的優先順序,都有一個無限迴圈的程式段規定其功能(如一個C 語言過程),並相應有一個資料段、堆疊段及一個任務控制塊(儲存CPU 的現場, 狀態等)。
下面是一個ITRON系統任務應用的典型範例:
void XXX_Task ( INT stacd )
{
MSG msg;
while(1)
{
rcv_msg(&msg, MbxID); //從某個Mailbox中獲取情報
使用者程式
}
}
任務排程
作業系統必須為多個任務可能有競爭的請求分配資源,對於處理器來講,可分配的資源主要是處理器執行時間,分配的途徑是通過核心的排程來完成的。
排程產生條件
從表面上看,任務切換功能很簡單,在某個時刻,一個正在執行的任務被終止,作業系統指定另一個任務為執行狀態,並把控制權交給這個任務。但是什麼事件觸發了任務控制權的切換?ITRON系統中,當有如下幾個條件發生時,會發生任務的排程。
-
處理程式的返回
-
發生改變系統執行狀態的系統呼叫。
-
產生時鐘中斷。
排程方式
-
優先順序方式:
對於每個任務都事先分配有優先順序,這裡的優先順序是指決定排程順序的東西,排程程式首先會參照優先順序別,從Ready佇列中找到優先順序別最高的任務賦予CPU使用權。
在實時作業系統中任務的優先順序是應用程式設計者按照任務的重要程度來安排的,並且任務在執行中其優先順序可以動態改變,這個完全需要根據實際的需求進行設計。
圖3.1.2.2-1 Itron Ready佇列狀態和處理器使用權
-
FIFS方式
當擁有同一優先順序的任務存在多個時,排程程式將賦予成為Ready狀態時間最長的任務CPU的使用權。
-
任務的禁止/許可
-
時間片輪旬
作為Itron系統並沒有提供這種支援,但是可以通過現有系統提供的服務實現這種支援,這個在後面進行說明,詳細內容請參考:
任務的狀態管理
任務根據執行時所必須的資源獲得狀況,以及有無事件發生來實現狀態的遷移,所以核心必須管理各任務當前所處的狀態。
ITRON系統狀態定義
作業系統的職責是控制任務的執行,這裡包括決定任務交替的方式和資源的分配原則,所以為了達成這個目標,就需要描述任務的行為---即任務的狀態。在ITRON中,將任務劃分為如下七個狀態進行管理,在任意時刻,任務狀態只能屬於這七個狀態之一。
未登入狀態:non_existent
沒有作為任務的註冊到系統中,或被消除沒能登入到系統中的狀態。也就是說雖然已經裝配到記憶體中,但不受OS管理的程式。
休眠狀態:dormant
任務生成時的狀態(cre_tsk系統呼叫時)或者是執行終了時的狀態。處於dormant狀態的任務,已經從排程物件中刪除掉了。
就緒狀態:ready
成為核心排程物件管理的狀態。雖然已經具備除了處理機之外的所有必要資源,但是由於有比該任務優先順序別更高(或者相同任務優先順序別)的任務正在執行,等待執行權到達的狀態,也就是說,只要執行權到達,馬上遷移到run狀態的狀態。
執行狀態:run
得到了系統的控制權,正在處於執行處理中的狀態。系統中處於執行狀態的任務只能有一個。
等待狀態:wait
由於缺少執行的必要條件,不能進入到執行狀態的狀態,也就是說正在等待必要執行條件到達的狀態。
從wait狀態的重新執行是從進入到wait狀態時中斷的場所開始執行,也就是說執行程式時必要的各種內部環境(暫存器、堆疊等)會復原。
掛起狀態:suspend
被其他任務情知中斷執行(sus_tsk呼叫的發行)的狀態,還有可以通過多重發行sus_tsk呼叫,使suspend狀態巢狀。
Suspend狀態的解除是通過發行rsm_tsk系統呼叫來進行的。但是如果要發行依次rsm_tsk系統呼叫來解除被巢狀的suspend狀態,必須要選擇引數T_FRCPSM(0X1)。
從syspend狀態重新實行是指從為進入suspend狀態處理中斷的位置開始。也就是說執行程式時必要的各種內部環境(暫存器、堆疊等)會復原。
雙重等待狀態:wait_suspend
由上面wait狀態和suspend狀態合成的狀態,也就是對應於wait狀態發行了sus_tsk呼叫的場合遷移到的場合。
Wait_suspend狀態是當suspend狀態被解除時,就遷移到wait狀態,而wait狀態被解除時,就遷移到suspend狀態。
任務狀態遷移與系統呼叫
各個任務是通過系統呼叫的發行,來實現狀態的遷移的,具體的狀態遷移關聯關係情參考圖3.1.3.2-1:
圖3.1.3.2-1任務的狀態遷移關係圖
各遷移過程的詳細說明請參照表3.1.3.2-1
狀態遷移 |
說 明 |
系統呼叫 |
Nonexistent->dormant |
任務生成 |
cre_tsk |
Nonexistent->ready |
不可 |
- |
Nonexistent->run |
不可 |
- |
Nonexistent->wait |
不可 |
- |
Nonexistent->suspend |
\不可 |
- |
Dormant->nonexistent |
任務的刪除 |
del_tsk |
Dormant->ready |
任務的啟動 |
sta_tsk |
Dormant->run |
不可(注1) |
- |
Dormant->wait |
不可 |
- |
Dormant->suspend |
不可 |
- |
Ready->nonexistent |
不可 |
- |
Ready->dormant |
任務的強制終了 |
ter_tsk |
Ready->run |
在ready狀態的任務中,優先順序成為最高的任務 |
- |
Ready->wait |
不可 |
- |
Ready -> suspend |
任務的強制等待 |
sus_tsk |
Run->nonexistent |
任務的終了並自刪除 |
Exd_tsk |
Run->dormant |
正常終了 |
Ext_tsk |
Run->ready |
任務的自中斷,接受系統的排程(注2) |
- |
Run->wait |
等待要因的發生: 時間等待 喚醒等待 Event Flag等待 Semaphore等待 訊息等待 記憶體塊等待 |
Wai_tsk Slp_tsk Wai_flg Wai_sem Rcv_msg Get_blk |
Run->suspend |
不可 |
- |
Wait->nonexistent |
不可 |
- |
Wait->dormant |
任務的強制終了 |
Tet_tsk |
Wait->ready |
等待要因發生: Time out 喚醒等待 Eventflag等待 Semaphore等待 訊息等待 記憶體塊等待 |
Wup_tsk Sys_wup Set_flg Sig_sem Snd_msg Rel_blk |
Wait->run |
不可(注3) |
- |
Wait->wait_suspend |
任務的強制等待 |
Sus_tsk |
Suspend->nonexistent |
不可 |
- |
Suspend->dormant |
任務的強制終了 |
Ter_tsk |
Suspend->ready |
強制等待的解除 |
Rsm_tsk |
Suspend->run |
不可(注4) |
- |
Suspend->wait |
不可 |
- |
Suspend->wait_suspend |
不可 |
- |
Wait_suspend->wait |
強制等待的解除 |
Rsm_tsk |
Wait_suspend->suspend |
等待要因的解除 |
Vsnd_sig |
表3.1.3.2-ITRON任務的狀態遷移關係表
※1. 通過sta_tsk呼叫後有時會從dormant狀態遷移到run狀態,但實際上是經過ready狀態後遷移到run狀態的。
※2. 當出現比自任務有更高有限級的任務或對於自任務發行rot_rdp系統呼叫。
※3. 通過等待要因發生後,有時從suspend狀態遷移到run狀態名單實際上是經過ready狀態的。
※4. 通過rsm_tsk系統呼叫發現有時從suspend狀態遷移到run狀態,但實際上是經過ready狀態的。
任務的應用
-
建立任務
在Itron系統中建立任務存在兩種方式,一種方式是靜態註冊任務;另一種方法是動態的建立任務。
動態建立任務主要通過cre_tsk呼叫來實現的。
-
啟用任務
Itron系統中,初始建立的任務的狀態是Dormant狀態,這個時候任務還處於系統無法排程的狀態,所以必須啟用任務,啟用任務的系統呼叫是sta_tsk,作用就是將指定任務由Dormant狀態遷移到Ready狀態。
-
終止任務
在Itron系統中如果需要實現將任務由ready state, run state, wait state, suspend state, wait-suspend state遷移到Dormant狀態的話,需要通過下面兩種方式實現,正常終止和強制終止。
正常終止是任務自身主動放棄系統的使用權。
強制終止是任務自身出現錯誤,無法自主釋放系統使用權,這個時候只能通過其他任務來完成對本任務使用權的剝奪。
實現任務終止的系統呼叫主要有下面三個:
-
ext_tsk system call
The task that issued the ext_tsk system call is switched from the run state to the dormant state.
-
exd_tsk system call
The task that issued the exd_tsk system call is switched from the run state to the non-existent state.
-
ter_tsk system call
The task specified by the parameters is forcibly switched to the dormant state.
-
刪除任務
實現任務狀態從Run或者Dormant狀態切換到nonexistent狀態,實現這個功能主要通過下面兩個呼叫來完成的。
-
exd_tsk system call
The task that issued the exd_tsk system call is switched from the run state to the non-existent state.
-
del_tsk system call
The task specified by the parameters is switched from the dormant state to the non-existent state.
任務的設計
任務劃分的原則
在將一個軟體系統分解成並行任務時, 主要需考慮的是系統內功能的非同步性。
可以通過分析資料流圖中的變換, 確定哪些變換可以並行, 而哪些變換在本質上是順序的,通過這種方法, 劃分出任務: 一個變換對應一個任務,或者一個任務包括幾個變換。
一個變換是應該成為一個獨立的任務, 還是應該和其它變換一起組成一個任務, 決定的原則如下:
-
I/O 依賴性 (Dependency on Input/Output Device)
-
時間關鍵性的功能 (Time-critical functions-Hard Deadline)
-
計算量大的功能Heavy Computation function
-
功能內聚Functional relations
-
時間內聚Temporal relations
-
週期執行的功能Cyclic executing function
I/O 依賴性
如果換依賴於I/O, 那麼它執行的速度常常受限於與它互操作的I/O 裝置的速度在這種情況下, 變換應成為一個獨立的任務。
-
在系統中建立多個與I/O 裝置相當數目的I/O 任務
-
I/O 任務只實現與裝置相關的程式碼
-
I/O 任務的執行只受限於I/O 裝置的速度而不是處理器
-
在任務中分離裝置相關性
時間關鍵性的功能
對於事件關鍵性的功能對響應的時間要求的第一重要的,所以對於這類任務的響應的優先順序別比較高。
-
將有時間關鍵性的功能分離出來組成獨立執行的任務
-
賦予這些任務高的優先順序以滿足對響應時間的需要
計算功能
複雜的計算功能一般執行時間比較長,所以對於這類功能的設計的原則如下:
-
計算功能佔用CPU 的時間多
-
捆綁計算功能成任務賦予它們較低優先順序執行, 能被高優先順序的任務
-
搶佔消耗CPU 的剩餘時間
-
保持高優先順序的任務是輕量級的
-
多個計算任務可安排成同優先順序按時間片迴圈輪轉
時間內聚
-
將在同一時間內完成的各功能,即使這些功能是不相關的組成功能組形成一個任務
-
功能組的各功能是由相同的外部事件驅動的,如時鐘等這樣每次任務接收到一個事件, 它們都可以同時執行
-
組成一個任務,減少了系統的開銷
-
雖然時間內聚在結構化設計中並不被認為是一個好的模組分解原則, 但在任務級是可以被接受每個功能都作為一個獨立的模組來實現, 從而達到了模組級的功能內聚, 這些模組組合在一起, 又達到了任務級的時間內聚
週期執行功能
-
將在相同週期內執行的各功能組成一個任務
-
頻率高的賦予高優先順序
任務設計的誤區
-
錯誤的任務劃分原則
任務使用SUPSPEND/RESUME 太頻繁,是由於任務劃分過細任務的當成功能使用,改進的方法是將任務變成子程式使用。
當事件發生時呼叫子程式,任務劃分的太粗將子程式劃分為任務,
得到訊息後又立即檢查另外的資訊,不要使用輪循的方式直接使用事件驅動方式
-
優先順序倒置
當低優先順序的任務向高優先順序的任務傳送訊息時,高優先順序的任務不能執行,直到低優先順序的任務傳送訊息後才能執行。
這種情況下就沒有必要分為兩個任務只需要使低優先順序的任務呼叫子程式即可。
-
死鎖
兩個任務同時相互等待對方的訊號,導致它們永遠不能執行。
為了避免死瑣將共享資源統一排序所有的任務按序來訪問多個資源。
等待的事件沒有發生過或者不具備等待事件的發生條件。
同步和通訊管理
在多工的實時系統中,一項工作的完成往往要通過多個任務或多個任務與多箇中斷處理過程(ISRs)共同完成。它們之間必須協調動作互相配合,甚至需要交換資訊進行通訊。這些通訊和同步的需要是:
-
任務能和其他任務及ISRs 交換資料
-
任務能以以下方式與其他任務進行同步
-
單向同步一個任務與另一個任務或一個ISR 同步
-
雙向同步兩個任務相互同步
-
與同步 一個任務與幾個事件同時同步
-
或同步 一個任務與幾個事件中的任何第一個到達事件同步
-
-
任務必須能對共享資源進行互斥訪問
為了滿足任務間通訊同步和互斥的需要,同時保證資源被安全的使用,必須對多個相關任務在執行的次序上進行協調。ITRON系統主要提供瞭如下一些同步機制。
-
Event Flag,任務間的協調功能。
-
Semaphore,對系統資源進行排他訪問。
-
MailBox,任務之間進行的資訊通訊。
以下章節將針對這些系統同步方式進行詳細的說明。
Event Flag
在多工處理系統中,需要等到一個任務終了後,其他任務再開始啟動的等候功能,這個時候,需要擁有對其他任務是否終了進行判斷的能力,ITRON系統中提供了Event Flag.來實現這個機能。
ITRON系統中,一個Event Flag是ITRON工作區中的一個32 位的變數。32 位中的每一位都是表示一個事件標誌,事件標誌有兩種狀態,設定(1)和清除(0)。當一個標誌處於設定狀態時,表示相關的事件已經發生了,任務和ISRs 可以使用事件標誌來向其他任務傳送訊號, 表示事件已發生。
圖3.2.1-1 Event Flag示意圖
上圖中,人相當於任務,火把表示Event Flag,在沒有得到通知之前,等待訊號的人處於等待狀態,當傳送訊號的人傳送了通知之後,處於等待狀態的人將被啟用,便開始自己的作業了,這就是一個完整的Event Flag使用過程事例。
基本呼叫
ITRON系統中提供下面基本呼叫,實現了Event Flag的基本機能,詳細描述可以參照手冊:
cre_flg: Generates an event flag.
del_flg: Deletes an event flag.
set_flg: Sets a bit pattern.
clr_flg: Clears a bit pattern.
wai_flg: Checks a bit pattern.
pol_flg: Checks a bit pattern (by polling).
twai_flg: Checks a bit pattern (with timeout setting).
ref_flg: Acquires event flag information.
vget_flg: Acquires event flag ID number.
vset_flg1: Sets a bit.
vwai_flg1:Checks a bit.
Event Flag的應用
一般來說,Event Flag為任務之間的等待操作提供了場所,下面是其操作方法:
任務間的等候需要能夠傳達Event的任務和等待Event發生的任務,傳達Event任務通過發行set_flag呼叫來傳遞資訊,另一方面等待Event任務對事件發行等待呼叫,並且參照等候模式。
如果event flag的位模式與等待位模式一致時,任務可以繼續進行處理,如果不一致,任務就不做繼續處理,遷移到wait狀態,並進入到event的等待佇列中。
圖3.2.1.2-1表示了兩個Task通過32Bit Event Flag傳遞資訊的範例:
圖3.2.1.2-1 32Bit Event Flag使用時Task間同步方法
圖3.2.1.2-2表示了4個Task利用1Bit Event Flag傳遞資訊的執行範例:
圖3.2.1.2-2 1Bit Event Flag使用時Task間同步方法
-
Event Flag的生成
Event Flag的生成是通過cre_flg系統呼叫進行的,在Itron系統中,cre_flg呼叫從系統工作區中建立一個32bit的事件標誌組,並返回Event Flag的ID號。
-
Event Flag的刪除
通過del_flg呼叫可以實現對Event Flag的刪除,當產生刪除操作的時候,該系統中存在等待本Flag操作的任務,這個時候,處於等待Eveng Flag的任務將解除等待操作,並遷移到Ready狀態。
-
Event Flag的設定
通過set_flg呼叫,可以實現Event Flag的設定,當本呼叫發行後,處於等待Event Flag發行的任務的狀態將由等待狀態遷移到Ready狀態。
-
Event Flag的清除
通過clr_flg呼叫,可以實現Event Flag的清除,保證Event Flag能夠有初始化值。
-
Event Flag的等待
關於Event Flag的等待有三種方式,wai_flg, pol_flg, 和twai_flg,他們存在一些細微的差別。
-
wai_flg:如果Event Flag已經被設定,系統將保持執行,如果沒有存在滿足執行條件的Flag,系統將遷移到等待狀態,一直到滿足執行條件的事件發生。
-
pol_flg:任務直接查詢Event Flag,如果滿足執行條件的事件發生,系統保持執行狀態不變,如果沒有滿足執行條件的事件發生,系統將直接返回,不僅性等待操作。
-
twai_flg:在制定的時間內,如果存在滿足執行條件的事件發生,系統將保持執行狀態不變,否則系統將按照指定的時間進行等待,Timer Out之後,系統遷移到Ready狀態。
等待條件的設定:
因為Event Flag是一個32Bit的位群,所以在進行Event Flag的設定的時候可以按照條件的邏輯進行設定,主要的邏輯有And和Or兩種,需要根據實際情況進行有選擇的使用。
And:多個條件同時存在的時候,才滿足任務的執行條件。
Or:當設定的多個條件有一個滿足的時候,執行條件成立。
Semaphore
雖然多工系統中的各個Task可以共享各類資源,但是有些資源卻一次只能被一個任務使用,因此防止同時動作的多個任務出現資源爭執的需要,ITRON系統中提供了非負計數器-Semaphore,由管理資源個數的計數器進行資源使用得調配。
一個計數訊號量是ITRON工作區中的一個16 位的變數,初始值可以是0~65535,表示可以使用的資源數量,初始值為0表示資源開始處於鎖住狀態,一個非0的值表示有多個資源供多個任務訪問。
圖3.2.2 –1 Semaphore示意圖
上圖種停車場中的停車位置相當於存在使用競爭的資源,車相當於任務,空閒的車位數量相當於Semapjore的計數,當停車場中沒有空位的時候,沒有進入到停車場的車處於等待狀態,當停車場中有車離開的時候,表示當前有空閒的車位,這時就有車可以進入,並且空閒的位置與可以進入的車是等數量的,這個就是一個Semaphore的使用範例,可以通過這個過程來體會Semaphore的使用。
-
基於FIFS方式的等待機制
基於上圖的示例,ITRON系統提供的方法是為任務提供等待佇列,並且系統分配訊息的方式是基於FIFS方法的,不區分任務的優先順序別。
基本呼叫
ITRON系統中提供下面基本呼叫,實現了Semaphore的基本機能,詳細描述可以參照手冊:
cre_sem: Generates a semaphore
del_sem: Deletes a semaphore
sig_sem: Returns a resource
wai_sem: Acquires a resource
preq_sem: Acquires a resource (by polling)
twai_sem: Acquires a resource (with timeout setting)
ref_sem: Acquires semaphore information
vget_sid: Acquires semaphore ID number
Semaphore的應用
一般來講,semaphore是使用在任務之間排他控制的機構,下面是其操作的方法:
首先定義semaphore關聯的資源數,對資源進行使用的 task首先進行資源的查詢,如果能夠從semaphore中獲得資源的任務,任務將繼續處理,然後在不需要使用資源時,便發行釋放資源使用權的呼叫。
另外如果不能從semaphore中獲得到所要的資源,任務便不能繼續執行,遷移到wait狀態,並登入到semaphore的等待佇列中。處於等待的過程中的Task,如果可以得到資源,任務便從等待狀態中脫出,遷移到ready狀態。
圖3.2.2.2-1表示了三個Task共享n個資源的情況,請參照:
圖3.2.2.2-1利用Semaphore實現資源的排他使用
-
建立訊號量
Itron系統提供兩種建立Semaphore的方法,一種是靜態註冊,另一種是通過系統呼叫來動態建立。
動態建立是通過cre_sem的方法來實現的。
-
刪除訊號量
Itron系統中通過del_sem呼叫實現semaphore的刪除。當刪除semaphore被執行的時候,如果與本資源關聯的任務等待佇列中存在等待資源的任務時候,這些任務的狀態將自動切換到Ready狀態。
-
釋放資源
Itron系統中通過sig_sem呼叫實現資源的釋放,可以歸還資源的數量由sig_sem的引數決定。
-
資源請求
主要有下面三種方式可以實現資源的請求:wai_sem、preq_sem和twai_sem;他們雖然都實現資源的申請,但是使用時還有一些細微的差別:
-
wai_sem:當系統沒有滿足任務需要的資源數量的時候,系統狀態將遷移到等待狀態,直到系統中存在可以使用的資源為止。
-
preq_sem:查詢系統資源,如果存在滿足系統需要的資源,則申請使用,如果沒有滿足需要的資源,系統將不申請資源,但是執行狀態保持不變。
-
twai_sem:在申請資源的時候,可以指定等待的時間,如果在制定的時間內申請到資源,則系統繼續保持執行,如果在制定的時間內沒有申請到可用的資源,系統將解除等待狀態。
MailBox
為了實現任務之間的通訊功能,ITRON提供了郵箱,並且郵箱包含有多工應用的等待佇列和郵箱專用的資訊等待佇列,除了任務之間的通訊功能使用,也作為任務之間的協作功能使用。
當一個任務執行傳送原語時,有兩種可能性,一種可能是接收者已經處於等待狀態;另外一種可能是訊息傳送時,接收者沒有處於等待收信狀態;下面將針對這兩種情況進行示例說明:
-
下圖表示了訊息先於收信者到達的情況,這時信件被投入信箱之後,便被快取了起來,等待收信者取得信件。同時收信者到達之後,取得信件之後,便根據信件的指示進行相關作業。
圖3.2.3-1 訊息先於收信者到達的示例
基於上圖訊息等待方式的實現在ITRON系統的實現方法是為Message提供等待佇列作為緩衝,並且對於從佇列中取得資訊的方式提供了兩種方式作為支援,一種是FIFS,即先到達的信件被優先取走,另一種是對訊息進行優先順序別的指定,這樣就可以保證高優先順序別的訊息可以得到優先的取得權。
-
基於FIFS方式的等待機制
這種機制下所有訊息都是平等的,他們的取得順序完全取決於他們到達郵箱的時間,在郵箱中等待時間長的訊息有優先被執行的權力。
圖3.2.3-2基於FIFS的訊息等待機制
-
基於優先順序方式的等待機制
這種機制下的訊息是存在優先順序別的,高優先順序別的訊息會獲得優先執行權力,但是對於擁有相同優先順序別的訊息,他們的等待方式還是基於FIFS的方式進行的。
圖3.2.3-3基於優先順序方式的訊息等待機制
-
下圖表示了收信者先於發信者到達的等待方式,這時收信者開始處於等待狀態,當發信者將訊息投入到郵箱之後,收信者便重新處於啟用狀態,這時只要執行條件滿足,便可以根據訊息的指示進行相關作業。
圖3.2.3-4收信者先於訊息到達的示例
-
基於FIFS方式的等待機制
基於上圖的示例,ITRON系統提供的方法是為任務提供等待佇列,並且系統分配訊息的方式是基於FIFS方法的,不區分任務的優先順序別。
圖3.2.3-5任務等待訊息的Itron實現
基本呼叫
對郵箱的操作,系統主要提供瞭如下的呼叫:
cre_mbx: Generates a mailbox.
del_mbx: Deletes a mailbox.
snd_msg: Sends a message.
rcv_msg: Receives a message.
prcv_msg: Receives a message (by polling).
trcv_msg: Receives a message (with timeout setting).
ref_mbx: Acquires mailbox information
vget_mid: Acquires mailbox ID number
MailBox的應用
一般來說,郵箱是任務之間資訊通訊過程中的場所,下面是使用方法:
在任務之間的資訊通訊裡,需要給郵箱分配送信的任務(發報任務)和接受這個資訊的任務(接受任務)。這時如果郵箱裡已經有任務被排列在佇列裡,資訊就會被傳遞給等待佇列裡的任務中。任務專用佇列的先頭任務將會從Wait狀態遷移到Ready狀態。
但是如果郵箱中還沒有任務被排列在佇列中,資訊就會被排列到資訊專用的佇列中。不過發行snd_msg呼叫的任務不進行狀態遷移。
還有接受資訊的任務,對郵箱發行rcv_msg系統呼叫,接受訊息,這時物件郵箱中已經有資訊排列在佇列裡時,任務就會收取排列在佇列裡的資訊。但是如果物件郵箱中還沒有資訊被排列在佇列中的場合,任務就不能繼續處理,被排列在物件郵箱的任務專用佇列中,並且遷移到wait狀態。不過在處於wait狀態過程中,如果從其他任務那裡得到資訊的話,就可以接受資訊,任務同時也會從wait狀態解脫出來,遷移到ready狀態。
如此迴圈進行,任務之間的通訊便不斷地進行下去。
圖3.2.3.2-1說明了Task之間通過MailBox傳遞資訊的使用示例:
圖3.2.3.2-1Task利用MailBox進行通訊
圖3.2.3.2-2說明Task之間通過MailBox傳遞資訊時的執行過程。
圖3.2.3.2-2使用MailBox實現Task之間通訊的處理流程
-
建立郵箱
系統提供兩種方式建立郵箱,靜態註冊和動態建立。系統動態建立郵箱是通過cre_mbx呼叫來實現的。
-
刪除郵箱
系統提供的del_mbx功能可以實現郵箱的刪除,del_mbx發行後,如果等待佇列中存在任務的時候,這些任務的狀態將自動遷移到Ready狀態。
-
傳送Event
系統提供的snd_msg呼叫實現Event的傳送,當snd_msg傳送之後,處於等待Event的任務的狀態將由Wait狀態遷移到Ready狀態。
-
接收Event
Itron系統提供三種方式來實現Event的接收,rcv_msg, prcv_msg,和trcv_msg,他們的差異是:
-
rcv_msg:當郵箱中存在Evnet,則任務將直接獲取Event並保持執行狀態,當郵箱中沒有Event的時候,任務將遷移到等待狀態,直到郵箱中存在Event為止。
-
prcv_msg:任務查詢郵箱狀態,如果存在Event,則取得Event,並繼續執行,如果不存在Event,則任務不進行等待,繼續保持執行。
-
trcv_msg:在制定的時間內,郵箱中存在Event,則任務取得Event並執行,否則任務將等待指定的時間,之後遷移到Ready狀態。
記憶體管理
任務在執行過程中對記憶體的需求是不斷變化的不同的任務有不同的需要,OS 將記憶體當作一種資源來看並且在競爭的任務之間分配,這種資源就如同在競爭的任務間分配CPU 控制權一樣。
概述
在ITRON系統中所指的記憶體管理是通過對軟體的記憶體區域進行動態的管理,也就是說在需要申請使用的時候就要確保,如果不需要的時候就進行歸還的功能。
圖3.3.1-1 Memory Pool示意圖
在ITRON系統中,記憶體管理方法採用的是固定分割槽方式瑾形,並且對記憶體區域分為核心區域核使用者區域兩個部分,並且這兩個部分是單獨進行管理的。系統記憶體池是否生成核心管理的各個物件時候使用的記憶體區域,這個區域裡禁止作為使用者記憶體池使用的。使用者記憶體池是任務對記憶體區域進行申請時所使用的記憶體區域,並且這些記憶體池是相互獨立的,所以可以通過給每個任務分配不同的記憶體池來避免任務見記憶體領域的競爭。
分割槽管理採用的是靜態的記憶體分配方法, 系統分配和回收固定大小的儲存塊,其優點是儲存塊的分配和回收時間是確定的, 因為不會出現儲存碎片, 因而也不需要做回收儲存碎片, 進行合併等工作。
圖3.3.1-2記憶體分割槽
系統中, 可定義多個分割槽, 每個分割槽中儲存塊的大小可不同, 且可在分割槽中定義分割槽例如一個分割槽可以是另一個分割槽中的一塊這就意味著儲存塊,可以很容易地被分為子儲存塊,另外還可以為同一塊儲存區域定義兩個分割槽這樣就可以從同一塊儲存區中分配兩種不同尺寸的儲存塊。
基本呼叫
cre_mpl: Generates a memory pool.
del_mpl: Deletes the memory pool.
get_blk: Acquires a memory block.
pget_blk: Acquires a memory block (by polling).
tget_blk: Acquires a memory block (with timeout setting).
rel_blk: Release a memory block.
ref_mpl: Acquires memory pool information.
vget_pid: Acquires ID information of the memory pool.
記憶體池的建立
存在兩種方式來建立記憶體池,一種是靜態註冊,另外一種方式是動態建立。動態建立的方法是通過cre_mpl呼叫來實現的。
記憶體池的清除
del_mpl呼叫可以實現記憶體池的刪除,當執行刪除操作時,如果存在記憶體申請的任務處於等待狀態的話,這些任務將直接遷移到Ready狀態。
記憶體申請
Itron系統中存在三種方式來實現記憶體的申請,get_blk, pget_blk,和 tget_blk,這三種呼叫的使用方式如下:
get_blk:申請指定大小的記憶體塊,如果申請失敗,任務狀態將遷移到等待狀態,直到有滿足任務使用的記憶體被釋放。
pget_blk:申請指定大小的記憶體塊,如果申請成功,任務保持執行狀態,如果失敗,系統也不進行等待,直接執行其他指令。
tget_blk:如果沒有申請到制訂大小的記憶體,任務將等待指定的時間,之後遷移到Ready狀態。
記憶體釋放
當系統發行rel_blk呼叫之後,記憶體被歸還給系統。
中斷處理
中斷是硬體機制,它向CPU傳送訊號,表示外部非同步事件(無時序關係的隨機事件)發生,如裝置傳送資料請求、內部執行異常等。
對中斷的管理是OS的特徵之一,一般來說當發生中斷時,控制會轉移到中斷處理程式中,而控制轉移到中斷處理程式中的是硬體,軟體不參與。但是在ITRON系統中,為了方便管理,核心提供了進行中斷的通知,並將控制權轉移給中斷處理程式中的功能。
中斷處理的管理
為了提高中斷的吞吐率,ITRON系統將中斷分成兩個處理等級來進行中斷處理,一種是直接啟動的中斷Handler;另一種是中斷任務。
-
直接啟動的中斷Handler,處理時間可以在短時間內完成,並且要求響應速度的中斷請求,這種中斷Handler不需要通過OS的管理也能夠啟動的中斷處理專用程式。圖3.4.1-1給出這種中斷處理的執行過程。
圖3.4.1-1 直接啟動中斷Handler處理流程
-
中斷任務,需要的處理時間比較長,並且對中斷響應要求不是特別嚴格的場合使用。所謂中斷任務指被中斷處理程式喚醒或啟動的中斷處理專用任務。圖3.4.1-2給出中斷任務的處理流程。
圖3.4.1-2中斷任務的處理流程
中斷例程的登入
直接啟動中斷的登入方法需要將中斷服務Handler的地址登入到中斷向量表中,但是如果中斷任務就不能採用這種方式來定義,否則Itron系統將無法識別,所以中斷任務的登陸方法就需要使用ITRON系統提供的支援來實現。
下面圖解表示了系統對中斷任務的管理方式,請參考:
圖3.4.2-1 IDT和ISRs管理
在Itron系統中,為了實現對中斷任務的管理,在idt中登陸了預設的中斷處理程式,在呼叫使用者註冊的Isr之前,需要將中斷請求登陸到Itron管理的虛擬IDT表中,這樣系統就能夠通過對虛擬中斷向量表的管理來實現對中斷任務的管理。
中斷中的處理
因為中斷例程的特殊性,所以在進行中斷程式的設計和使用需要特別注意,否則會發生一些意想不到的問題,下面從幾個方面進行說明。
-
暫存器的儲存和恢復;
這個部分是每個使用中斷例程的系統都需要考慮的,但是這個部分需要根據實際CPU使用要求進行,本教材中僅僅提出提示,並不給出具體的限定條件。
-
系統呼叫的限制;
一般說來,在中斷例程中發行Itron系統呼叫與通常任務沒有特別的區別,所以為了保證系統的安全性,在中斷中,對於建立/刪除Itron管理物件、有遷移到資源獲取等待狀態可能的呼叫以及可能產生tron式樣中沒有定義的狀態遷移等,都被禁止使用,下面是否詳細資訊,請在、設計時候務必遵守。
不能被中斷例程使用的系統呼叫:
sta_tsk、ext_tsk、ter_tsk、dis_dsp、ena_dsp、chg_pri、rot_rdq、rel_wai、sus_tsk、rsm_tsk、slp_tsk、tslp_tsk、dly_tsk、wup_tsk、set_flg、wai_flg、twai_flg、sig_sem、snd_msg、rcv_msg、trcv_msg、pget_blf、tget_blk、loc_cpu、unl_cpu等。
時鐘管理
在實時系統中,時間是操作任務過程中最基礎的要素,在核心中的週期喚醒、延遲喚醒、Time Out等的操作都以它來作為基礎。
週期喚醒
對任務發行週期性的喚醒要求叫做週期喚醒。在ITRON系統中提供了週期喚醒任務來實現本機能。
下面方法實現了週期喚醒任務的實現:
def_cyc: Registers a cyclically activated handler.
act_cyc: Controls the activity state of the cyclically activated handler.
ref_cyc: Acquires cyclically activated handler information.
圖3.5.1-1 週期喚醒使用示例
在上圖中,表示了一個系統以某個固定的週期來執行動作,所以當系統存在上述要求的時候,就可以使用Itron系統提供的相應服務來實現使用者所要求的功能。
延遲喚醒
從當前時刻開始,經過指定的時間後喚醒的任務稱作延遲喚醒。
產生延遲喚醒的呼叫是dly_tsk,,當呼叫發生時,系統的執行狀態將遷移到等待狀態,直到指定的時間Time Out之後才能遷移到Ready狀態。
圖3.5.2-1延遲喚醒使用示例
Itron系統中管理的時鐘是以毫秒為單位的,所以上面的計數都是以毫秒為單位進行累加,當計數到100時,系統喚醒任務,並切換任務到Ready狀態,等待系統的排程。
Time Out指定
發行event flag等待、semaphore等待、Mailbox等待等功能呼叫時,可以指定等待的時間,這樣的指定稱作TimeOut指定。
-
tslp_tsk system call
-
twai_sem system call
-
twai_flg system call
-
trcv_msg system call
初始化處理
本章對系統啟動時核心所進行的初始化處理進行講解。
所謂初始化處理指ITRON系統動作過程所必需的硬體、核心以及軟體的初始化處理。圖4-1表示了ITRON系統的初始化過程。
圖4-1 ITRON系統初始化流程
硬體初始化
為了保證系統的安全執行,對目標硬體環境進行初始化的設定,包括埠、時鐘、中斷以及RAM等。
核心初始化
包括ITRON系統使用的變數的初始化以及任務的生成核啟動等。
-
Generation/initialization of management objects
-
Task generation
-
Generation/initialization of a semaphore
-
Generation/initialization of event flags
-
Generation/initialization of a memory pool
-
Registration of the indirectly activated interrupt handler
-
Registration of the cyclically activated handler
-
egistration of the extended SVC
-
-
Activation of an initial task
-
Activation of the system task (idle task)
-
Calling of the software initialization section
-
Transfer of control to the scheduler
軟體初始化
系統執行的軟體環境進行初始化,包括程式變數初始化等,這個部分需要根據不同得應用來進行這裡部做特別的說明。
附錄
練習題
1. 請應用Event Flag進行任務間同步,前提條件如下:
-
存在兩個任務A和B,並且優先順序是A>B。
2. 請應用Mail Box進行任務間同步,前提條件如下:
3. 請應用Semaphore進行任務間同步,前提條件如下:
-
存在三個任務A、B和C,並且任務的優先順序別是A>B>C;
-
這三個任務需要共享三臺印表機資源,A任務完成一次呼叫時需要同時申請兩臺印表機,B任務完成一次呼叫需要申請1臺印表機,C任務完成一次呼叫需要申請兩臺印表機;
請設計並實現。
參考資料:
編號 |
資料名稱 |
簡介 |
作者 |
日期 |
出版單位 |
01 |
mitron-400e.pdf |
u-Itron V4.0式樣 |
相關網站
網址 |
網站簡介 |
相關文章
- FreeBSD系統使用方法詳解
- win10系統下BCDEdit命令的使用方法Win10
- Unix系統中的dot命令的使用方法詳解
- Win10系統中虛擬桌面的使用方法Win10
- 檔案系統管理 之 例項解說 fdisk 使用方法
- win10系統下自帶錄屏功能的使用方法Win10
- Win10系統中無線同屏功能的使用方法Win10
- win10系統中自帶放大鏡功能的使用方法Win10
- Win10系統正版金鑰是否可以反覆用 win10系統金鑰的使用方法Win10
- win10系統重置此電腦的使用方法【圖文教程】Win10
- Win10系統下網路故障診斷功能的使用方法Win10
- win10系統icc配置檔案怎麼使用_win10系統icc配置檔案使用方法Win10
- win10系統下怎麼使用錄音功能 win10系統下錄音功能的使用方法Win10
- Excel查詢填報系統2.0版本安裝和使用方法Excel
- win10自帶系統遷移工具怎麼用 win10自帶系統遷移工具使用方法Win10
- win10系統下vmware虛擬機器的使用方法【圖文教程】Win10虛擬機
- Linux系統中KafKa安裝和使用方法 java客戶端連線kafkaLinuxKafkaJava客戶端
- Win10系統下百度瀏覽器翻譯功能的使用方法Win10瀏覽器
- win10系統內建錄屏如何使用_win10內建錄屏軟體使用方法Win10
- VNC viewer使用方法,win10VNC使用方法VNCViewWin10
- XQuartz 使用方法quartz
- labelme使用方法
- plotly使用方法
- anaconda使用方法
- nmap使用方法
- NPM使用方法NPM
- webpack 使用方法。Web
- libev使用方法
- Linux——指令使用方法!Linux
- Masonry 使用方法整理
- Java DES 使用方法Java
- docker的使用方法Docker
- MagicArray基本使用方法
- chown 命令使用方法
- SerialPort的使用方法
- linux awk使用方法Linux
- VIM 的使用方法
- Markdown的使用方法