<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è) > 嵌入式系統 > 設計應用 > 實(shí)時(shí)多任務(wù)系統µC/OS-Ⅱ在DSP上的移植

實(shí)時(shí)多任務(wù)系統µC/OS-Ⅱ在DSP上的移植

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

2.2 移植OS_CPU_C.H文件

μC/OS-Ⅱ的移植范例要求編寫(xiě)10個(gè)簡(jiǎn)單的C函數,但是真正必要的函數是OSTaskStkInit(),其他9個(gè)函數必須申明,但并不一定要包含任何代碼。OSTaskStkInit()主要是對任務(wù)堆棧的初始化。的堆棧與一般微處理器的堆棧不同,一般微處理器的堆棧由編程定義一塊內存作為堆棧比較靈活,而的堆棧,是在CPU內有8級深度的硬件堆棧,因此任務(wù)堆棧的初始化與一般微處理器的堆棧初始化不同。芯片本身的堆棧(以下簡(jiǎn)稱(chēng)US)只有8級,無(wú)法作為系統的堆棧使用,所以CCS編譯器將CPU內部的兩個(gè)寄存器AR0和AR1保留,AR1作為堆棧指針,AR0用作堆棧中臨時(shí)變量指針FP。編譯器將函數或中斷壓進(jìn)US的返回地址,彈出放在SP(AR1)指向的堆棧中,并保存CPU 的工作環(huán)境,不同的是函數只保存程序要用到的寄存器,中斷要調用I$$SAVE子程序,保存CPU所有的寄存器,返回時(shí)調用I$$REST子程序,恢復 I$$SAVE和I$$REST兩個(gè)函數是μC/OS-Ⅱ移植到上的基礎,一定要很清楚后才能夠成功移植 OSTaskStkInit()函數。

2.3 移植OS_CPU_C.H文件

需要在該文件中編寫(xiě)4個(gè)匯編語(yǔ)言函數:(1)OSStartHighRdy():這是系統完成初始化后啟動(dòng)多任務(wù)運行時(shí)要調用的函數,主要功能是:將OSRunning標志置為T(mén)RUE,然后獲取已建立的優(yōu)先級最高任務(wù)的堆棧指針,并從其堆棧中恢復處理器寄存器,最后執行返回指令返回上述任務(wù)中運行該任務(wù)。(2)OSCtxSw():在本移植中,任務(wù)級任務(wù)切換用軟中斷intr31實(shí)現,OSCtxSw()即為該中斷的中斷服務(wù)程序。它先要將當前處理器寄存器壓入當前任務(wù)的堆棧中,將當前堆棧指針保存到當前任務(wù)的任務(wù)控制塊中;然后用與OSStartHighRdy()相類(lèi)似的方法運行當前處于就緒態(tài)中優(yōu)先級最高的任務(wù)。(3)OSIntCtxSw():該函數被OSIntExit()函數調用,用于在ISR中進(jìn)行任務(wù)切換。它與OSCtxSw() 的區別在于無(wú)需對當前任務(wù)的工作現場(chǎng)進(jìn)行保存,因為這一工作在進(jìn)入ISR之時(shí)已經(jīng)做了。(4)OSTickISR():用定時(shí)器產(chǎn)生一個(gè)周期為恒定值的時(shí)鐘源提供給μC/OS-Ⅱ,這是μC/OS-Ⅱ時(shí)間延遲和超時(shí)功能的時(shí)間基準。OSTickISR()是該定時(shí)器周期中斷的中斷服務(wù)程序。它主要有兩個(gè)功能:一個(gè)是調用OSTimeTick()函數,計算自系統上電以來(lái)所經(jīng)歷的時(shí)鐘節拍數,并將每個(gè)處于延時(shí)等待狀態(tài)任務(wù)的OSTCBDIy項減1;另一個(gè)是調用OSIntExit()函數查看是否有更高優(yōu)先級的任務(wù)因時(shí)鐘節拍到來(lái)而延遲時(shí)間到并進(jìn)入就緒態(tài),如果有,則進(jìn)行中斷級的任務(wù)切換。另外,在該函數的入口處要將OSIntNesting加1;在出口處將OSIntNesting減1。其中堆棧的構造,采用了系統庫函數I$$SAVE和I$$RSET函數來(lái)保護/恢復現場(chǎng)、保護/恢復任務(wù)棧。時(shí)鐘節拍TICK中斷由實(shí)時(shí)時(shí)鐘完成,但是2407A中沒(méi)有此定時(shí)器,移植是采用T1的周期中斷來(lái)實(shí)現的,時(shí)鐘頻率為10M,4倍頻后CPU時(shí)鐘為40M。系統初始化代碼如下。

