<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 有效利用RTOS編程概念支持先進(jìn)的多線(xiàn)程架構

有效利用RTOS編程概念支持先進(jìn)的多線(xiàn)程架構

作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò ) 收藏

像MIPS技術(shù)公司最新的MIPS32 34K內核這樣的架構正吸引著(zhù)越來(lái)越多的關(guān)注,這是因為這種架構無(wú)需增加太多的芯片資源或功耗即可獲得可觀(guān)的性能增益。這種硬件的關(guān)鍵優(yōu)勢是,它能使用處理器在等待緩沖回填的空閑周期處理其它線(xiàn)程的指令。

使消費類(lèi)設備應用程序適應環(huán)境的代價(jià)一般很小,因為大多數程序已經(jīng)設計為成組的半獨立線(xiàn)程。應用程序線(xiàn)程可以分配給處理器中用于處理單線(xiàn)程的專(zhuān)用硬件資源。多個(gè)線(xiàn)程可以被同時(shí)分配給這樣的硬件,并通過(guò)共享CPU周期獲得最大的效率。

嵌入式運算面臨性能障礙

消費類(lèi)設備和其它嵌入式計算產(chǎn)品的制造商正在增加Wi-Fi、VoIP、藍牙、視頻等各種新的功能,以往功能的增加都要靠大幅提升處理器的時(shí)鐘速度來(lái)實(shí)現。臺式機的時(shí)鐘速度目前已經(jīng)增加到3GHz以上,即使嵌入式設備也接近GHz級。

但在嵌入式應用領(lǐng)域,這種方法很快就失去了可行性,因為大多數設備的運行收到功耗和資源的約束,這些都限制了處理器速度的進(jìn)一步提高。時(shí)鐘周期速度的提高將顯著(zhù)地增大功耗,因此對越來(lái)越多的嵌入式設備來(lái)說(shuō)高周期速度將不大可行。另外,處理器速度的進(jìn)一步提高并不能帶來(lái)相應的性能改善,因為存儲器性能的提高跟不上處理器速度提高的步伐,如上圖1所示。

處理器速度已經(jīng)比存儲器快很多,在許多應用場(chǎng)合處理器有一半以上的時(shí)間在等待緩存行(cache line)回填數據。每當緩存丟失(cache miss)或需要片外存儲器訪(fǎng)問(wèn)時(shí),處理器就需要從存儲器加載緩存行,將這些字寫(xiě)進(jìn)緩存,再將舊的緩存行寫(xiě)進(jìn)存儲器,最后恢復線(xiàn)程。

MIPS公司指出,每千條指令接受25次緩存丟失(對多媒體代碼來(lái)說(shuō)是一個(gè)合理的值)的高端可綜合內核如果必須等待50個(gè)緩存填充周期,那么將有50%以上的時(shí)間處于停止狀態(tài)。由于處理器速度仍在不斷提高,而且比存儲器速度的提高幅度大得多,這類(lèi)問(wèn)題將變得越來(lái)越突出。

本文引用地址:http://dyxdggzs.com/article/201706/348601.htm


圖1:處理器速度超過(guò)存儲器。

多線(xiàn)程技術(shù)

多線(xiàn)程技術(shù)解決了這一難題,它可以利用處理器原本用于等待存儲器訪(fǎng)問(wèn)的空閑時(shí)間處理多個(gè)并行程序執行線(xiàn)程。當一個(gè)線(xiàn)程停下來(lái)等待存儲器響應時(shí),另外一個(gè)線(xiàn)程會(huì )馬上提交給處理器,從而保持運算資源的充分利用。

值得注意的是,傳統處理器不能采用這種方法,因為它需要大量指令周期才能完成線(xiàn)程之間的切換。要想使這種方法順利工作,多個(gè)應用程序線(xiàn)程必須立即有效,并能逐周期運行。

34K處理器是來(lái)自面向消費類(lèi)設備市場(chǎng)的嵌入式處理器主要提供商的首個(gè)多線(xiàn)程產(chǎn)品。每個(gè)軟件線(xiàn)程在線(xiàn)程環(huán)境(Thread Context, TC)上執行,一個(gè)TC包括一整套通用寄存器和一個(gè)程序計數器(program counter)。

每個(gè)TC都有自己的指令預取隊列,所有隊列都完全獨立。這意味著(zhù)內核能在線(xiàn)程間逐周期地進(jìn)行切換,因此可以避免軟件中產(chǎn)生開(kāi)銷(xiāo)。增加更多的TC只需增加很少的額外硅片。TC共享大部分CPU硬件,包括執行單元、ALU和緩存。而且,增加一個(gè)TC并不要求CPU擁有另外一個(gè)OS軟件運行CPU所需的CP0寄存器拷貝。

一組共享CP0寄存器以及與之相關(guān)的TC即組成一個(gè)虛擬處理單元(VPE)。一個(gè)TC運行一個(gè)線(xiàn)程,一個(gè)VPE管理一個(gè)操作系統:如果有兩個(gè)VPE,那么就可以有兩個(gè)獨立的操作系統,或一個(gè)SMP風(fēng)格的操作系統。帶一個(gè)TC的VPE看起來(lái)就像是傳統的MIPS32架構CPU,并且完全兼容MIPS架構規范-其實(shí)就是一個(gè)完整的虛擬處理器。

