當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]uCOS II在SkyEye上的移植分析

SkyEye仿真調試器是基于ARM7TDMI 核的,因此移植 uC/OS-II 到 SkyEye 上可以借鑒網上已有的例如 Sansung S3C3410X的移植代碼,這在 uC/OS-II的主頁上很容易找到。 當然自己動手做移植也是對 ARM 體系結構和匯編語言的進一步熟悉,同時對于 uC/OS-II 內核的調度機制會有更深的認識。
 整個移植工作可以分為兩個方面,一部分是和 ARM 相關,一部分是和移植原理相關。在開始實際的移植工作前,需要對這兩部分有一定的背景知識,尤其是和側重于和移植工作相關的概念和原理,下面分別做一些介紹。

ARM的體系結構
 ARM(Advanced RISC Machines)是目前在嵌入式領域里應用最廣泛的RISC微處理器結構,以其低成本、低功耗、高性能的特點占據了嵌入式系統(tǒng)應用領域的領先地位。ARM系列的處理器當前有ARM7、ARM9、ARM9E、ARM10等多個產品,此外ARM公司合作伙伴,例如Intel 也提供基于XScale微體系結構的相關處理器產品。所有的ARM處理器都共享ARM通用的基礎體系結構,所以開發(fā)者在不同的ARM處理器上做操作系統(tǒng)移植時,可以將節(jié)省相當多的工作量,這無疑將大大降低軟件開發(fā)成本。
 要詳細完整的了解ARM的體系結構,當然是去讀 ARM Architectur Reference Manual ,這是一個13M 的pdf 文檔,有800多頁,可以從ARM的網站下載,也可以到北京亞嵌教育研究中心的FTP服務器( http://www.akae.cn/ftp/ )上找到。北航出的一本《ARM 嵌入式處理器結構與應用基礎》基本上翻譯了這個pdf中大部分重要的內容,可以作為入門的中文教材。這里我們僅僅對其中和移植工作密切相關的概念做簡要介紹。

1.處理器模式: ( cpu mode )
  ARM 的處理器可以工作在 7 種模式,如圖1所示。

圖1
 這里除 usr 模式以外的其他模式都叫做特權模式,除 usr 和 sys 外的其他5種模式叫做異常模式。在 usr 模式下對系統(tǒng)資源的訪問是受限制的,也無法主動地改變處理器模式。異常模式通常都是和硬件相關的,例如中斷或者是試圖執(zhí)行未定義指令等。這里需要強調的是和移植相關的兩種處理器模式:svc態(tài)和 irq 態(tài),分別指操作系統(tǒng)的保護模式和通用中斷處理模式。這兩種模式之間的轉換可以通過硬件的方式,也可以通過軟件的方式。uC/OS-II內核在執(zhí)行過程中,大部分時間都是工作在 svc 態(tài),當有硬件中斷,例如時鐘中斷到來時,cpu 硬件上會自動完成從svc態(tài)進入 irq態(tài),在中斷處理程序的結束處,則需要通過編程的方法使得 cpu 從irq 態(tài)恢復到 svc 態(tài),這個在移植代碼中可以找到。

2.程序狀態(tài)寄存器: ( PSR:Program status register )
 在任何一種處理器模式中,都使用同一個寄存器來標識當前處理器的工作模式:這個寄存器叫做CPSR ( Current Program Status Register ),它的 [0--4] 位用來表示cpu mode,如圖2、圖3所示。

圖2

圖3
3.ARM寄存器:( register )
 ARM處理器一共有37個寄存器,其中31個是通用寄存器,包括一個程序計數(shù)器 PC。另外6個就是上面提到的程序狀態(tài)寄存器。
a)通用寄存器:
 i.R0-R7:與所有處理器模式無關的寄存器,可以用作任何用途。
 ii.R8-R14:與處理器模式有關的寄存器,在不同的模式下,對應到不同的物理寄存器。其中 R13又叫做 sp,一般用于堆棧指針。R14又叫做lr,一般用于保存返回地址。這兩個寄存器在每種異常模式下都對應到不同的物理寄存器上,例如lr_irq、lr_svc、lr_fiq 等。
    iii.R15:又叫做程序計數(shù)器,即pc,所有的模式下都使用同一個 pc。
