歡迎您光臨本站 登入註冊首頁

uCOS II在SkyEye上的移植分析

admin @ 2014-03-25 , reply:0

概述

 SkyEye模擬調試器是基於ARM7TDMI核的,因此移植uC/OS-II到SkyEye上可以借鑒網上已有的例如SansungS3C3410X的移植代碼,這在uC/OS-II的主頁上很容易找到。當然……

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

ARM的體系結構
 ARM(Advanced RISC Machines)是目前在嵌入式領域裡應用最廣泛的RISC微處理器結構,以其低成本、低功耗、高性能的特點佔據了嵌入式系統應用領域的領先地位。ARM系列的處理器當前有ARM7、ARM9、ARM9E、ARM10等多個產品,此外ARM公司合作夥伴,例如Intel 也提供基於XScale微體系結構的相關處理器產品。所有的ARM處理器都共享ARM通用的基礎體系結構,所以開發者在不同的ARM處理器上做操作系統移植時,可以將節省相當多的工作量,這無疑將大大降低軟體開發成本。
 要詳細完整的了解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 模式下對系統資源的訪問是受限制的,也無法主動地改變處理器模式。異常模式通常都是和硬體相關的,例如中斷或者是試圖執行未定義指令等。這裡需要強調的是和移植相關的兩種處理器模式:svc態和 irq 態,分別指操作系統的保護模式和通用中斷處理模式。這兩種模式之間的轉換可以通過硬體的方式,也可以通過軟體的方式。uC/OS-II內核在執行過程中,大部分時間都是工作在 svc 態,當有硬體中斷,例如時鐘中斷到來時,cpu 硬體上會自動完成從svc態進入 irq態,在中斷處理程序的結束處,則需要通過編程的方法使得 cpu 從irq 態恢復到 svc 態,這個在移植代碼中可以找到。

2.程序狀態寄存器: ( PSR:Program status register )
 在任何一種處理器模式中,都使用同一個寄存器來標識當前處理器的工作模式:這個寄存器叫做CPSR ( Current Program Status Register ),它的 [0--4] 位用來表示cpu mode,如圖2、圖3所示。
 
圖2
 每一種處理器異常模式,都有一個對應的SPSR ( Saved Program Status Register )寄存器,用來保存進入異常模式前的CPSR。SPSR的作用就是當從異常模式退出時,可以通過一條簡單的彙編指令就能夠恢復進入異常模式前的CPSR,而這個值都是保存在當前異常模式的SPSR中的。例如:當從usr態進入中斷irq 態時,原先的 CPSR_all 將被保存在當前的 SPSR_irq中,類似的異常模式下的 SPSR 還有SPSR_fiq、SPSR_svc、SPSR_abt、SPSR_und。非異常模式的 usr和sys模式下沒有 SPSR,只有CPSR。不能顯式的指定把 CPSR 保存到某個異常模式下的 SPSR,比如 SPSR_irq,而必須是變更到 irq態之後cpu自動完成的,不能在其他態下硬性賦值,因為SPSR_irq是其他狀態下不可見的。
 
圖3

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

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

1.OS_CPU.H 文件

數據類型定義
 這部分的修改是和所用的編譯器相關的,不同的編譯器會使用不同的位元組長度來表示同一數據類型,比如int,同樣在x86平台上,如果用GNU的gcc 編譯器,則編譯為4 bytes,而使用MS VC++則編譯為2 bytes。我們這裡使用的是 GNU 的 arm-elf-gcc,這是一個免費並且開放源碼的編譯器。相關的數據類型的定義如下,如圖5所示。
 
圖5

[admin via 研發互助社區 ] uCOS II在SkyEye上的移植分析已經有2047次圍觀

http://cocdig.com/docs/show-post-42128.html