国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

uC/OS-II在ARM系統上的移植與實現

發布時間:2010-11-15 12:25    發布者:eetech
關鍵詞: arm , 系統 , 移植
在開發嵌入式系統時,一般選擇基于ARM 和uC/ OS - II 的嵌入式開發平臺,因為ARM 微處理器具有處理速度快、超低功耗、價格低廉、應用前景廣泛等優點. 將uC/ OS - II 移植到ARM 系統之后,可以充分結合兩者的優勢. 如果一個程序在一個環境里能工作,我們經常希望能將它移植到另一個編譯系統、處理器或者操作系統上,這就是移植技術.移植技術可以使一種特定的技術在更加廣泛的范圍使用,使軟件使用更加靈活,不局限于某一條件.uC/OS - II 是由Jean J . Labrosse 先生編寫的完整的可移植、固化、裁剪的占先式實時多任務內核.uC/ OS - II 的源代碼完全開放,這是其他商業實時內核無法比擬的. 它是針對嵌入式應用設計的,在設計之初就充分考慮了可移植性,它的大部分源代碼都是用高可移植性的ANSIC 編寫的 . uC/ OS - II可以移植到從8 位到64 位的不同類型、不同規模的嵌入式系統,并能在大部分的8 位、16 位、32 位、甚至64 位的微處理器和DSP 上運行. 由于uC/ OS - II是一個實時操作系統,所以如果將它嵌入到ARM處理器上,就能夠進一步簡化ARM系統的開發.



圖1  uC/ OS - II 文件體系結構

1  uC/ OS - II 的移植

uC/OS - II 的文件系統結構包括核心代碼部分、設置代碼部分、與處理器相關的移植代碼部分. 結構如圖1 所示.其中最上邊的軟件應用層是uC/ OS - II 上的代碼. 核心代碼部分包括7 個源代碼文件和1 個頭文件. 功能分別是內核管理、事件管理、消息隊列管理、存儲管理、消息管理、信號量處理、任務調度和定時管理. 設置代碼部分包括2 個頭文件,用來配置事件控制塊的數目以及是否包含消息管理相關代碼. 而與處理器相關的移植代碼部分則是進行移植過程中需要更改的部分,包括1 個頭文件OS CPU. H ,1 個匯編文件OS CPU A. S 和1 個C 代碼文件.實際上將uC/ OS - II 移植到ARM 處理器上,需要完成的工作主要是以下三個與體系結構相關的文件:OS CPU. H ,OS CPU. C 以及OS CPU A. S .

1. 1  OS CPU. H 的移植

文件OS CPU. H 中包括了用# define 語句定義的與處理器相關的常數、宏以及類型. 移植時主要修改的內容有:與編譯器相關的數據類型的設定;用#define 語句定義2 個宏開關中斷;根據堆棧的方向定義OS STK GROWTH等.

在將uC/ OS - II 移植到ARM 處理器上時,首先進行基本配置和數據類型定義. 重新定義數據類型是為了增加代碼的可移植性,因為不同的編譯器所提供的同一數據類型的數據長度并不相同,例如int型,在有的編譯器中是16 位,而在另外一些編譯器中則是32 位. 所以,為了便于移植,需要重新定義數據類型,如INT32U 代表無符號32 位整型. typedefunsigned int INT8U ,就是定義一個8 位的無符號整型數據類型. 其次就是對ARM 處理器相關宏進行定義,如ARM處理器中的退出臨界區和進入臨界區的宏定義,退出臨界區宏定義 : # define OS EXITCRITICAL () ARMDisable Int ( ) / / 關中斷,進入臨界區宏定義# define OS ENTER CRITICAL ( ) AR2MEnableInt () / / 開中斷. 最后就是堆棧增長方向的設定. 當進行函數調用時,入口參數和返回地址一般都會保存在當前任務的堆棧中,編譯器的編譯選項和由此生成的堆棧指令就會決定堆棧的增長方向,定義為# define OS STK GROWTH 1.




圖2  堆棧增長方向

1. 2  OS CPU. C 的移植

OS CPU. C 的移植包括任務堆棧初始化和相應函數的實現. 在這里,共有6 個函數:OSTaskStkInit( ) , OSSTaskCreateHook ( ) , OSTaskDelHook ( ) , OS2TaskSwHook( ) ,OSTaskStatHook ( ) , OSTimeTickHook () . 其中后面的5 個HOOK函數又稱為鉤子函數,主要是用來對uC/ OS - II 進行功能擴展. 這些函數為用戶定義函數,由操作系統調用相應的HOOK函數去執行,在一般情況下,他們都沒有代碼,所以實現為空函數即可. 而函數OSTaskStkInit ( ) 對堆棧進行初始化,在ARM 系統中,任務堆棧空間由高到低依次為PC ,LR ,R12 ,R11 , ,R1 ,R0 ,CPSR ,SPSR. 在進行堆棧初始化以后,OSTaskStkInit ( ) 返回新的堆棧棧頂指針.