b)狀態(tài)寄存器:
 i.CPSR:當前程序狀態(tài)寄存器,所有的模式下都使用同一個 CPSR。
 ii.SPSR:保存的程序狀態(tài)寄存器,每種異常模式下都有自己的SPSR,一共有5種SPSR,即SPSR_irq、SPSR_fiq、SPSR_svc、SPSR_abt、SPSR_und。usr和sys 態(tài)下沒有 SPSR 。
 所有的ARM寄存器的命名和含義,可以用下面的這張表來說明,其中相同命名的都是同一個物理寄存器,不同命名的寄存器都對應不同的物理寄存器,如圖4所示。

圖4

uCOS-II 移植工作介紹
 uCOS-II 實際上可以簡單地看作是一個多任務的調度器,在這個任務調度器之上完善并添加了和多任務操作系統(tǒng)相關的一些系統(tǒng)服務,如信號量、郵箱等。它的90%的代碼都是用C語言寫的,因此只要有相應的C語言編譯器,基本上就可以直接移植到特定處理器上,這也是uC/OS-II具有良好的可移植性的原因。移植工作的絕大部分都集中在多任務切換的實現(xiàn)上,因為這部分代碼主要是用來保存和恢復處理器現(xiàn)場(即相關寄存器),因此不能用C語言,只能使用特定的處理器匯編語言完成。
 uCOS-II的全部源代碼量大約是6000-7000行,一共有15個文件。將 uC/OS-II 移植到ARM處理器上,需要完成的工作也非常簡單,只需要修改三個和ARM體系結構相關的文件,代碼量大約是500行。以下分別介紹這三個文件的移植工作:

1.OS_CPU.H 文件

數(shù)據類型定義
 這部分的修改是和所用的編譯器相關的,不同的編譯器會使用不同的字節(jié)長度來表示同一數(shù)據類型,比如int,同樣在x86平臺上,如果用GNU的gcc 編譯器,則編譯為4 bytes,而使用MS VC++則編譯為2 bytes。我們這里使用的是 GNU 的 arm-elf-gcc,這是一個免費并且開放源碼的編譯器。相關的數(shù)據類型的定義如下,如圖5所示。[!--empirenews.page--]

圖5
堆棧單位
 因為處理器現(xiàn)場的寄存器在任務切換時都將會保存在當前運行任務的堆棧中,所以OS_STK 數(shù)據類型應該是和處理器的寄存器長度一致的。

圖6

堆棧增長方向
 堆棧由高地址向低地址增長,這個也是和編譯器有關的,當進行函數(shù)調用時,入口參數(shù)和返回地址一般都會保存在當前任務的堆棧中,編譯器的編譯選項和由此生成的堆棧指令就會決定堆棧的增長方向。

圖7

宏定義
 包括開關中斷的宏定義,以及進行任務切換的宏定義。

圖8

2.OS_CPU_C.C 文件
任務堆棧初始化
 這里涉及到任務初始化時的一個堆棧設計,也就是在堆棧增長方向上如何定義每個需要保存的寄存器位置,在ARM 體系結構下,任務堆??臻g由高至低依次將保存著pc、lr、r12、r11、r10、…r1、r0、CPSR、SPSR。

圖9
 這里需要說明兩點,一是當前任務堆棧初始化完成后,OSTaskStkInit 返回新的堆棧指針stk,在OSTaskCreate()執(zhí)行時將會調用 OSTaskStkInit 的初始化過程,然后通過OSTCBInit()函數(shù)調用將返回的sp指針保存到該任務的TCB塊中。二是初始狀態(tài)的堆棧其實是模擬了一次中斷發(fā)生后的堆棧結構,因為任務被創(chuàng)建后并不是直接就獲得執(zhí)行的,而是通過OSSched()函數(shù)進行調度分配,滿足執(zhí)行條件后才能獲得執(zhí)行的。為了使這個調度簡單一致,就預先將該任務的pc指針和返回地址lr都指向函數(shù)入口,以便被調度時從堆棧中恢復剛開始運行時的處理器現(xiàn)場。