ldp #00e0h ;指向第224頁(yè)(0x7000~0x707F)

splk #00e8h,WDCR ;不使能看門(mén)狗

splk #080feh,SCSR1 ;時(shí)鐘4倍頻

ldp #DP_EVA ;指向第232頁(yè)(0x7400~0x747F)

splk #080h,EVAIMRA ;通用定時(shí)器1 周期中斷使能

splk #0ffffh,EVAIFRA ;清中斷標志 ;

splk #0,GPTCONA ;無(wú)控制操作

splk #4E20h,T1PER ; 定時(shí)器計數使能 ,周期為20000

splk #0,T1CNT ; 計數初值清0

splk #080Ch,T1CON ;TMODE=01 連續增/減計數模式,計數時(shí)鐘不分頻

必須在最高優(yōu)先級任務(wù)中開(kāi)啟定時(shí)器,系統在優(yōu)先級為0的任務(wù)里開(kāi)啟T1。為提高系統的實(shí)時(shí)性,設置T1每500us(20000/40M)產(chǎn)生一次T1周期中斷,即TICK為500us,μC/OS-Ⅱ每500us做一次任務(wù)調度。

3. 移植代碼測試

CCS是一個(gè)強大的集成開(kāi)發(fā)環(huán)境,帶有源碼級的調試工具,按照Jean J.Labrosse推薦的移植代碼測試方法和步驟很快完成了函數OSTaskStkInit()、函數OSStartHighRdy()、函數 OSCtxSw()、OSIntCtxSw()和OSTickISR()函數的驗證工作。證實(shí)了移植代碼是能正常工作的。為進(jìn)一步測試其可靠性,又另外創(chuàng )建了15個(gè)任務(wù),并用上了μC/OS-Ⅱ的信號量和郵箱同步機制,在每個(gè)任務(wù)里加上不同的發(fā)光二極管,經(jīng)測試其實(shí)時(shí)性和穩定性都很好優(yōu)異。

4. 任務(wù)調度過(guò)程中問(wèn)題及解決

是即當一個(gè)高優(yōu)先級任務(wù)通過(guò)信號量機制訪(fǎng)問(wèn)共享資源時(shí),該信號量已被一低優(yōu)先級任務(wù)占有,而這個(gè)低優(yōu)先級任務(wù)在訪(fǎng)問(wèn)共享資源時(shí)可能又被其它一些中等優(yōu)先級的任務(wù)搶先,因此造成高優(yōu)先級任務(wù)被許多具有較低優(yōu)先級的任務(wù)阻塞,實(shí)時(shí)性難以得到保證。解決問(wèn)題有優(yōu)先級天花板和優(yōu)先級繼承兩種辦法。優(yōu)先級天花板是當任務(wù)申請某資源時(shí),把該任務(wù)的優(yōu)先級提升到可訪(fǎng)問(wèn)這個(gè)資源的所有任務(wù)中的最高優(yōu)先級,這個(gè)優(yōu)先級稱(chēng)為該資源的優(yōu)先級天花板。這種方法簡(jiǎn)單易行,不必進(jìn)行復雜的判斷,不管任務(wù)是否阻塞了高優(yōu)先級任務(wù)的運行,只要任務(wù)訪(fǎng)問(wèn)共享資源都會(huì )提升任務(wù)的優(yōu)先級。在μC/OS-Ⅱ中,可以通過(guò) OSTaskChangePrio()改變任務(wù)的優(yōu)先級,但是改變任務(wù)的優(yōu)先級是很花時(shí)間的。如果不發(fā)生優(yōu)先級翻轉而提升了任務(wù)的優(yōu)先級,釋放資源后又改回原優(yōu)先級,則無(wú)形中浪費了許多CPU時(shí)間,也影響了系統的實(shí)時(shí)性。優(yōu)先級繼承是當任務(wù)A申請共享資源S時(shí),如果S正在被任務(wù)C使用,通過(guò)比較任務(wù)C與自身的優(yōu)先級,如發(fā)現任務(wù)C的優(yōu)先級小于自身的優(yōu)先級,則將任務(wù)C的優(yōu)先級提升到自身的優(yōu)先級,任務(wù)C釋放資源S后,再恢復任務(wù)C的原優(yōu)先級。這種方法只在占有資源的低優(yōu)先級任務(wù)阻塞了高優(yōu)先級任務(wù)時(shí)才動(dòng)態(tài)的改變任務(wù)的優(yōu)先級,如果過(guò)程較復雜,則需要進(jìn)行判斷。μC/OS-Ⅱ不支持優(yōu)先級繼承,而且其以任務(wù)的優(yōu)先級作為任務(wù)標識,每個(gè)優(yōu)先級只能有一個(gè)任務(wù),因此,不適宜在應用程序中使用優(yōu)先級繼承。

