ucosii及時操縱系統(tǒng)在嵌進式平臺上前進移植的通俗方法和技能[趣讀]_第1頁
ucosii及時操縱系統(tǒng)在嵌進式平臺上前進移植的通俗方法和技能[趣讀]_第2頁
ucosii及時操縱系統(tǒng)在嵌進式平臺上前進移植的通俗方法和技能[趣讀]_第3頁
ucosii及時操縱系統(tǒng)在嵌進式平臺上前進移植的通俗方法和技能[趣讀]_第4頁
ucosii及時操縱系統(tǒng)在嵌進式平臺上前進移植的通俗方法和技能[趣讀]_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、引言-實時操作系統(tǒng)的使用,能夠簡化嵌入式系統(tǒng)的應用開發(fā),有效地確保穩(wěn)定性和可靠性,便于維護和二次開發(fā)。C/OS-II是一個基于搶占式的實時多任務內(nèi)核,可固化、可剪裁、具有高穩(wěn)定性和可靠性,除此以外,C/OS-II的鮮明特點就是源碼公開,便于移植和維護。在C/OS-II官方的主頁上可以查找到一個比擬全面的移植范例列表。但是,在實際的開發(fā)工程中,仍然沒有針對工程所采用芯片或開發(fā)工具的適宜版本。那么,不妨自己根據(jù)需要進行移植。本文那么以在TMS320C6711 DSP上的移植過程為例,分析了C/OS-II在嵌入式開發(fā)平臺上進行移植的一般方法和技巧。C/OS-II移植的根本步驟在選定了系統(tǒng)平臺和開發(fā)工

2、具之后,進行C/OS-II的移植工作,一般需要遵循以下的幾個步驟: 深入了解所采用的系統(tǒng)核心 分析所采用的C語言開發(fā)工具的特點 編寫移植代碼 進行移植的測試 針對工程的開發(fā)平臺,封裝效勞函數(shù) 類似80x86版本的PC.C和PC.H系統(tǒng)核心無論工程所采用的系統(tǒng)核心是MCU、DSP、MPU,進行C/OS-II的移植時,所需要關注的細節(jié)都是相近的。首先,是芯片的中斷處理機制,如何開啟、屏蔽中斷,可否保存前一次中斷狀態(tài)等。還有,芯片是否有軟中斷或是陷阱指令,又是如何觸發(fā)的。此外,還需關注系統(tǒng)對于存儲器的使用機制,諸如內(nèi)存的地址空間,堆棧的增長方向,有無批量壓棧的指令等。在本例中,使用的是TMS320C

3、6711 DSP。這是TI公司6000系列中的一款浮點型號,由于其時鐘頻率非常高,且采用了超常指令字VLIW結(jié)構(gòu)、類RISC指令集、多級流水等技術,所 以運算性能相當強大,在通信設備、圖像處理、醫(yī)療儀器等方面都有著廣泛的應用。在C6711中,中斷有3種類型,即復位、不可屏蔽中斷NMI和可屏蔽中斷INT4-INT15??善帘沃袛嘤蒀SR存放器控制全局使能, 此外也可用IER存放器分別置位使能。而在C6711中并沒有軟中斷機制,所以C/OS-II的任務切換需要編寫一個專門的函數(shù)實現(xiàn)。此外,C6711也沒有專門的中斷返回指令、批量壓棧指令,所以相應的任務切換代碼均需編程完成。由于采用了類RISC核心

4、,C6711的內(nèi)核結(jié)構(gòu)中,只有A0-A15和B0-B15這兩組32bit的通用存放器。 C語言開發(fā)工具無論所使用的系統(tǒng)核心是什么,C語言開發(fā)工具對于C/OS-II是必不可少的。 最簡單的信息可以從開發(fā)工具的手冊中查找,比方:C語言各種數(shù)據(jù)類型分別編譯為多少字節(jié);是否支持嵌入式匯編,格式要求怎樣;是否支持“interrupt非標準關鍵字聲明的中斷函數(shù);是否支持匯編代碼列表(list)功能,等等。上述的這樣一些特性,會給嵌入式的開發(fā)帶來很多便利。TI的C語言開發(fā)工具CCS for C6000就包含上述的所有功能。而在此根底上,可以進一步地弄清開發(fā)工具的一些技術細節(jié),以便進行之后真正的移植工作。首先