圖10

系統(tǒng)hook函數(shù)
 此外,在這個文件里面還需要實現(xiàn)幾個操作系統(tǒng)規(guī)定的hook函數(shù),如下:
     OSSTaskCreateHook( )
     OSTaskDelHook( )
  OSTaskSwHook( )
  OSTaskStatHook( )
  OSTimeTickHook( )
 如果沒有特殊需求,則只需要簡單地將它們都實現(xiàn)為空函數(shù)就可以了。

3.OS_CPU_A.S 文件
 OSStartHighRdy()
 此函數(shù)是在OSStart()多任務啟動之后,負責從最高優(yōu)先級任務的TCB控制塊中獲得該任務的堆棧指針sp,通過sp依次將cpu現(xiàn)場恢復,這時系統(tǒng)就將控制權交給用戶創(chuàng)建的該任務進程,直到該任務被阻塞或者被其他更高優(yōu)先級的任務搶占cpu。該函數(shù)僅僅在多任務啟動時被執(zhí)行一次,用來啟動第一個,也就是最高優(yōu)先級的任務執(zhí)行,之后多任務的調度和切換就是由下面的函數(shù)來實現(xiàn)。
 OSCtxSw()
 任務級的上下文切換,它是當任務因為被阻塞而主動請求cpu調度時被執(zhí)行,由于此時的任務切換都是在非異常模式下進行的,因此區(qū)別于中斷級別的任務切換。它的工作是先將當前任務的cpu現(xiàn)場保存到該任務堆棧中,然后獲得最高優(yōu)先級任務的堆棧指針,從該堆棧中恢復此任務的cpu現(xiàn)場,使之繼續(xù)執(zhí)行。這樣就完成了一次任務切換。
 OSIntCtxSw()
 中斷級的任務切換,它是在時鐘中斷ISR(中斷服務例程)中發(fā)現(xiàn)有高優(yōu)先級任務等待的時鐘信號到來,則需要在中斷退出后并不返回被中斷任務,而是直接調度就緒的高優(yōu)先級任務執(zhí)行。這樣做的目的主要是能夠盡快地讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。它的原理基本上與任務級的切換相同,但是由于進入中斷時已經保存過了被中斷任務的cpu現(xiàn)場,因此這里就不用再進行類似的操作,只需要對堆棧指針做相應的調整,原因是函數(shù)的嵌套。
 OSTickISR()
 時鐘中斷處理函數(shù),它的主要任務是負責處理時鐘中斷,調用系統(tǒng)實現(xiàn)的OSTimeTick函數(shù),如果有等待時鐘信號的高優(yōu)先級任務,則需要在中斷級別上調度其執(zhí)行。其他相關的兩個函數(shù)是OSIntEnter()和OSIntExit(),都需要在ISR中執(zhí)行。
 ARMEnableInt()& ARMDisableInt()
 分別是退出臨界區(qū)和進入臨界區(qū)的宏指令實現(xiàn)。主要用于在進入臨界區(qū)之前關閉中斷,在退出臨界區(qū)的時候恢復原來的中斷狀態(tài)。它的實現(xiàn)比較簡單,可以采用方法1直接開關中斷來實現(xiàn),也可以采用方法2通過保存關閉/恢復中斷屏蔽位來實現(xiàn)。