34K內核最多可以有9個(gè)TC和2個(gè)VPE。TC到VPE的聯(lián)系取決于運行時(shí)間。默認情況下所有準備執行的TC都平等分享處理時(shí)間,但34K內核也能在某個(gè)特殊要求線(xiàn)程可能會(huì )“挨餓”的情況下讓某個(gè)程序影響線(xiàn)程調度,也就是說(shuō)軟件可以控制每個(gè)線(xiàn)程的服務(wù)質(zhì)量(QoS)。應用軟件與硬件策略管理器(Policy Manager)互動(dòng),策略管理器向各個(gè)TC分配動(dòng)態(tài)改變的優(yōu)先級。然后由硬件分發(fā)調度器將線(xiàn)程逐個(gè)周期地分配給執行單元,從而滿(mǎn)足QoS要求。

在像34K這樣的多線(xiàn)程環(huán)境中,性能可以大大地提高,因為只要一個(gè)線(xiàn)程處于等待存儲器訪(fǎng)問(wèn)狀態(tài),另外一個(gè)線(xiàn)程就會(huì )占用空閑下來(lái)的處理器周期。上圖2表明了多線(xiàn)程是如何加快程序執行速度的。當只有線(xiàn)程0運行時(shí),13個(gè)處理器周期中只有5個(gè)用于指令執行,剩下7個(gè)全部在等待緩存行的回填。在這種使用傳統處理方式的情況下效率只有38%。


圖2:多線(xiàn)程提高了管線(xiàn)效率。

增加線(xiàn)程1就可能使用上述5個(gè)用于等待的處理器周期?,F在13個(gè)處理器周期中用到了10個(gè),效率提高到77%,與最基本情況相比速度加快了一倍。增加線(xiàn)程2后可以完全加載處理器資源,13個(gè)執行指令周期可以全部用上,效率達到100%。相比基本情況速度提高263%。

采用EEMBC性能基準的測試表明,34K內核與24KE系列產(chǎn)品相比,只用兩個(gè)線(xiàn)程就可以提速60%,而硅片尺寸只增加14%,如圖3所示。


圖3:EEMBC基準性能例子表明只用兩個(gè)線(xiàn)程性能就有60%的提高。

使軟件適應多線(xiàn)程

多線(xiàn)程方法的關(guān)鍵優(yōu)勢是在大多數情況下現有軟件只需做極少量的修改就能順利運行。大多數消費類(lèi)設備程序已經(jīng)寫(xiě)成一系列的半獨立線(xiàn)程。每個(gè)線(xiàn)程可以被自動(dòng)或人工地分配給專(zhuān)門(mén)的硬件TC。

如果當前正在執行的線(xiàn)程由于緩存丟失或其它原因引起的時(shí)延而無(wú)法繼續運行,CPU執行機制就會(huì )從那個(gè)TC切換到另外一個(gè)TC,該TC的線(xiàn)程可以在不浪費CPU周期的情況下運行。程序中線(xiàn)程越多,利用等待存儲器訪(fǎng)問(wèn)周期的可能性就越高。

多線(xiàn)程處理對使用或考慮使用的任何人來(lái)說(shuō)都是非常理想的,因為程序本身就具有多線(xiàn)程特性。無(wú)需為多線(xiàn)程重新編寫(xiě)程序,因為RTOS可以在程序控制下自動(dòng)將程序線(xiàn)程映射為T(mén)C,其映射方式與將線(xiàn)程映射為傳統處理器的方式相同。

如果線(xiàn)程數比TC多,通常需要用到傳統的環(huán)境切換(context switch)。這些環(huán)境切換與傳統處理器中的是一樣的。RTOS保存當前任務(wù)的狀態(tài),加載另外一個(gè)任務(wù)的環(huán)境并開(kāi)始執行。多線(xiàn)程環(huán)境顯然要比傳統處理器更適合更多環(huán)境的切換,所實(shí)現的環(huán)境切換速度也更快。

Linux/Windows與RTOS的多線(xiàn)程比較

本節重點(diǎn)介紹相對Linux和嵌入式Windows版本等操作系統而言快速RTOS的優(yōu)勢。Linux的典型實(shí)時(shí)性能在數百微秒到數毫秒。但在最壞情況下Linux實(shí)時(shí)性能并不理想。而快速RTOS可以提供確定的實(shí)時(shí)性能,在單線(xiàn)程處理器上可以達1到2毫秒,在多線(xiàn)程處理器上還會(huì )更快。


圖4:將線(xiàn)程映射為T(mén)C

RTOS將唯一資源分配給唯一的TC。傳統的做法是將單浮點(diǎn)單元(FPU)分配給TC0。任何執行硬件級浮點(diǎn)運算的線(xiàn)程都需要被映射為T(mén)C0,因此所有這類(lèi)線(xiàn)程必須共享TC0。這就形成了多種有趣的編程選擇,特別是用硬件還是軟件實(shí)現浮點(diǎn)運算的選擇。

