ucos ii學習筆記1——任務中斷和排程
阿新 • • 發佈:2019-01-02
UCos ii的中斷過程是接收到中斷請求,如果此時處理器處於中斷允許的情況下,系統中止當前執行的任務,而按照中斷向量指向的中斷服務子程式,當中斷服務子程式結束時,系統將根據當前優先順序連結串列中的情況,返回原先的被中止的任務繼續執行,或者到另一個優先順序更高的就緒任務上執行。
因為UCos ii是可剝奪性核心,所以中斷服務結束之前需要有一次任務排程,通過任務排程判斷最高優先順序準備的任務,目的是提高系統的實時性。
排程函式通過一個變數OSIntNesting判斷, OSIntNesting有兩個功能:1、對中斷巢狀進行計數,表示巢狀的層數。2、為排程器加鎖和解鎖。只有當OSIntNesting== 0 時才進行任務的排程。
OSIntEnter()函式主要功能是每次進入中斷子函式時將OSIntNesting加1,從而使排程器加鎖。
OSIntExit()函式主要功能是退出中斷服務,當OSIntNesting和OSLockNesting都為0時,需要讀取OSMAPTBL[OSRDYGRP],然後切換到相應的服務函式。
在切換過程需要呼叫OSIntCtxSw()函式,將任務控制塊進行切換,將sp指標指向執行的堆疊,用出棧命令把R1,R2…彈入處理器的通用暫存器。
臨界區概念,忽略所有中斷請求,通過2個巨集定義函式控制中斷的開啟和關閉,並且儲存程式狀態字。
#define OS_ENTER_CRITICAL()
cpu_sr = get_processor_psw();
disable_interrupts();
Set_processor_psw(cpu_sr);
上面兩個巨集定義函式,需要使用者使用的C編譯器具有擴充套件功能,使用者可以把該值儲存在c語言函式的區域性變數中,不必壓到堆疊中。