5、,開啟C編譯器的“匯編代碼列表(list)功能,這樣編譯器就會為每個C語言源文件生成其對應的匯編代碼文件。在CCS開發(fā)環(huán)境中的方法是:在菜單“/Project/Build options的“Feedback欄中選擇“Interlisting:Opt/C and ASM(-s);或者,也可以直接在CCS的C編譯命令行中加上“-s參數(shù)。然后分別編寫幾個簡單的函數(shù)進行編譯,比擬C源代碼和編譯生成的匯編代碼。例如:void FUNC_TEMP (void) Func_tmp2(); /調(diào)用任一個函數(shù) 在CCS中編譯后生成的ASM代碼為: .asg B15, SP / 宏定義 _FUNC_TEMP: S

6、TW B3,*SP-(8) / 入棧 NOP 2 CALL _ Func_tmp2 /- MVKL BACK, B3 / 函數(shù)調(diào)用 MVKH BACK, B3 /- NOP 3 BACK: LDW *+SP(8),B3 / 出棧 NOP 4 RET B3 / 函數(shù)返回 NOP 5由此可見,在CCS編譯器的規(guī)那么中,B15存放器被用作堆棧指針,使用通用存取指令進行棧操作,而且堆棧指針必須以8字節(jié)為單位改變。此外,B3存放器被用來保存函數(shù)調(diào)用時的返回地址,在函數(shù)執(zhí)行之前需要入棧保護,直到函數(shù)返回前再出棧。當然,CCS的C編譯器對于每個通用存放器都有約定的用途,但對于C/OS-II的移植來說,了解以

7、上信息就足夠了。最后,再編寫一個用“interrupt關鍵字聲明的函數(shù):interrupt void ISR_TEMP (void) int a; a=0; 生成的ASM代碼為: _ISR_TEMP: STW B4,*SP-(8) / 入棧 NOP 2 ZERO B4 /- STW B4,*+SP(4) / a=0 NOP 2 /- B IRP / 中斷返回 LDW *+SP(8),B4 / 出棧 NOP 4 與前一段代碼相比,對于中斷函數(shù)的編譯,有兩點不同: 函數(shù)的返回地址不再使用B3存放器,相應地也無需將B3入棧。IRP存放器能自動保存中斷發(fā)生時的程序地址 編譯器會自動統(tǒng)計中斷函數(shù)所用到的

8、存放器,從而在中斷一開始將他們?nèi)咳霔1Wo例如上述程序段中,只用到了B4存放器。編寫移植代碼在深入了解了系統(tǒng)核心與開發(fā)工具的根底上,真正編寫移植代碼的工作就相比照擬簡單了。C/OS-II自身的代碼絕大局部都是用ANSI C編寫的,而且代碼的層次結(jié)構(gòu)十分干凈,與平臺相關的移植代碼僅僅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H這三個文件當中。在移植的時候,結(jié)合前面兩個步驟中已經(jīng)掌握的信息,根本上按照?嵌入式實時操作系統(tǒng)C/OS-II?一書的相關章節(jié)的指導來做就可以了。但是,由于系統(tǒng)核心、開發(fā)工具的千差萬別,在實際工程中,一般都會有一些處理方法上的不同,需要特別注意。以

9、C6711的移植為例: 中斷的開啟和屏蔽的兩個宏定義為: #define OS_ENTER_CRITICAL() Disable_int() #define OS_EXIT_CRITICAL() Enable_int()Disable_int和Enable_int是用匯編語言編寫的兩個函數(shù)。在這里使用了控制狀態(tài)存放器(CSR)的一個特性CSR中除了控制全局中斷的GIE位之外,還有一個PGIE位,可用于保存之前的GIE狀態(tài)。因此在Disable_int中先將GIE的值寫入PGIE,然后再將GIE寫0,屏蔽中斷。而在Enable_int中那么從PGIE讀出值,寫入GIE,從而回復到之前的中斷設置。