用硬件實(shí)現浮點(diǎn)運算顯然速度會(huì )更快,但另一方面需要共享FPU。如果線(xiàn)程只做少量的浮點(diǎn)運算,那么用軟件實(shí)現將更有意義,而需要密集浮點(diǎn)運算的線(xiàn)程通常要用硬件實(shí)現,并被映射到TC0。值得注意的是,這個(gè)修改不需要記錄,因為是否用硬件或軟件浮點(diǎn)實(shí)現的決定可以由編譯器切換實(shí)現。

給線(xiàn)程分配權重

如果程序沒(méi)有給各個(gè)線(xiàn)程定義權重,那么程序調度器就會(huì )給所有線(xiàn)程分配相同的權重,另外也可以使用時(shí)間分段技術(shù)使線(xiàn)程依據用戶(hù)指定的權重共享CPU周期。分配權重相當于將適當比例的CPU周期分配給各個(gè)具體線(xiàn)程。線(xiàn)程權重由RTOS透明地映射為硬件TC。

一些現有程序是針對傳統處理器設計的,其前提條件是假設在有高優(yōu)先級的線(xiàn)程準備好時(shí)低優(yōu)先級線(xiàn)程將被禁止運行。在嵌入式編程環(huán)境中,準備好的意思是線(xiàn)程運行所必需的全部條件都得到了滿(mǎn)足,阻止它運行的唯一因素是它的優(yōu)先級。

多線(xiàn)程可破壞這種條件,因為無(wú)論高優(yōu)先級線(xiàn)程是否停止,低優(yōu)先級線(xiàn)程都能運行。編寫(xiě)取消這種狀態(tài)的代碼可優(yōu)化性能。

另外一方面,根據這種條件編寫(xiě)的現有代碼無(wú)需修改就能運行在多線(xiàn)程處理器上,只需簡(jiǎn)單地設置操作系統開(kāi)關(guān),使其只允許相同優(yōu)先級的線(xiàn)程同時(shí)被加載到TC。在設置這個(gè)開(kāi)關(guān)時(shí),需要確保給那些能夠并行運行的線(xiàn)程盡量分配相同的優(yōu)先級。

可中斷的重要性

在傳統的嵌入式應用中中斷是非常重要的,因為它們提供了主要的、在許多情況下也是唯一的線(xiàn)程間切換方式。中斷在多線(xiàn)程應用中也起著(zhù)相同的作用,但有一個(gè)重要的區別,即在多線(xiàn)程應用中,線(xiàn)程間的切換不僅要通過(guò)中斷,還要使用空閑CPU周期。

需要盡量避免在修改關(guān)鍵數據結構時(shí)中斷某個(gè)線(xiàn)程,同時(shí)起用另外一個(gè)線(xiàn)程對同一結構作其它修改。這將導致數據結構處于不一致的狀態(tài),極易引起災難性后果。

大多數傳統應用解決這個(gè)問(wèn)題的方法是,當ISR或系統服務(wù)正在修改RTOS中關(guān)鍵的數據結構時(shí)暫時(shí)鎖住中斷。這種方法可靠地阻止了任何其它程序跳進(jìn)來(lái)對執行代碼正在使用的關(guān)鍵區域做出不恰當的修改。

然而在多線(xiàn)程環(huán)境中這種方法是不夠的,因為有可能被切換到不受中斷鎖定控制的不同TC,從而可能對關(guān)鍵區域做出修改。該問(wèn)題可以利用34K架構中的DMT指令解決,當數據結構在修改狀態(tài)時(shí)可禁止多線(xiàn)程功能。

除了這些相對簡(jiǎn)單的例外情況外,設備代碼在從傳統設備移植到多線(xiàn)程設備時(shí)無(wú)需修改就能直接運行。因此,我們能夠利用以往被傳統RISC處理器浪費的CPU周期,充分發(fā)揮多線(xiàn)程性能優(yōu)勢。多線(xiàn)程可以滿(mǎn)足當前和未來(lái)需要高性能的消費類(lèi)、網(wǎng)絡(luò )、存儲和工業(yè)設備應用要求,而成本和功耗只有少許的增加。

與主要的競爭技術(shù)--多內核技術(shù)相比,多線(xiàn)程有更小的硅片面積和更低功耗的優(yōu)勢,而且編程簡(jiǎn)單,現有程序只需做少量修改甚至不用修改就能運行。多內核方法也有它自己的優(yōu)勢和強項,因此沒(méi)有理由證明這兩種方法不能融合出一種最佳方法。在要求高性能、低成本和最小功耗的應用場(chǎng)合,多線(xiàn)程是一種極具競爭力的方案。

作者:

John A. Carbone

產(chǎn)品行銷(xiāo)副總裁

Express Logic公司



關(guān)鍵詞: 多線(xiàn)程 RTOS

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>