1. 3  OS CPU A. S 的移植

OS CPU A. S 文件的移植需要對處理器的寄存器進行操作,所以必須用匯編語言來編寫. 這個文件的實現集中體現了所要移植到處理器的體系結構和uC/ OS - II 的移植原理[6 ] . 它包括4 個子函數:OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中難點在于OSIntCtxSw() 和OSTickISR() 函數的實現,因為這兩個函數的實現與移植者的移植思路以及相關硬件定時器、中斷寄存器的設置有關.在實際的移植工作中,這兩處也是比較容易出錯的地方.

OSIntCtxSw( ) 函數由OSIntExit ( ) 函數調用,而OSIntExit () 函數又由OSTickISR() 調用. OSIntCtxSw()函數最重要的作用就是它完成在中斷ISR 中直接進行任務切換,從而提高了實時響應的速度. 它發生的時機是在ISR 執行到OSIntExit ( ) 時,如果發現有高優先級的任務因為等待time tick 的到來獲得了執行? 7 2 ? 第4 期李學橋等:uC/ OS - II 在ARM系統上的移植與實現的條件,就可以馬上被調度執行,而不用返回被中斷的那個任務之后再進行任務切換. 實現OSIntCtxSw() 的方法大致也有兩種情況[7 ] :一是通過調整SP 堆棧指針的方法,根據所用的編譯器對于函數嵌套的處理,通過精確計算出所需要調整的SP 位置來使得進入中斷時所作的保護現場的工作可以被重用. 二是設置需要切換標志位的方法,在OSIntCtxSw( ) 里面不發生切換,而是設置一個需要切換的標志,等函數嵌套從進入OSIntExit ( ) = > OS ENTER CRITI2CAL() = > OSIntCtxSw( ) = > OS EXIT CRITICAL() = > OSIntExit ( ) 退出后,再根據標志位來判斷是否需要進行中斷級的任務切換.

其次是對OSTickISR() 修改.OSTickISR() 首先在被中斷任務堆棧中保存CPU 寄存器的值,然后調用OSIntEnter () . 隨后調用OSTimeTick() ,檢查所有處于延時等待狀態的任務,判斷是否有延時結束就緒的任務. 最后調用OSIntExit ( ) . 如果在中斷中(或其他嵌套的中斷) 有更高優先級的任務就緒,并且當前中斷為中斷嵌套的最后一層,OSIntExit ( ) 將進行任務調度. 如果進行了任務調度,OSIntExit () 將不再返回調用者,而是用新任務的堆棧中的寄存器數值恢復CPU 現場,然后實現任務切換. 如果當前中斷不是中斷嵌套的最后一層,或中斷中沒有改變任務的就緒狀態, OSIntExit ( ) 將返回調用者OSTickISR ( ) ,OSTickISR() 返回被中斷的任務. 最后就是退出臨界區和進入臨界區函數. 進入臨界區時,必須關閉中斷,用ARMDisableInt () 函數實現. 在退出臨界區的時候恢復原來的中斷狀態,通過ARMEnableInt ( ) 函數來實現 . 至于進行任務級上下文切換,則是由匯編子程序OSCtxSw 實現.

2  在ARM系統上的實現

以跑馬燈和數碼管為例,說明uC/ OS - II 的移植過程:跑馬燈是4 個小燈輪流變明變暗,很方便看出效果. 跑馬燈在日常中使用很多,比如狀態欄跑馬燈、文字跑馬燈、圖片跑馬燈、單片機跑馬燈等 . 本文采用的是單片機跑馬燈. 實現單片機跑馬燈的程序中,只有地址口為低電平(接地) 時,發光管才會亮. 所以只要循環控制地址口的各個引腳的電平高低變化就可使LED 循環點亮:首先是全不亮,接著第1 個燈亮,第2 個燈亮,第3 個燈亮,第4 個燈亮,第5 個燈亮,最后所有的燈一起亮.

