與中斷相關

要弄清楚以下函數的意義:

OSTimeTick()在OS_CORE.C中,爲時鐘管理函數。

OSTickISR( )在OS_CPU_A.S中以彙編的形式編寫。

任何計算機系統都應該有一系統時鐘,UCOS系統的系統時鐘是通過硬件定時器產生中斷來實現的,這個中斷會產生一個時鐘中斷服務程序,時鐘中斷服務程序也叫做節拍服務。各個任務運行都需要一個週期性的信號指示,即每一個任務允許運行的時間片是多少,必須規定好。這個時間片就是系統時鐘節拍

UCOS系統響應中斷的過程:系統正在運行任務,此時有中斷髮生,且系統收到了中斷請求(系統如何收到中斷請求,中斷以何種方式告知操作系統?)。如果處理器處於中斷允許狀態,系統就中止當前任務的運行,而按照中斷向量去執行相應的中斷服務程序;中斷服務自程序結束前,會進行一次任務調度。這樣中斷結束後,系統將會根據情況返回到被中止的任務繼續運行,或者轉到另外一個具有更高優先級的就緒任務上運行。

全局變量OSIntNesting有兩個用途:第一是用來記錄中斷嵌套的層數,中斷嵌套也就是說當第一個中斷髮生而沒有結束的時候,又發生了第二個更重要的中斷,依次類推,此時OSIntNesting就用來表示嵌套的層數,也就是有多少箇中斷在發生或者等待處理,也就是說每當有中斷髮生時,就將OSIntNesting加1,有中斷結束的時候,就將OSIntNesting減1;第二是作爲調度器是否可進行調度的標誌,以保證調度器不會在中斷服務程序中進行任務調度,也就是當OSIntNesting大於0的時候,將調度器加鎖,OSIntNesting等於0的時候,調度器解鎖。(這樣理解調度器的加鎖和解鎖,是否正確?中斷服務自程序結束前,會進行一次任務調度。這個時候調度器不是鎖上的嗎?如何調度呢?

UCOS用兩個函數OSIntEnter (void)和OSIntExit (void)來處理變量SIntNesting。

void  OSIntEnter (void)
{
    if (OSRunning == TRUE) {
        if (OSIntNesting < 255u) {
            OSIntNesting++;                      /* Increment ISR nesting level                        */
        }
    }
}                       ;這個函數的作用就是把SIntNesting加一,來記錄嵌套層數,併爲調度器加鎖。它經常運行在中斷服務程序保護用戶被中斷任務的端點數據之後,運行用戶中斷服務代碼之前,通常叫做進入中斷服務函數。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章