UCOSII中的OSInter()是幹嘛的?

2022-05-04 16:06:07 字數 1020 閱讀 9310

今天發現自己的程式裡本來想用臨界**段保護的,本來是這一對

1

但是發現由於當時疏忽寫成了osintenter();和osintexit();這一對函式和上面完全不是乙個概念,這對是在進入中斷服務函式isr中後,要呼叫的,其實也就是將中斷巢狀層數加1,並且告知os我已經進中斷了,要做好中斷前任務的儲存工作,完成中斷服務前呼叫osintexit()告知os我要退出中斷了,減一次中斷巢狀層數,並且要檢視是否需要排程任務。

對於可剝奪型的ucosii核心來說,中斷服務子程式執行結束前,需要進行一次任務排程。正因為有了這次排程,在中斷結束時,系統才能去執行另外乙個任務,而不是一定要返回被中斷的任務。當然,這個被執行的任務一定是優先級別最高的就緒任務。ucosii之所以這樣做,就是為了提高系統的實時性。

那麼,什麼時候要用到這對函式?在中斷服務函式中使用這對函式,乃是為了在中斷結束後可進行任務排程,使得系統更加「實時」。假如中斷服務函式裡沒有進行任何的與任務有關操作,而且時間比較短,是沒必要使用這對函式的。譬如,我們使用定時器模擬串列埠傳送,中斷服務函式裡只是進行io口的翻轉,這個時候加入osintexit()簡直是不可忍受的,因為開銷太大,大大地影響模擬串列埠的波特率。

osintenter()用來通知核心:現在已經進入中斷服務程式,禁止排程;osintexit()用來通知核心:中斷服務已結束,可以進行排程。因此,在這兩個函式之間就是排程禁區,因此它們要成對使用。下面列出這對函式的**:

1

void osintenter (void)2

7}8}

910void osintexit (void)11

23if (osintnesting == 0u) 34}

35}36os_exit_critical();37}

38 }

view code

在ucosii中,通常用乙個任務來完成非同步事件的處理工作,而在中斷服務程式中只是通過向任務傳送訊息的方法去啟用這個任務。

uC OS II中的訊息郵箱

2007 12 24 14 25 05 uc os ii中的訊息郵箱 訊息郵箱是uc os ii中的另一種通訊機制,可以使乙個任務或者中斷服務子程式向另乙個任務傳送乙個指標型的變數。通常該指標指向乙個包含了 訊息 的特定資料結構。應用程式可以使用多少個郵箱,其最大數目是由os cfg.h檔案中的配置...

ucosii中的任務數量

對於ucos中支援的任務數量,不同的版本有一定的差異。具體來說,ucos 2.86版本之前支援64個任務,系統一般要占用最低兩個優先順序用作空閒任務和統計任務 假如初始化了統計任務 ucos 2.86版本起支援256任務,同樣是最低優先順序兩個任務用作系統任務。有的地方說,在ucos中系統保留了最高...

uC OS II中的全域性變數宣告

在uc os ii的 中,應用了一種讓人耳目一新的全域性變數定義方法。在 uc os ii 中,作者給出了解釋,但是這裡還是忍不住要討論一番。我們知道,全域性變數的使用有兩個問題 1.要給它分配記憶體,並且只能分配一次。2.在其它模組中也要能通過extern關鍵字呼叫。軟體開發網 按照平時的定義,如...