重要的是應(yīng)當(dāng)區(qū)分實時系統(tǒng)和實時 OS (RTOS)。實時系統(tǒng)由滿足系統(tǒng)要求所需的所有元素(硬件、OS 和應(yīng)用程序)組成。RTOS 只是完整的實時系統(tǒng)的一個元素,它必須提供足夠的功能,才能使全部實時系統(tǒng)能夠滿足它的要求。
盡管以前的 Windows CE 版本提供了某些 RTOS 功能,但自從 Windows CE 3.0 以后很多重要的內(nèi)核更改極大地增強了實時性能。Windows CE .NET 內(nèi)核包含了與 Windows CE 3.0 相同的實時增強功能,除此之外還有某些額外的功能。本文描述了作為 Windows CE .NET 及其以前版本的組成部分的以下更改:
Windows CE .NET 對 x86 平臺添加了通過 OEM 定義的變量指定頁面池大小的功能。
Windows CE 3.0 • 增加了線程優(yōu)先級級別的數(shù)目(從 8 到 256)。
此外,本文描述了用來測試內(nèi)核實時性能的工具,并提供了在三種不同 CPU 上的實時性能測試結(jié)果。
返回頁首 對內(nèi)核的更改 內(nèi)核是 Windows CE OS 的內(nèi)部核心,它負(fù)責(zé)調(diào)度和同步線程、處理異常和中斷、加載應(yīng)用程序和治理虛擬內(nèi)存。在 Windows CE 3.0 中,為了提高性能和減少滯后時間,內(nèi)核經(jīng)歷了以下幾個更改:
Windows CE 3.0 將可用于線程的優(yōu)先級級別數(shù)從 8 增加到 256,0 是最高的優(yōu)先級,255 是最低的優(yōu)先級。Windows CE 的前一版本的優(yōu)先級級別 0 到 7 對應(yīng)于 Windows CE 3.0 中級別 248 到 255。更多的優(yōu)先級級別答應(yīng)開發(fā)人員更靈活地控制嵌入式系統(tǒng)的調(diào)度,并防止由于限制優(yōu)先級級別數(shù)使隨機應(yīng)用程序降低系統(tǒng)性能。
要指派這些新的優(yōu)先級,Windows CE 3.0 引入了兩個新函數(shù):CeSetThreadPRiority 和 CeGetThreadPriority。新函數(shù)與 Windows CE 2.12 中的 SetThreadPriority 和 GetThreadPriority 函數(shù)看起來完全相同,不過新函數(shù)接受的數(shù)字范圍是 0 到 255。
更多地控制時間和調(diào)度 Windows CE 3.0 已經(jīng)改進了計時器性能,計時器和休眠函數(shù)調(diào)用的精度達(dá)到了一毫秒,并且應(yīng)用程序可以為每個線程設(shè)置時間片。
計時器(或系統(tǒng)時鐘)是一種速率,由 OS 以此速率生成計時器中斷并對其提供服務(wù)。以前,計時器也是線程時間片,是線程沒有被搶占的情況下可以在系統(tǒng)中運行的最長時間。在 Windows CE 3.0 中,計時器不再直接與線程時間片相關(guān)。
以前,OEM 將計時器和時間片作為 OEM 適配層 (OAL) 中的常量設(shè)置為大約 25 毫秒。計時器觸發(fā)時,假如一個線程已做好預(yù)備,內(nèi)核會調(diào)度此新的線程。在 Windows CE 3.0 中,計時器總是設(shè)置為一毫秒,并且可以對每個線程設(shè)置時間片。
線程時間片 在 Windows CE 3.0 中,線程時間片很靈活,足以使應(yīng)用程序能夠逐個線程地設(shè)置時間片。這就讓開發(fā)人員可以改編計劃程序,以滿足應(yīng)用程序的當(dāng)前需要。為了調(diào)整時間片,已經(jīng)添加了兩個新函數(shù):CeGetThreadQuantum 和 CeSetThreadQuantum。這項更改使應(yīng)用程序能夠基于線程完成任務(wù)所需要的時間量來設(shè)置線程的時間片。通過將任何線程的線程時間片設(shè)置為零,循環(huán)調(diào)度算法可以變?yōu)椤斑\行到完成”算法。只有較高優(yōu)先級的線程或硬件中斷才能先于設(shè)置為運行到完成的線程執(zhí)行。
更改處理優(yōu)先級倒置的方法 為了有助于縮短響應(yīng)時間,Windows CE 3.0 更改了它的優(yōu)先級倒置方法,當(dāng)?shù)蛢?yōu)先級線程擁有一個較高優(yōu)先級線程所需要的內(nèi)核對象時,就會發(fā)生優(yōu)先級倒置。Windows CE 使用優(yōu)先級繼續(xù)來處理優(yōu)先級倒置,這時,被阻塞的、擁有較高優(yōu)先級線程所需要的內(nèi)核對象的線程將繼續(xù)更高的優(yōu)先級。優(yōu)先級倒置使較低優(yōu)先級線程能夠運行,并釋放資源供較高優(yōu)先級的線程使用。以前,內(nèi)核處理整個倒置鏈。從 Windows CE 3.0 開始,內(nèi)核保證只處理優(yōu)先級倒置到一個級別的深度。
優(yōu)先級倒置有兩個基本示例。第一個是簡單的情況,這種情況下,對優(yōu)先級倒置的處理從 Windows CE 2.12 到 Windows CE 3.0 沒有變化。例如,在有三個處于運行狀態(tài)的線程時,可以看見這種情況。線程 A 的優(yōu)先級是 1,線程 B 和 C 優(yōu)先級較低。假如線程 A 正在運行,并且因為線程 B 擁有線程 A 需要的內(nèi)核對象而使 A 被阻塞,那么線程 B 的優(yōu)先級會提高到 A 的優(yōu)先級級別,以便答應(yīng)線程 B 運行。然后,假如因為線程 C 擁有線程 B 需要的內(nèi)核對象而使線程 B 被阻塞,則線程 C 的優(yōu)先級會提高到 A 的優(yōu)先級級別,以便答應(yīng)線程 C 也能運行。
第二個并且是更有趣的情況是,線程 A 可以以比 B 和 C 更高的優(yōu)先級運行,線程 B 擁有 A 需要的內(nèi)核對象,線程 B 被阻塞,等待 C 釋放它需要的內(nèi)核對象,而 C 正在運行。在 Windows CE 2.12 中,當(dāng) A 運行然后因為 B 而被阻塞時,B 和 C 的優(yōu)先級都會提高到 A 的優(yōu)先級,以便使它們能夠運行。在 Windows CE 3.0 中,當(dāng) A 因為 B 而被阻塞時,只有線程 B 的優(yōu)先級被提高。通過減少復(fù)雜性和更改算法,極大地減少和限制了 Windows CE 中最大的 KCALL。