我的移植體會
 移植 uC/OS-II 的絕大部分工作都集中在 os_cpu_a.S 文件的移植,這個文件的實現(xiàn)集中體現(xiàn)了所要移植到處理器的體系結構和uC/OS-II 的移植原理;在這個文件里,最困難的工作又集中體現(xiàn)在OSIntCtxSw 和 OSTickISR 這兩個函數(shù)的實現(xiàn)上。這是因為這兩個函數(shù)的實現(xiàn)是和移植者的移植思路以及相關硬件定時器、中斷寄存器的設置有關。在實際的移植工作中,這兩個地方也是比較容易出錯的地方。
 OSIntCtxSw 最重要的作用就是它完成了在中斷ISR中直接進行任務切換,從而提高了實時響應的速度。它發(fā)生的時機是在 ISR 執(zhí)行到 OSIntExit 時,如果發(fā)現(xiàn)有高優(yōu)先級的任務因為等待的 time tick 到來獲得了執(zhí)行的條件,這樣就可以馬上被調度執(zhí)行,而不用返回被中斷的那個任務之后再進行任務切換,因為那樣的話就不夠實時了。
 實現(xiàn) OSIntCtxSw 的方法大致也有兩種情況:一種是通過調整 sp 堆棧指針的方法,根據所用的編譯器對于函數(shù)嵌套的處理,通過精確計算出所需要調整的 sp 位置來使得進入中斷時所作的保存現(xiàn)場的工作可以被重用。這種方法的好處是直接在函數(shù)嵌套內部發(fā)生任務切換,使得高優(yōu)先級的任務能夠最快的被調度執(zhí)行。但是這個辦法需要和具體的編譯器以及編譯參數(shù)的設置相關,需要較多技巧。
 另一種是設置需要切換標志位的方法,在 OSIntCtxSw 里面不發(fā)生切換,而是設置一個需要切換的標志, 等函數(shù)嵌套從進入 OSIntExit => OS_ENTER_CRITICAL() => OSIntCtxSw() =>OS_EXIT_CRITICAL() => OSIntExit退出后,再根據標志位來判斷是否需要進行中斷級的任務切換。這種方法的好處是不需要考慮編譯器的因素,也不用做計算,但是從實時響應上不是最快,不過剛開始學習這種方法比較容易理解,實現(xiàn)起來也簡單。SkyEye 目前的移植就是基于第二種方法的。
 在中斷態(tài)下進行任務切換,需要特別說明的一個問題是如何獲得被中斷任務的 lr_svc 。因為進入中斷態(tài)后,lr 變成了lr_irq ,原來任務的 lr_svc 無法在中斷態(tài)下獲得,這樣要得到 lr_svc ,就必須在中斷ISR 里面進行一次 cpu mode 強制轉換,即對 CPSR 賦值為0x000000d3 ,只有返回到 svc 態(tài)之后才能得到 原來任務的 lr ,這個對于任務切換很重要。還有一個需要留意的問題是在強制 CPSR 變成 svc 態(tài)之后,SPSR 也會相應地變成 SPSR_irq ,這樣就需要在強制轉變之前保存 SPSR ,也就是被中斷任務中斷前的 CPSR 。
 全部移植代碼在SkyEye仿真器上調試通過,在SkyEye的主頁上可以下載獲得。歡迎大家訪問我們的主頁 【 http://www.skyeye.org 】。 另外在 Linuxfans.org的論壇上 【http://www.linuxfans.org/bbs/forum-58-1.html 】, 有關于 SkyEye 進展的最新討論, 和另一個嵌入式開源項目【www.lumit.org 】的大量資料下載, 【 http://www.linuxfans.org/bbs/forum-66-1.html 】。希望大家對我們的工作提出建議和批評,更希望有越來越多的人關注和參與進來。

總結
 移植 uC/OS-II到 SkyEye 上,既是對 uC/OS-II 的學習和實驗,同時也是對 SkyEye仿真器的驗證和實踐。uC/OS-II 作為一個優(yōu)秀的實時操作系統(tǒng)已經被移植到各種體系結構的微處理器上,也是目前較為常用的公開源碼的實時內核。從這里入手學習嵌入式系統(tǒng)開發(fā)的基本概念,以及在 SkyEye 里構造一個可以運行的RTOS,能夠使我們更深入地了解嵌入式開發(fā)的流程,在沒有硬件的條件下也能對ARM的體系結構有個初步的認識。
 在移植 uC/OS-II 到 SkyEye 之后,我得到了一塊 Samsung 的ARM 評估板,在調通了板子上一些相關硬件(例如串口輸出和定時器)的驅動后,僅僅花了不到一天時間就將SkyEye 下的 uC/OS-II 移植到了真實的開發(fā)板上,這也說明在 SkyEye 上所做的移植工作是非常有意義和幫助的,完全可以作為嵌入式開發(fā)的入門捷徑。
 如果大家移植過程中遇到什么問題,歡迎發(fā)email和我討論。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