在μC/OS-Ⅱ中,為解決優(yōu)先級翻轉影響任務(wù)實(shí)時(shí)性的問(wèn)題,可以借鑒優(yōu)先級繼承的方法對優(yōu)先級天花板方法進(jìn)行改進(jìn)。對μC/OS-Ⅱ的使用,共享資源任務(wù)的優(yōu)先級不是全部提升,而是先判斷再決定是否提升。即當有任務(wù)A申請共享資源S時(shí),首先判斷是否有別的的任務(wù)正在占用資源S,若無(wú),則任務(wù)A繼續執行,若有,假設為任務(wù)B正在使用該資源,

則判斷任務(wù)B的優(yōu)先級是否低于任務(wù)A,若高于任務(wù)A,則任務(wù)A掛起,等待任務(wù)B釋放該資源,如果任務(wù)B的優(yōu)先級低于任務(wù)A,則提升任務(wù)B的優(yōu)先級到該資源的優(yōu)先級天花板,當任務(wù)B釋放資源后,再恢復到原優(yōu)先級。在μC/OS-Ⅱ中,每個(gè)共享資源都可看作一個(gè)事件,每個(gè)事件都有相應的事件控制塊 ECB。在ECB中包含一個(gè)等待本事件的等待任務(wù)列表,該列表包括OSEventTbl[]和OSEventGrp兩個(gè)域,通過(guò)對等待任務(wù)列表的判斷可以很容易地確定是否有多個(gè)任務(wù)在等待該資源,同時(shí)也可判斷任務(wù)的優(yōu)先級與當前任務(wù)優(yōu)先級的高低,從而決定是否需要用 OSTaskChangePio()來(lái)改變任務(wù)的優(yōu)先級。這樣,僅在優(yōu)先級有可能發(fā)生翻轉的情況下才改變任務(wù)的優(yōu)先級,而且利用事件的等待任務(wù)列表進(jìn)行判斷,比用OSTaskChangePio()來(lái)改變任務(wù)的優(yōu)先級速度快,并占用較少的CPU時(shí)間,有利于系統實(shí)時(shí)性的提高。

參考文獻:

[1]鄔可軍,朱銘鋯等.DSP實(shí)時(shí)多任務(wù)設計與實(shí)現[M]. 北京:電子工業(yè)出版社, 2005.

[2]鐘堅文,蔡旭.基于μC/OS-II的CAN總線(xiàn)驅動(dòng)程序設計[J].微計算機信息,2005,7-2:35-37.

[3]Jean J.Labrosse著(zhù).邵貝貝等譯.嵌入式實(shí)時(shí)μC/OS-Ⅱ[M]第2版.北京,北京航空航天大學(xué)出版社,2003.5

[4]劉和平,王維俊等. TMS320LF240X DSP C語(yǔ)言開(kāi)發(fā)應用[M]. 北京:北京航空航天大學(xué)出版社, 2003.

[5]TI.Code Composer User's Guide.SPRU509C.pdf

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(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>