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