筆者使用6 個共陽極LED 數碼管來實現在7 段數碼管上循環顯示0~9 ,A~F 字符. 每個顯示位的段選線與一個8 位并行口線對應相連,只要在顯示位上的段選線上保持段碼電平不變,則該位就能保持相應的顯示字符. 這里的8 位并行口可以直接采用并行I/ O 口,也可以采用串入/ 并出的移位寄存器或是其他具有三態功能的鎖存器等. 當采用動態顯示接口時,在多位LED 顯示時,為了簡化電路,降低成本,將所有位的段選線并聯在一起,由一個8 位I/ O口控制. 而共陰(或共陽) 極公共端分別由相應的I/ O 線控制,實現各位的分時選通. 由于各個數碼管是共用同一個段碼輸出口分時輪流通電的,從而大大簡化了硬件線路,降低了成本.

對于數碼管的實現分為3 個步驟:
1) 制作LED 字符與碼段對應表
2) 掃描控制3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一個數碼管3 /
3) 段碼輸出( (U8 3 ) 0x02000004) = seg7table[0 ] ;

根據上面的LED 字符與碼段對應表,控制相應的數字進行輸出. 數碼管掃描控制地址為0x02000006 ,8 位訪問,比如Bit0 控制數碼管0 ,并且低電平有效,Bit5 控制數碼管5 ,低電平有效,數碼管顯示試驗系統中采用的是動態顯示接口,其中數碼管掃描控制地址為0x02000006 ,位0 —5 分別對應一個數碼管,將其中每位清0 來選擇相應的數碼管;地址0x02000004 為數碼管的數據寄存器,控制數碼管的段碼輸出.

3  多任務應用程序

uC/OS - II 的移植及跑馬燈和數碼管的實現如下[9 ] :首先是C 語言入口函數Main (所有C 程序的入口) . 它里面包括調用函數ARMTargetInit () 初始化ARM處理器,調用OSInit ( ) 進行uC/ OS - II 操作系統初始化,然后調用OSTaskCreate ( ) 函數創建任務TaskLED 和TaskSEG,最后調用ARMTargetStart () 函數啟動時鐘節拍中斷,并且調用OSStart ( ) 啟動系統任務調度,由于在程序當中使用for ( ; ;) ,這是一個永無止境的回路,所以裝置可以一直進行下去,直到關閉裝置.

void Main(void)
{ARMTargetInit () ;
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  結語

使用創建好的模板Temp 新建一個工程Temp ,并將模板中的Core 和Assemble 文件夾中的文件加入到工程Temp 中. 1) 新建一個文件Temp. c ,并將其添加到Temp 工程的App 文件夾中. 2) 打開Temp. c文件,添加兩個任務,它們的任務處理函數分別為TaskLED() 和TaskSEG() . 3) 在TaskLED( ) 函數中每隔50 個時鐘節拍使所有跑馬燈閃爍一次(即按順序亮,然后全亮,最后全滅,順序循環) . 4) 在TaskSEG() 函數中每隔50 個時鐘節拍切換一次數碼管顯示(循環從0~F 顯示) . 5) 編譯工程Temp ,如果出錯,則進行修改后再編譯. 6) 將Temp 下載并運行,看結果. 正確的結果是將每隔1/ 2 s 切換一次數碼管顯示,每隔1/ 2 s使所有跑馬燈閃爍一次. 經持續了2 h試驗,沒有出現錯誤,跑馬燈和數碼管正常運轉,結果證明移植成功.
本文地址:http://www.qingdxww.cn/thread-39303-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • 利用模擬開發工具生態系統進行安全電路設計
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 52精品免费视频国产专区 | 亚洲成人黄色 | 国产99久9在线视频 国产99久9在线 | 国产精品日本一区二区不卡视频 | 成人午夜在线观看国产 | 久久996re热这里只有精品 | 三面娜迦泰剧全集在线观看 | 国内偷自拍对白视频 | 免费一级做a爰片久久毛片 免费一级在线观看 | 999视频精品全部免费观看 | 国产在线精品成人一区二区三区 | 亚洲一区二区黄色 | 国产精品资源在线观看网站 | 婷婷色图| 欧美大片全黄在线观看 | 久久久99精品久久久久久 | 九九色视频 | 黄色午夜 | 国内久久 | 在线观看色网 | 欧洲色网 | 亚洲色四在线视频观看 | 四虎最新影院 | 人蛇大战高清完整版在线观看 | 99久久久国产精品免费播放器 | h网站在线看 | 西瓜影院在线理论片 | 日本久久综合视频 | 国产特级毛片aaaaaaa高清 | 欧美成视频在线观看 | 中文字幕一区二区三区精彩视频 | 国产视频手机在线 | 久热香蕉在线爽青青 | 日韩视频免费观看 | 四虎永久精品视频在线 | 亚洲性片 | 国产专区在线 | 精品96在线观看影院 | 日本一区二区三区四区视频 | 国产成人精品高清在线观看99 | 91精品国产免费久久国语麻豆 |