第3章 μc/os-ⅱ的中斷和時鐘
3.1 μc/os-ⅱ的中斷過程
☆μc/os-ⅱ的中斷過程:系統接收到中斷請求後,如果這時cpu處於中斷允許狀態(即中斷開放),系統會中止正在執行的當前任務,而按照中斷向量的指向轉而去執行中斷服務子程式;當中斷服務子程式的執行結束後,系統將會根據情況返回到被中止的任務繼續執行,或者轉向執行另乙個具有更高優先順序別的就緒任務。
☆可剝奪的μc/os-ⅱ核心,中斷服務子程式執行結束後,系統根據情況進行任務排程,去執行優先級別最高的就緒任務,並不一定是被中斷的任務。
☆幢系統允許中斷巢狀,即高優先順序別的中斷請求可中斷低優先順序別的中斷服務程式的執行。全域性變數osintneating記錄中斷巢狀的層數。
☆μc/os-ⅱ響應中斷的過程示意圖:
☆中斷服務函式osintenter()(把全域性變數osintnesting加1,用以記錄中斷巢狀的層數),在中斷服務程式保護被中斷任務的斷點資料之後,執行使用者中斷服務**之前來呼叫:
void osintenter(void)}}
☆退出中斷服務函式osintexit()
流程圖:
在中斷巢狀層數計數器為0,排程器未被鎖定且從任務就緒表中查詢到的最高端就緒任務又不是被中斷的任務的條件下將要進行任務切換,否則就返回被中斷的服務子程式。
源**:
void osintexit(void)
if((osintnesting == 0) && (oslocknesting == 0))
}os_exit_critical();}}
☆乙個中斷服務程式的流程:
☆中斷級任務切換函式(函式在中斷巢狀層數計數器為0,排程器未被鎖定且從任務就緒表中查詢到的最高端就緒任務又不是被中斷的任務的條件下,將要執行任務切換,中斷級任務切換函式就是中斷服務程式中呼叫的負責任務切換工作的函式)
中斷級任務切換函式osintctxsw()示意**如下:
osintctxsw()
☆應用程式中的臨界段:
臨界段:在應用程式中不受任何干擾地連續執行的**。為了在執行時不受中斷所打斷,在臨界**前必須用關中斷指令使cpu遮蔽中斷請求,而在臨界段**後必須開中斷指令解除遮蔽,使得cpu可以響應中斷請求。
☆為了增強μc/os-ⅱ的可移植性,μc/os-ⅱ用os_enter_critical()和os_exit_critical()這兩個巨集來實現中斷的開放和關閉,把系統硬體相關的關中斷和開中斷的指令分別封裝在這兩個巨集中。
☆巨集os_enter_critical()和os_exit_critical()的實現方法:
1.直接使用處理器的中斷和關中斷指令來實現,需令常數os_critical_method = 1。
**如下:
#define os_enter_critical() \
asm(「di」) //關中斷
#define os_exit_critical() \
asm(「ei」) //開中斷
2.在巨集os_enter_critical()中,把cpu的允許中斷標誌儲存在堆疊中,然後再關閉中斷,這樣在臨界段結束時,即在呼叫巨集os_exit_critical()時,只要把堆疊中儲存的cpu允許中斷狀態恢復即可,可以保證cpu中斷允許標誌的狀態在臨界段前和後不發生變化。
**如下:
#define os_enter_critical() \
asm(「push psw」) \ //通過儲存程式狀態字來儲存中斷允許標誌
asm(「di」) //關中斷
#define os_exit_critical() \
asm(「pop psw」) //恢復中斷允許標誌
3.(前提:使用者使用的c編譯器只有擴充套件功能)使用者可獲得程式狀態字的值,把該值儲存在c語言函式的區域性變數中,不必壓到堆疊裡。
**如下:
#define os_enter_critical() \
cpu_sr = get_processor_psw(); \ //通過儲存程式狀態字在全域性變數sr中
disable_interrupts(); //關中斷
#define os_exit_critical() \
set_processor_psw(cpu_sr); //用sr恢復程式狀態字
需令常數os_critical_method = 3。
3.2 μc/os-ⅱ的時鐘
☆時鐘:任何作業系統都要提供乙個週期性的訊號源,以供系統處理諸如延時、超時等與時間有關的時間。
☆利用硬體定時器產生乙個週期是毫秒級的週期性中斷來實現系統時鐘,最小時鐘單位為時鐘節拍。
☆ostickisr():硬體定時器以時鐘節拍為週期定時產生中斷的中斷服務程式。完成系統在每個時鐘節拍時所需的工作。
**如下:
void ostickisr(void)
呼叫ostimetick(); //節拍處理
清除中斷;
開中斷;
呼叫osintexit(); //中斷巢狀層數減1
恢復cpu暫存器;
中斷返回;
}☆時鐘節拍服務函式:在時鐘中斷服務程式中呼叫的ostimetick()。
**如下:
ostimetick()的任務:在每個時鐘節拍了解每個任務的延時狀態,使其中已經到了延時時限的非掛起任務進入就緒狀態。
3.3 時間管理
☆任務的延時:
函式ostimedly(),使當前任務的執行延時一段時間並進行一次任務排程,以讓出cpu的使用權。
**如下:
void ostimedly()
ostcbcur -> ostcbdly = ticks; //延時節拍數存入任務控制塊
ost_exit_critical();
os_sched(); //呼叫排程函式} }
引數ticks是以時鐘節拍數為單位的延時時間的。
☆用時、分、秒為引數的任務的延時函式ostimedlyhmsm(),原型如下:
int8u ostimedlyhmsm(
int8u hours, //小時
int8u minutes, //分
int8u seconds, //秒
int16u milli //毫秒
);☆呼叫函式ostimedly()和ostimedlyhmsm()的任務,當規定的延時時間期滿,或有其他任務通過函式ostimedlyresume()取消了延時時,它會立即進入就緒狀態。
☆取消任務的延時:
函式ostimedlyresume()
int8u ostimedlyresume(int8u prio);
引數prio為被取消延時任務的優先級別。
ostimedlyresume()函式的源**:
函式ostimeget()獲取ostime的值,ostime在應用程式呼叫osstart()時被初始化為0,以後每發生1個時鐘節拍,ostime的值就加1。
原型:int8u ostimeget(void);
函式ostimeset()可以設定ostime的值。
原型:void ostimeset(int32u ticks);
3.4 小結
1.在μc/os-ⅱ中,中斷服務子程式執行結束之後,系統將會根據情況進行一次中斷級的任務排程去執行優先級別最高的就緒任務,而並不一定要接續執行被中斷的任務。
2.μc/os-ⅱ的中斷允許巢狀,用全域性變數osintnesting來記錄巢狀數。
3.μc/os-ⅱ的中斷服務程式的工作通常是由中斷啟用的乙個任務來完成的。
4.在任務中可以設定臨界區的方法來遮蔽中斷。設定臨界區的巨集有三種方式來實現。
5.μc/os-ⅱi的時鐘通常是乙個由硬體計數器定時產生週期性中斷訊號來實現的,每一次中斷叫做乙個節拍,其中斷服務程式叫做節拍服務程式。
6.μc/os-ⅱ在每乙個節拍服務裡都要遍歷系統中全部任務的任務控制塊,把其中記錄任務延時時間的成員ostcbdly減1,並使延時時間到的任務進入就緒狀態。
7.μc/os-ⅱ有10個函式提供了鉤子函式,應用程式設計人員可以再鉤子函式中編寫寫自己的**。
8.μc/os-ⅱ進行時間管理的函式中,最重要的是延時函式ostimedly()和ostimedlyhmsm().
C OS實時作業系統簡單介紹
c os ii c os ii實時多工作業系統核心。它被廣泛應用於微處理器 微控制器和數字訊號處理器。c os ii 的前身是 c os,最早出自於1992年美國嵌入式系統專家jean j.labrosse 在 嵌入式系統程式設計 雜誌的5月和6月刊上刊登的文章 並把 c os 的原始碼發布在該雜誌...
實時作業系統 C OS 讀書筆記(4)
第4章 任務的同步與通訊 4.1 任務的同步和事件 任務間的制約關係 直接制約 源於任務之間的合作。間接制約 源於對資源的共享。因此,多工合作過程中,作業系統要解決兩個問題 1.各任務間應該有一種互斥關係 2.相關的任務在執行上要有先後次序 事件 c os 實現任務之間通訊所使用的中間環節,例如 訊...
嵌入式實時作業系統 COS 的移植
1 引言 嵌入式系統由於它具有軟體 小 高度自動化 響應速度快等特點已經使它在許多領域得到廣泛的應用 3 從家裡的洗衣機 電冰箱,到作為交通工具的自 行車 小汽車,到辦公室裡的遠端會議系統等。嵌入式系統通常由硬體環境和作業系統構成。在嵌入式作業系統的統一排程管理下實現對所有系統資源的合理利用和 分配...