Cortex-M3內核的μC/OSII性能研究
引言
本文引用地址:http://dyxdggzs.com/article/149278.htmμC/OSII是基于優(yōu)先級的可剝奪型內核,系統中的所有任務(wù)都有一個(gè)唯一的優(yōu)先級別,它適合應用在實(shí)時(shí)性要求較強的場(chǎng)合;但是它不區分用戶(hù)空間和系統空間,使系統的安全性變差。而移植到CortexM3內核上的μC/OSII系統一般是運行在特權級下,以至于應用程序也可以訪(fǎng)問(wèn)操作系統的變量和常量,這樣使得系統的安全性與穩定性變得更差。
根據CortexM3內核的特點(diǎn),對μC/OSII操作系統的安全性和穩定性進(jìn)行研究。利用CortexM3內核上選配的MPU(Memory ProtectiON Unit,存儲器保護單元),對μC/OSII操作系統做適當的改進(jìn)與優(yōu)化。經(jīng)測試,系統的安全性與穩定性得到很大的提高。
1 開(kāi)發(fā)壞境
采用IAR5.30作為開(kāi)發(fā)環(huán)境,移植μC/OSII2.86到CortexM3內核,選用配置了MPU(Memory Protection Unit,存儲器保護單元)的LPC1786處理器作為硬件實(shí)驗平臺,對操作系統的安全性和穩定性進(jìn)行改進(jìn)與優(yōu)化。
2 CortexM3內核簡(jiǎn)介
在CortexM3內核*有兩個(gè)堆棧指針:主堆棧指針(MSP),是系統上電后缺省的堆棧指針,它由OS內核、異常服務(wù)例程以及所有需要特權訪(fǎng)問(wèn)的應用程序代碼來(lái)使用;進(jìn)程堆棧指針(PSP),用于常規的應用程序代碼(不處于異常服務(wù)例程中時(shí))。
CortexM3處理器支持線(xiàn)程模式和處理模式兩種工作模式,有特權級與用戶(hù)級兩個(gè)訪(fǎng)問(wèn)等級。異常處理總是工作在處理模式,只可使用主堆棧指針。處理模式總是在特權級下運行,而線(xiàn)程模式可在特權和用戶(hù)級下運行。系統復位時(shí)總是處于線(xiàn)程模式的特權方式下,并且默認使用的堆棧指針是MSP。在用戶(hù)級下,對特殊功能寄存器和系統控制空間(SCS)的大部分寄存器的訪(fǎng)問(wèn)是禁止的[2]。
經(jīng)實(shí)驗驗證,在用戶(hù)級下使用MSR、MRS指令訪(fǎng)問(wèn)特殊功能寄存器(CONTROL等),這些指令被當作NOP指令(空指令)執行,而對系統控制空間(SCS)寄存器訪(fǎng)問(wèn)會(huì )產(chǎn)生精確的總線(xiàn)訪(fǎng)問(wèn)異常。
另外,CortexM3內核還可以選配MPU(如LPC1700系列、LM3S系列處理器),用于對存儲器進(jìn)行保護。設定一塊內存的訪(fǎng)問(wèn)權限,對系統的安全性有很好的幫助。
3 μC/OSII內核簡(jiǎn)介
μC/OSII是一個(gè)可移植、可固化、可裁剪的搶占式實(shí)時(shí)多任務(wù)內核。大部分用ANSI C語(yǔ)言編寫(xiě),只有一小部分與硬件相關(guān)的代碼用匯編語(yǔ)言編寫(xiě)。至今,μC/OSII已經(jīng)在40多種不同架構的微內核處理器上移植成功[4]。μC/OSII內核只提供了任務(wù)調度、任務(wù)管理、時(shí)間管理和任務(wù)間通信等基本功能,體系結構如圖1所示。進(jìn)行系統移植時(shí),只需要修改OS_CPU_C.C、OS_CPU.H、OS_CPU_A.ASM這3個(gè)文件即可。
圖1 μC/OSII體系結構
4 μC/OSII操作系統移植的改進(jìn)
μC/OSII*****提供的基于CortexM3內核移植的μC/OSII系統一直工作在特權級下。這樣做的好處是,系統不用頻繁地切換訪(fǎng)問(wèn)等級,而且開(kāi)關(guān)中斷很快,利于實(shí)時(shí)性的實(shí)現;但是應用程序(用戶(hù)任務(wù))也可以訪(fǎng)問(wèn)特殊功能寄存器和系統控制空間(SCS)寄存器,修改操作系統的變量,這對系統的安全性是一種威脅,如果用戶(hù)任務(wù)程序跑飛,那就有可能破壞系統寄存器和變量[5]。
4.1 系統寄存器的設置
用戶(hù)應用程序運行在用戶(hù)級,使用PSP堆棧指針;操作系統函數運行在特權級,使用的也是PSP堆棧指針;而中斷服務(wù)例程運行在處理模式的特權方式下,使用MSP堆棧指針。
圖2 特權與用戶(hù)級分區
首先利用MPU把內存分為特權級訪(fǎng)問(wèn)和用戶(hù)級訪(fǎng)問(wèn)兩個(gè)區,如圖2所示。在系統初始化時(shí),設置MPU相關(guān)寄存器,為系統分配任務(wù)堆棧與主堆棧:任務(wù)堆棧分配在用戶(hù)區,系統變量與主堆棧分配在特權區,只可特權級下訪(fǎng)問(wèn)。
4.2 系統函數的修改
用戶(hù)任務(wù)工作在用戶(hù)級下,操作系統函數工作在特權級下,任務(wù)可能會(huì )在執行系統函數時(shí)執行上下文切換,因此系統要記錄任務(wù)切換時(shí)是處在特權級還是用戶(hù)級下,以便任務(wù)再次獲得處理器控制權時(shí),切換到原先的訪(fǎng)問(wèn)等級下。在任務(wù)創(chuàng )建時(shí),加入訪(fǎng)問(wèn)權限參數mode。
權限的值定義為:
#define OS_Mode_USER 1u //用戶(hù)級
#define OS_Mode_PRIVILEGE 0u //特權級
在創(chuàng )建任務(wù)函數與堆棧初始函數的參數中加入訪(fǎng)問(wèn)權限參數,形式如下:
INT8U OSTaskCreateExt (……,INT8U mode );
OS_STK *OSTaskStkInit (……,INT8U mode);
在堆棧初始化時(shí),把mode最后存到堆棧當中,以便任務(wù)第一次運行時(shí)進(jìn)入相應的工作模式(特權級或用戶(hù)級)。統計任務(wù)和空閑任務(wù)的mode是OS_Mode_PRIVILEGE,而用戶(hù)任務(wù)為OS_Mode_USER。
4.3 OS_CPU_A.ASM文件中函數的修改
在OS_CPU_A.ASM文件中,只需修改函數PendSV_Handler(PendSV服務(wù)例程),任務(wù)切換是由它來(lái)完成的。同時(shí),設置PendSV的優(yōu)先級為最低,以便快速響應中斷,提高系統的實(shí)時(shí)性。PendSV服務(wù)例程的流程如圖3所示。
圖3 PendSV服務(wù)例程流程
任務(wù)切換上文的程序:
SUBS R0,R0,#0x24;調整PSP指針,mode、R4~R11共36字節
MRS R1,CONTROL;獲取當前任務(wù)的訪(fǎng)問(wèn)等級mode
STM R0,{R1,R4R11};壓棧mode,R4~R11
評論