下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、uC OS - II 在 ARM系統(tǒng)上的移植與實(shí)現(xiàn)摘要:使用 ARM公司提供的 ADS 開發(fā)工具,將 uC/ OS - II 移植到 ARM處 理器 上, 并將移植結(jié)果應(yīng)用在跑馬燈和數(shù)碼管的實(shí)現(xiàn)上 ,運(yùn)行正常,表明移植成功 .關(guān)鍵詞:uC/ OS - II ;ARM; 移植0 引言在開發(fā)嵌入式系統(tǒng)時(shí) , 一般選擇基于 ARM和 uC/ OS - II 的嵌入式開發(fā)平臺(tái) , 因 為 ARM微 處理器具有處理速度快、超低功耗、價(jià)格低廉、應(yīng)用前景廣泛等優(yōu)點(diǎn)1 . 將 uC/ OS - II 移植到 ARM系 統(tǒng)之后 ,可以充分結(jié)合兩者的優(yōu)勢(shì) . 如果 一個(gè)程序在一個(gè)環(huán)境里能工作 , 我們經(jīng)常希望能將
2、它移植到另一個(gè)編譯系統(tǒng)、處 理器或者操作系統(tǒng)上 , 這就是移植技術(shù) . 移植技術(shù)可以使一種特定的技術(shù)在更加 廣泛的范圍使用 ,使軟件使用更加靈活 , 不局限于某一條件 .uC/OS - II 是由 Jean J . Labrosse 先生編寫的完整的可移植、固化、裁剪的占先式實(shí)時(shí)多任 務(wù)內(nèi)核.uC/ OS - II 的源代碼完全開放 , 這是其他商業(yè)實(shí)時(shí)內(nèi)核無法比擬的2 . 它是針對(duì)嵌入式應(yīng)用設(shè)計(jì)的 ,在設(shè)計(jì)之初就充分考慮了可移植性 , 它的大 部分源代碼都是用高可移植性的 ANSIC 編寫的3 . uC/ OS - II可以移植到從8 位到 64 位的不同類型、不同規(guī)模的嵌入式系統(tǒng) ,并能在
3、大部分的 8 位、 16 位、32 位、甚至 64 位的微處理器和 DSP 上運(yùn)行. 由于 uC/ OS - II 是一 個(gè)實(shí)時(shí)操作系統(tǒng) ,所以如果將它嵌入到 ARM處理器上 ,就能夠進(jìn)一步簡(jiǎn)化 ARM系 統(tǒng)的開發(fā) .圖 1 uC/ OS - II 文件體系結(jié)構(gòu)1 uC/ OS - II 的移植uC/OS - II 的文件系統(tǒng)結(jié)構(gòu)包括核心代碼部分、設(shè)置代碼部分、與處理器相關(guān) 的移植代碼部分 4 . 結(jié)構(gòu)如圖 1 所示.其中最上邊的軟件應(yīng)用層是 uC/ OS - II 上的代碼 . 核心代碼部分包括 7 個(gè)源代碼文件和 1 個(gè)頭文件 . 功能分別是 內(nèi)核管理、事件管理、消息隊(duì)列管理、存儲(chǔ)管理、消
4、息管理、信號(hào)量處理、任 務(wù)調(diào)度和定時(shí)管理 . 設(shè)置代碼部分包括 2 個(gè)頭文件 , 用來配置事件控制塊的數(shù) 目以及是否包含消息管理相關(guān)代碼 . 而與處理器相關(guān)的移植代碼部分則是進(jìn)行 移植過程中需要更改的部分 ,包括 1 個(gè)頭文件 OS CPU. H ,1 個(gè)匯編文件 OS CPU A. S 和 1 個(gè) C 代碼文件 . 實(shí)際上將 uC/ OS - II 移植到 ARM處 理器上 , 需 要完成的工作主要是以下三個(gè)與體系結(jié)構(gòu)相關(guān)的文件 :OS CPU. H ,OS CPU. C 以及 OS CPU A. S5 .1. 1 OS CPU. H 的移植文件 OS CPU. H 中包括了用 # defi
5、ne 語句定義的與處理器相關(guān)的常數(shù)、宏以 及類型 . 移植時(shí)主要修改的內(nèi)容有 : 與編譯器相關(guān)的數(shù)據(jù)類型的設(shè)定 ; 用#define 語句定義 2 個(gè)宏開關(guān)中斷 ; 根據(jù)堆棧的方向定義 OS STK GROWT等H.在將 uC/ OS - II 移植到 ARM處 理器上時(shí) , 首先進(jìn)行基本配置和數(shù)據(jù)類型定義 .重新定義數(shù)據(jù)類型是為了增加代碼的可移植性 , 因?yàn)椴煌木幾g器所提供的同一 數(shù)據(jù)類型的數(shù)據(jù)長(zhǎng)度并不相同 ,例如 int 型,在有的編譯器中是 16 位,而在另外 一些編譯器中則是 32 位. 所以,為了便于移植 ,需要重新定義數(shù)據(jù)類型 ,如 INT32U 代表無符號(hào) 32 位整型. ty
6、pedefunsigned int INT8U ,就是定義一個(gè) 8位的無符號(hào)整型數(shù)據(jù)類型 . 其次就是對(duì) ARM處 理器相關(guān)宏進(jìn)行定義 ,如 ARM處 理器中的退出臨界區(qū)和進(jìn)入臨界區(qū)的宏定義 , 退出臨界區(qū)宏定義 5 : # define OS EXITCRITICAL () ARMDisable Int ( ) / /關(guān)中斷, 進(jìn)入臨界區(qū)宏定義# define OS ENTER CRITICAL ( ) AR2MEnableInt () / /開中斷. 最后就是堆棧增長(zhǎng)方向的設(shè)定 . 當(dāng)進(jìn)行函數(shù)調(diào)用時(shí) , 入口參數(shù)和返回地址一般都會(huì)保 存在當(dāng)前任務(wù)的堆棧中 , 編譯器的編譯選項(xiàng)和由此生成的堆
7、棧指令就會(huì)決定堆棧 的增長(zhǎng)方向 6 , 定義為# define OS STK GROWTH 1.圖 2 堆棧增長(zhǎng)方向1. 2 OS CPU. C 的移植OS CPU. C 的移植包括任務(wù)堆棧初始化和相應(yīng)函數(shù)的實(shí)現(xiàn) . 在這里,共有 6 個(gè) 函數(shù):OSTaskStkInit( ) , OSSTaskCreateHook ( ) , OSTaskDelHook ( ) , OS2TaskSwHook( ) ,OSTaskStatHook ( ) , OSTimeTickHook () .其中后面的5 個(gè) HOOK函數(shù)又稱為鉤子函數(shù) , 主要是用來對(duì) uC/ OS - II 進(jìn)行功能擴(kuò)展 . 這 些
8、函數(shù)為用戶定義函數(shù) ,由操作系統(tǒng)調(diào)用相應(yīng)的 HOOK函數(shù)去執(zhí)行 ,在一般情況下 他們都沒有代碼 ,所以實(shí)現(xiàn)為空函數(shù)即可 . 而函數(shù) OSTaskStkInit ( ) 對(duì)堆棧 進(jìn)行初始化 , 在 ARM系 統(tǒng)中,任務(wù)堆??臻g由高到低依次為PC ,LR ,R12 ,R11 , ?,R1 ,R0 ,CPSR ,SPSR. 在進(jìn)行堆棧初始化以 后,OSTaskStkInit ( )返回新的堆棧棧頂指針 .1. 3 OS CPU A. S 的移植OS CPU A. S 文件的移植需要對(duì)處理器的寄存器進(jìn)行操作 ,所以必須用匯編語言 來編寫. 這個(gè)文件的實(shí)現(xiàn)集中體現(xiàn)了所要移植到處理器的體系結(jié)構(gòu)和uC/ O
9、S -II 的移植原理 6 . 它包括 4 個(gè)子函數(shù) :OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中難點(diǎn)在于 OSIntCtxSw() 和 OSTickISR() 函數(shù)的實(shí)現(xiàn) , 因?yàn)檫@兩個(gè)函數(shù)的實(shí)現(xiàn)與移植者的移植思路以及相關(guān)硬件定時(shí)器、 中斷寄存器的設(shè)置有關(guān) . 在實(shí)際的移植工作中 , 這兩處也是比較容易出錯(cuò)的地方 .OSIntCtxSw( ) 函數(shù)由 OSIntExit ( ) 函數(shù)調(diào)用 , 而 OSIntExit () 函數(shù)又由 OSTickISR() 調(diào)用. OSIntCtxSw() 函數(shù)最重要的作用就是它
10、完成在中斷 ISR 中 直接進(jìn)行任務(wù)切換 , 從而提高了實(shí)時(shí)響應(yīng)的速度 . 它發(fā)生的時(shí)機(jī)是在 ISR 執(zhí)行 到 OSIntExit ( )時(shí) , 如果發(fā)現(xiàn)有高優(yōu)先級(jí)的任務(wù)因?yàn)榈却?time tick 的到來獲得了執(zhí)行 ? 7 2 ? 第 4 期李學(xué)橋等 :uC/ OS - II 在 ARM系統(tǒng)上的移植與實(shí) 現(xiàn)的條件 ,就可以馬上被調(diào)度執(zhí)行 , 而不用返回被中斷的那個(gè)任務(wù)之后再進(jìn)行任 務(wù)切換. 實(shí)現(xiàn) OSIntCtxSw() 的方法大致也有兩種情況 7 : 一是通過調(diào)整 SP 堆棧指針的方法 ,根據(jù)所用的編譯器對(duì)于函數(shù)嵌套的處理 , 通過精確計(jì)算出所需 要調(diào)整的 SP 位置來使得進(jìn)入中斷時(shí)所作的
11、保護(hù)現(xiàn)場(chǎng)的工作可以被重用 . 二是 設(shè)置需要切換標(biāo)志位的方法 , 在 OSIntCtxSw( ) 里面不發(fā)生切換 , 而是設(shè)置一個(gè) 需要切換的標(biāo)志 ,等函數(shù)嵌套從進(jìn)入 OSIntExit ( ) = OS ENTER CRITI2CAL() = OSIntCtxSw( ) = OS EXIT CRITICAL() = OSIntExit ( )退出后 , 再根據(jù)標(biāo)志位來判斷是否需要進(jìn)行中斷級(jí)的任務(wù)切換 .其次是對(duì) OSTickISR() 修改 .OSTickISR() 首先在被中斷任務(wù)堆棧中保存 CPU 寄存器的值 , 然后調(diào)用 OSIntEnter () .隨后調(diào)用 OSTimeTick()
12、 , 檢查所有處于延時(shí)等待狀態(tài)的任務(wù) , 判斷是否有延時(shí)結(jié)束就緒的任務(wù) . 最后調(diào)用 OSIntExit ( ) . 如果在中斷中 ( 或其他嵌套的中斷 ) 有更高優(yōu)先級(jí)的任務(wù)就緒 , 并且當(dāng)前 中斷為中斷嵌套的最后一層 ,OSIntExit ( ) 將進(jìn)行任務(wù)調(diào)度 . 如果進(jìn)行了任務(wù) 調(diào)度,OSIntExit () 將不再返回調(diào)用者 ,而是用新任務(wù)的堆棧中的寄存器數(shù)值恢 復(fù) CPU 現(xiàn)場(chǎng), 然后實(shí)現(xiàn)任務(wù)切換 . 如果當(dāng)前中斷不是中斷嵌套的最后一層 , 或中 斷中沒有改變?nèi)蝿?wù)的就緒狀態(tài) , OSIntExit ( )將返回調(diào)用者 OSTickISR( ) ,OSTickISR() 返回被中斷的
13、任務(wù) . 最后就是退出臨界區(qū)和進(jìn)入臨界區(qū)函數(shù) 進(jìn)入臨界區(qū)時(shí) ,必須關(guān)閉中斷 ,用 ARMDisableInt () 函數(shù)實(shí)現(xiàn). 在退出臨界區(qū) 的時(shí)候恢復(fù)原來的中斷狀態(tài) ,通過 ARMEnableInt ( ) 函數(shù)來實(shí)現(xiàn) 7 . 至于 進(jìn)行任務(wù)級(jí)上下文切換 , 則是由匯編子程序 OSCtxSw實(shí) 現(xiàn).2 在 ARM系統(tǒng)上的實(shí)現(xiàn) 以跑馬燈和數(shù)碼管為例 ,說明 uC/ OS - II 的移植過程 :跑馬燈是 4 個(gè)小燈輪流 變明變暗 ,很方便看出效果 . 跑馬燈在日常中使用很多 , 比如狀態(tài)欄跑馬燈、文 字跑馬燈、圖片跑馬燈、單片機(jī)跑馬燈等 8 . 本文采用的是單片機(jī)跑馬燈 . 實(shí)現(xiàn)單片機(jī)跑馬燈的
14、程序中 ,只有地址口為低電平 (接地) 時(shí),發(fā)光管才會(huì)亮 . 所 以只要循環(huán)控制地址口的各個(gè)引腳的電平高低變化就可使LED 循環(huán)點(diǎn)亮 : 首先是全不亮 ,接著第 1 個(gè)燈亮,第 2 個(gè)燈亮,第 3 個(gè)燈亮,第 4 個(gè)燈亮,第 5 個(gè)燈 亮 , 最后所有的燈一起亮 .筆者使用 6 個(gè)共陽極 LED 數(shù)碼管來實(shí)現(xiàn)在 7 段數(shù)碼管上循環(huán)顯示 09 ,A F 字符. 每個(gè)顯示位的段選線與一個(gè) 8 位并行口線對(duì)應(yīng)相連 , 只要在顯示位上的 段選線上保持段碼電平不變 , 則該位就能保持相應(yīng)的顯示字符 . 這里的 8 位并 行口可以直接采用并行 I/ O 口, 也可以采用串入 / 并出的移位寄存器或是其他
15、具有三態(tài)功能的鎖存器等 . 當(dāng)采用動(dòng)態(tài)顯示接口時(shí) ,在多位 LED 顯示時(shí),為了簡(jiǎn) 化電路,降低成本,將所有位的段選線并聯(lián)在一起 ,由一個(gè) 8 位 I/ O 口控制. 而 共陰(或共陽) 極公共端分別由相應(yīng)的 I/ O 線控制, 實(shí)現(xiàn)各位的分時(shí)選通 . 由 于各個(gè)數(shù)碼管是共用同一個(gè)段碼輸出口分時(shí)輪流通電的 , 從而大大簡(jiǎn)化了硬件線 路,降低了成本 .對(duì)于數(shù)碼管的實(shí)現(xiàn)分為 3 個(gè)步驟 :1) 制作 LED 字符與碼段對(duì)應(yīng)表2) 掃描控制3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一個(gè)數(shù)碼管3 /3) 段碼輸出( (U8 3 ) 0x02000004) = seg
16、7table0 ;根據(jù)上面的 LED 字符與碼段對(duì)應(yīng)表 , 控制相應(yīng)的數(shù)字進(jìn)行輸出 . 數(shù)碼管掃描控 制地址為 0x02000006 ,8 位訪問,比如 Bit0 控制數(shù)碼管 0 , 并且低電平有 效,Bit5 控制數(shù)碼管 5 , 低電平有效 ,數(shù)碼管顯示試驗(yàn)系統(tǒng)中采用的是動(dòng)態(tài)顯示 接口,其中數(shù)碼管掃描控制地址為 0x02000006 , 位 0 5 分別對(duì)應(yīng)一個(gè)數(shù)碼管 將其中每位清 0 來選擇相應(yīng)的數(shù)碼管 ; 地址 0x02000004 為數(shù)碼管的數(shù)據(jù)寄存器 控制數(shù)碼管的段碼輸出 .3 多任務(wù)應(yīng)用程序uC/OS - II 的移植及跑馬燈和數(shù)碼管的實(shí)現(xiàn)如下 9 : 首先是 C 語言入口函 數(shù)
17、Main ( 所有 C 程序的入口 ) . 它里面包括調(diào)用函數(shù) ARMTargetInit () 初始 化 ARM處理器 , 調(diào)用 OSInit ( ) 進(jìn)行 uC/ OS - II 操作系統(tǒng)初始化 , 然后調(diào)用 OSTaskCreate ( ) 函數(shù)創(chuàng)建任務(wù) TaskLED 和 TaskSEG,最后調(diào)用 ARMTargetStart () 函數(shù)啟動(dòng)時(shí)鐘節(jié)拍中斷 , 并且調(diào)用 OSStart ( ) 啟動(dòng)系統(tǒng) 任務(wù)調(diào)度 ,由于在程序當(dāng)中使用 for ( ; ;) ,這是一個(gè)永無止境的回路 ,所以裝置可以一直進(jìn)行下去 , 直到關(guān)閉裝置 .void Main(void)ARMTargetInit
18、() ;uHALr printf ( uC/ OS - II # n) ;OSInit () ;Sem1 = OSSemCreate(0) ;Sem2 = OSSemCreate(1) ;OSTaskCreate(TaskLED , (void 3 ) &IdLED , (OS STK 3 )&StackLED STACKSIZE - 1 , 5) ;OSTaskCreate(TaskSEG, (void 3 ) &IdSEG, (OS STK 3 )&StackSEG STACKSIZE - 1 , 6) ;ARMTargetStart () ;OSStart () ;return ;4 結(jié)
19、語使用創(chuàng)建好的模板 Temp 新建一個(gè)工程 Temp , 并將模板中的 Core 和 Assemble 文件夾中的文件加入到工程 Temp 中. 1) 新建一個(gè)文件 Temp. c , 并將其添加 到 Temp 工程的 App 文件夾中 . 2) 打開 Temp. c 文件, 添加兩個(gè)任務(wù) , 它們的任 務(wù)處理函數(shù)分別為 TaskLED() 和 TaskSEG() . 3) 在 TaskLED( ) 函數(shù)中每隔 50 個(gè)時(shí)鐘節(jié)拍使所有跑馬燈閃爍一次 (即按順序亮 ,然后全亮,最后全滅,順序循 環(huán)) . 4) 在TaskSEG() 函數(shù)中每隔 50 個(gè)時(shí)鐘節(jié)拍切換一次數(shù)碼管顯示 (循環(huán) 從 0F 顯示) . 5) 編譯工程 Temp ,如果出錯(cuò) , 則進(jìn)行修改后再編譯 . 6) 將 Temp 下載并運(yùn)行 ,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)村個(gè)人地基使用權(quán)轉(zhuǎn)讓與農(nóng)村生態(tài)環(huán)境保護(hù)合作協(xié)議3篇
- 二零二五年度木工次結(jié)構(gòu)構(gòu)件加工與運(yùn)輸服務(wù)合同3篇
- 2025年度精密儀器制造工廠整體轉(zhuǎn)讓協(xié)議3篇
- 二零二五年度農(nóng)用房屋抵押農(nóng)村旅游發(fā)展貸款服務(wù)協(xié)議
- 二零二五年度企業(yè)研發(fā)成果保密協(xié)議2篇
- 二零二五年度公司管理人員員工持股計(jì)劃聘用合同3篇
- 二零二五年度農(nóng)村宅基地房屋出售與綠化維護(hù)合同2篇
- 二零二五年度老年人緊急救援服務(wù)合作協(xié)議3篇
- 二零二五年度綠色能源項(xiàng)目合作協(xié)議3篇
- 2025年度全新私人合同:私人美容師及美容服務(wù)合同3篇
- 漢語拼音字母表
- 中天項(xiàng)目管理標(biāo)準(zhǔn)化講義(文明施工、CIS、防護(hù)設(shè)施)
- IT運(yùn)維服務(wù)項(xiàng)目技術(shù)外包合同
- 調(diào)味料生產(chǎn)工藝流程圖
- 2023北師大版六年級(jí)上冊(cè)數(shù)學(xué)期末試卷(共8套)
- 企業(yè)的涉稅風(fēng)險(xiǎn)
- 武漢大學(xué)抬頭信簽紙
- 新人教版七年級(jí)下冊(cè)生物每課知識(shí)點(diǎn)總結(jié)
- 印刷作業(yè)指導(dǎo)書
- 2022年農(nóng)業(yè)示范基地建設(shè)工作總結(jié)
- 硬筆書法比賽方案精選
評(píng)論
0/150
提交評(píng)論