01
臨界段與臨界資源
操作系統中有有兩個名詞,臨界段和臨界資源。
01
臨界段
代碼的臨界段也稱為臨界區,指處理時不可分割的代碼。一旦這部分代碼開始執行,則不允許任何中斷打入。為確保臨界段代碼的執行,在進入臨界段之前要關中斷,而臨界段代碼執行完以后要立即開中斷。
02
臨界資源
臨界資源在一段時間內只允許一個進程訪問的資源。又稱獨占資源。資源可以是輸入輸出設備,例如打印機、鍵盤、顯示器,資源也可以是一個變量,一個結構或一個數組等。
02
三種臨界區管理機制
2.1
示例代碼
在μC/OS-II中有三種臨界區管理方式,是在oc_cpu.h文件中通過宏OS_CRITICAL_METHOD來控制,如下圖為8086臨界區實現方式
2.2
PSW(程序狀態字)
不管是何種芯片,進入臨界區的思想是不變的,就是失能控制PSW(Program Status Word)中的IF(中斷標志位)標志位。8086的標志寄存器如下圖所示。不同芯片的PSW略微不同。
2.3
方法1
方法1是直接將OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()定義為處理器的關閉(CLI)和打開(STI)中斷指令。STI(Set Interrupt) 為開中斷,CLI(Clear Interrupt) 為關中斷,這里設置的是PSW(Program Status Word)中的中斷標志位。
但這種方法有一個隱患,如果在關閉中斷后調用μC/OS函數,當函數返回后,中斷將被打開!嚴格意義上的關閉中斷應該是執行OS_ENTER_CRITICAL()后中斷始終是關閉的, 方法1顯然不滿足要求。但方法1的優點是簡單,執行速度快(只有一條指令)。
2.4
方法二
OS_ENTER_CRITICAL()會在關中斷前保存之前的標志寄存器內容到堆棧中,隨之將中斷關閉,OS_EXIT_CRITICAL()從堆棧中恢復之前保存的狀態。
PUSHF是將標志寄存器入棧,POPF是將棧頂的內容彈出到標志寄存器中。
但是一些編譯器不能很好地優化內聯代碼,因此,此方法可能無法正常工作。因為編譯器可能不夠智能,無法知道堆棧指針已經被更改(通過PUSHF指令),此時再想去訪問堆棧中的數據極大可能出現錯誤的值,從而導致應用程序的崩潰。
2.5
方法三
一些編譯器提供了擴展的接口允許用戶獲取PSW中的值,并將此狀態值保存在聲明的變量中,隨之將中斷關閉,在退出臨界區時,在將上面保存的值恢復到PSW中。
OSCPUSaveSR以及OSCPURestoreSR是在os_cpu_a.s文件中定義的,使用匯編指令實現的。
這種方法的優點就是安全可靠,缺點就是執行速度較上面兩種慢,因為進入和退出臨界區的匯編代碼可能不止一條,而且還需要訪問內存變量cpu_sr。
原文標題:μC/OS三種臨界區管理機制
文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
-
顯示器
+關注
關注
21文章
5070瀏覽量
141608 -
操作系統
+關注
關注
37文章
7123瀏覽量
125305 -
代碼
+關注
關注
30文章
4894瀏覽量
70464
原文標題:μC/OS三種臨界區管理機制
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
1553B總線常見三種組網方式

三種太赫茲波的產生方式

示波器的三種觸發模式

systemd journal收集日志的三種方式

評論