10、這樣,就可以防止使用這兩個宏而意外改變了系統(tǒng)的中斷狀態(tài)此外,也沒有使用堆棧或局部變量,比原作者推薦的方法要好。 任務的切換: 前文說過,C6711中沒有軟中斷機制,所以任務的切換需要用匯編語言自行編寫一個函數(shù)_OSCtxSw來實現(xiàn),并且 #define OS_TASK_SW() OSCtxSw() 在C6711中需要入棧保護的存放器包括A0-A15、B0-B15、CSR、IER、IRP和AMR,這些再加上當前的程序地址構(gòu)成一個存儲幀,需要入棧保存。 _OSCtxSw函數(shù)中,需要像發(fā)生了一次中斷那樣,將上述存儲幀入棧,然后獲取被激活任務的TCB指針,將其存儲幀的內(nèi)容彈出,從而完成任務切換。 需要

11、特別注意的是,在這里OS_TASK_SW是作為函數(shù)調(diào)用的,所以如前文所述,調(diào)用時的當前程序地址是保存在B3存放器中的,這也就是任務重新激活時的返回地址。 中斷的編寫: 如前文所述,如果用“interrupt關鍵字聲明函數(shù),CCS在編譯時,會自動將該函數(shù)中使用到的存放器入棧、出棧保護。 但是,這會導致各種中斷發(fā)生時,出入棧的內(nèi)容各不相同。這對于C/OS-II是會引起嚴重錯誤的。因為C/OS-II要求中斷發(fā)生時的入棧操作使用和發(fā)生任務切換時完全一樣的存儲幀結(jié)構(gòu)。 因此,在移植時、基于C/OS-II進行開發(fā)時,都不應當使用“interrupt關鍵字,而應用如下結(jié)構(gòu)編寫中斷函數(shù):void OSTick

12、ISR (void) DSP_C6x_Save(); / 效勞函數(shù),入棧 OSIntEnter(); if (OSIntNesting = 1) / v2.51版本新增加 OSTCBCur->OSTCBStkPtr =(OS_STK*) DSP_C6x_GetCurrentSP(); / 效勞函數(shù) / 獲取當前SP的值 / 允許中斷嵌套 那么在此處開中斷 OSTimeTick(); OSIntExit(); DSP_C6x_Resume(); / 效勞函數(shù),出棧 DSP_C6x_Save和DSP_C6x_Resume是兩個效勞函數(shù),分別完成中斷的出、入棧操作。它們與OS_TASK_SW函

13、數(shù)的區(qū)別在于:中斷 發(fā)生時的當前程序地址是自動保存在IRP存放器的,應將其作為任務返回地址,而不再是B3。此外,DSP_C6x_Resume是一個永遠不會返回的函 數(shù),在將所有內(nèi)容出棧后,它就直接跳轉(zhuǎn)回到中斷發(fā)生前的程序地址處,繼續(xù)執(zhí)行。進行移植的測試 在編寫完了所有的移植代碼之后,就可以編寫幾個簡單的任務程序進行測試了,大體上可以分三個步驟來進行,相關資料比擬詳盡,這里就不多作贅述了。封裝效勞函數(shù) 最后這個步驟,往往是容易被無視的,但對于保持工程代碼的簡潔、易維護有很重要的意義。 C/OS-II的原作者強烈建議將源代碼分路徑進行存儲,例如本文例子中的所有源代碼就應按如下路徑結(jié)構(gòu)存儲: uCOS-II SOURCE / 平臺無關代碼 OS_CORE.C . TI_C6711 / 系統(tǒng)核心 CCS / 開發(fā)工具 OS_CPU.H OS_CPU_A.ASM OS_CPU_C.C DSP_C6x_Service / 效勞函數(shù) DSP_C6x_ Service

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論