在CodeWarrior編譯環(huán)境下運行μC/OS—III
摘要:μC/OS—II是面向8/16位及低端32位單片機應用的RTOS,而新近推出的μC/OS—Ⅲ則面向高性能32位單片機,如ARM Cortex等。以Cortex—M4為內核的Kinetis系列單片機,不僅用于全國大學生飛思卡爾杯智能車競賽,也用于諸多大學的嵌入式系統教學,官方提供的開發(fā)環(huán)境是CodeWarrior。本文介紹如何利用CodeWarrior開發(fā)環(huán)境,將μC/OS—III在Kinetis單片機上運行起來,以便將μC/OS—III引入教學、科研與應用。
關鍵詞:μC/OS—III;Kinetis CodeWarrior
引言
Kinetis系列是飛思卡爾公司基于ARM Cortex—M4和Cortex—M0+內核的單片機,和Cortex—M3相比,M4內核主要增加了DSP運算指令和可選的浮點運算單元,同時保持了與Cortex—M3的兼容性,因此被寄予希望能逐步替代Cortex—M3。Kinetis也成為飛恿卡爾杯全國大學生智能車競賽新的硬件平臺之一。
μC/OS—Ⅲ是Micrium公司推出的全新RTOS,特別適用于那些有計算前導零(CLZ)硬件指令的高端32位CPU,可大大加速就緒表查找速度μC/OS—II的主要精華在于其巧妙的優(yōu)先級軟件查表算法,而對于有CLZ硬件算法指令的CPU,如MIPS、PowerPC、ARM11及以上系列,仍使用μC/OS一Ⅱ就不那么合理了。μC/OS—III源代碼公開,官方已提供對目前主流單片機的移植支持,并且針對幾大主流單片機都提供相應的教材,Kinetis就是其中之一。Micrium官方提供的基于Kinetis平臺的范例都是使用IAR作為集成開發(fā)環(huán)境的,考慮到飛思卡爾官方的Code Warrior開發(fā)環(huán)境有著廣泛的用戶群,尤其是使用過S08/S12等單片機的用戶,大多熟悉CodeWarrior。因此,本文將以Kinetis平臺為例,講述如何使用CodeWarrior集成開發(fā)環(huán)境將μOS—III運行起來,作為應用開發(fā)的基礎,也便于那些教學中使用CodeWarrior編譯器的師生,將μC/OS—Ⅲ引入嵌入式系統教學。
1 CodeWarrior集成開發(fā)環(huán)境
Kinetis包括K,X、L三大系列,K和X系列是基于Cortex—M4內核,而L系列是基于Cortex—M0+內核。K系列又包括K10~K70多個子系列,不同系列側重點不同,如K10是基準系列,K20帶USB,K60帶以太網。因為內核一樣,只是外設不同,因此μC/OS—III的移植都是通用的。本文以清華大學飛恩卡爾培訓中心為全國大學生智能車競賽提供的K10開發(fā)套件為例進行說明。
針對Kinetis的CodeWarrior軟件版本為V10.x,可從官方網站下載免費教學版本。新版的CodeWarrior基予Eclipse開發(fā)環(huán)境,支持S08/S12/ColdFire/Kinetis等系列單片機。本文使用的CodeWarrior版本為V10.2Special Edition。
最新版本的μC/OS—III源代碼可從Micrium公司官方網站下載,網站上的“Source code”欄目提供的只是內核的源代碼,不包括移植部分,也沒有相關的范例,而“μC/OS—III Books”欄目里可下載針對不同單片機的電子版教材及配套的范例工程。本文使用官方為Kinetis提供的IAR環(huán)境下的工程范例為參考。
2 μC/OS-Ⅲ的目錄結構
μC/OS—III的代碼組織中,除了內核相關的代碼文件外,還有兩個獨立的組件——μC/CPU和μC/LIB。μC/CPU用來封裝一個CPU的屬性,定義了與編譯器和CPU相關的數據類型、寄存器的位寬、大小端格式、堆棧的增長方式、開關中斷的函數等等。換句話說,也就是把原來
μC/OS里的一些CPU硬件相關的定義和函數獨立成為一個組件,這樣,代碼的結構就更加清晰。而μC/LIB是一個基礎的函數庫,不依賴于任何的處理器和編譯器,主要包括一些字符串處理函數、數學相關函數,以及內存管理相關的函數。μC/OS—III依賴于μC/CPU和μC/LIB,
因此工程中必須包括μC/CPU和μC/LIB的相關文件才能完成編譯。
圖1展示了一個典型工程的文件結構。其中,μC/OS—III、μC/CPU、μC/LIB和配置文件部分都是必須的,加粗斜體的文件表示是需要移植的。lib_mem_a.asm文件是用匯編語言編寫的優(yōu)化的內存分配函數,可以不要(lib_cfg.h里的宏LIB_MEM_CFG_OPTIMIZE_ASM_EN要設置為0)。配置相關的頭文件必需的有4個,其中,μC/OS—III、μC/CPU和μC/LIB三個組件各有一個對應的配置文件,還有一個是os_cfg_ app.h。os_cfg.h和os_cfg_app.h都是μC/OS—Ⅲ相關的配置文件,前者主要是功能的配置,如是否使用信號量、是否使用時間片輪轉調度、是否進行參數檢查等等;后者主要是內核資源的配置,如空閑任務、時鐘節(jié)拍任務的堆棧大小、信號量、消息隊列等內核資源的數量等。“板級支持包”和“用戶程序”里列出的文件并不是必需的,只是一個范例。板級支持包用來定義與開發(fā)板硬件相關的功能函數,如硬件韌始化函數、I/O操作函數、串口服務函數等等。使用板級支持包可以使代碼結構更清晰,方便代碼共享。
從Micrium網站下載針對Kinetis的教材配套的范例工程壓縮包,解壓后目錄結構如圖2所示。Micrium公司的代碼組織結構非常清晰,對于程序開發(fā)人員來說是一個很好的參考。其中,uCOS-III、uC—CPU、uC—LIB三個文件夾下分別包含了該模塊對應的代碼,底下各有一個Cfg文件夾,里面包括了該模塊配置頭文件的模板。而移植相關的部分代碼文件都是按“CPU\編譯器”的目錄結構來組織,如uC—CPU下的ARM—Cortex—M4\IAR。EvalBoards文件夾是范例工程所在,按照“開發(fā)板\編譯器”的結構組織。
3 Codewarrior環(huán)境下運行μC/OS-Ⅲ步驟
3.1 建立新工程
把圖2中所述的解壓后的Micrium文件夾放到不含中文的路徑下(如E:\),在EvalBoards文件夾下新建K10DEVKIT文件夾,表示我們的K10核心開發(fā)板。在K10DEVKIT下再新建CodeWarrior文件夾,表示使用CodeWarrior開發(fā)環(huán)境,該文件夾將作為工程項目的工作空間(works pace)。在CodeWarrior下再建立BSP文件夾,作為K10DEVKIT的板級支持包。
啟動CodeWarrior V10.2,將workspace切換到剛才建立的K10DEVKIT\CodeWarrior文件夾,軟件會重啟并彈出向導頁面,選擇新建工程,然后按照提示一步步直到完成,中途需要選擇單片機的型號和調試工具。開發(fā)板使用的單片機是主頻100 MHz的PK10N512,調試器使用USBDM。新建立的工程中,軟件會自動生成所需的初始化文件和調試配置文件,用戶可能用到的幾個文件說明如下:
3.2 添加文件
如圖2所示,μC/OS—III和μC/CPU中需要移植的代碼文件都是放在“CPU\編譯器”的目錄結構下,從官網下載的只有針對IAR編譯器的。首先,在需要移植的代碼目錄下各建立一個和IAR并列的CodeWarrior文件夾,表示針對CodeWarrior開發(fā)環(huán)境的移植,然后,把原來IAR開發(fā)環(huán)境下的移植文件全部拷貝到CodeWarrior文件夾下。在CodeWarrior開發(fā)環(huán)境下,部分移植文件需要修改,這將在后面講述。接下來需要把所有相關的代碼添加到CodeWarrior工程中。為了便于組織和管理文件,采用以下步驟:
①在CodeWarrior工程的Sources文件夾下建立以下子文件夾;uC—CPU、uC—LIB、uCOS—Ⅲ、Cfg、BSP、APP。uC—CPU、uC—LIB和uCOS—III用來存放該組件包含的文件,Cfg存放配置頭文件,BSP存放板級支持包相關文件,APP存放用戶代碼文件。這里提一下,除了APP和Cfg文件夾外,其他文件夾可采用“虛擬文件夾”形式,這樣,該文件夾并不實際存在于Sources目錄下,只是用來對文件進行分類管理。
②按照圖1所列的內容,把uC—CPU、uC—LIB和uCOS—III三個組件相關的.c和.asm文件添加到對應文件夾,包括移植部分的文件。當然,用戶也可以再新建一層子目錄區(qū)分移植部分和非移植部分。添加文件時有兩種方式:拷貝和鏈接。這里采用鏈接方式,不生成額外的拷貝,便于代碼的管理和更新。將圖1中“配置文件”列的幾個頭文件添加到Cfg文件夾(拷貝圖2中的模板文件),這時采用拷貝方式,因為這些文件是應用相關的,不同工程有不同的配置。而其他無需修改的頭文件不添加到工程中,而是將其路徑加入到工程搜索路徑中,這在后面講述。添加完所有文件后的工程目錄如圖3所示。
3.3 修改文件
前面提到,uC/OS—III和uC/CPU中需要移植的代碼文件在不同的編譯器下需要稍作修改。其中,C文件與編譯器無關,而匯編文件從IAR轉到CodeWarrior有幾個地方需要修改,這涉及cpu_a.asm和os_cpu_a.asm兩個文件,說明如下:
①在CodeWarrior的匯編文件中,默認標號都以“:”結尾,編譯指令都以“.”開頭。雖然也可以在工程設置里取消該限制,但還是建議按照該格式編寫代碼。因此,請檢查匯編代碼是否符合上述要求。
②在CodeWarrior的匯編文件中,聲明全局函數用的是.global,而IAR中用的是PUBLIC,如IAR中的“PUB-LIC OSStartHighRdy”應改為“.global OSStartHighRdy”。
③在匯編文件中,代碼前要進行代碼段的聲明,如IAR中的“RSEG CODE:CODE:NOROOT(2)”在CodeWarrior里應改為“.text,code”
3.4 添加頭文件路徑
右鍵點擊工程名,選擇“Properties”→“C/C++Build”→“Settings”,在“ARM Compile”→“Input”頁面可以添加頭文件搜索路徑,把工程中用到的頭文件所在的路徑加上,添加時建議使用相對路徑(相對工程目錄),如圖4所示。
3.5 修改中斷向量衰
CodeWarrior自動生成的kinetis_sysinit.c文件包含了startup代碼和中斷向量表,把μC/OS—Ⅲ用到的兩個中斷向量加入中斷向量表,代碼如下:
PendSV中斷和SysTick定時器集成于Cortex—M3/4內核中,專門用于OS的任務切換和時鐘節(jié)拍。因此,只要是使用Cortex—M3/4內核的單片機,這部分的移植代碼都是通用的。
3.6 代碼調試
在進行μC/OS—III應用開發(fā)時,應先從最小系統開始調試。在配置文件里把不需要的功能先關掉,如消息隊列、信號量、hook函數、統計任務等。在用戶程序里執(zhí)行完硬件相關的初始化后,先建立一個簡單的任務(即起始任務),然后測試任務調度是否正常。注意,這時在運行的還有μC/OS—III內部的空閑任務。
如果任務調度正常,可在起始任務里初始化并打開時鐘節(jié)拍中斷,然后可通過斷點調試等手段測試時鐘中斷服務程序是否得到正確執(zhí)行。確認后可在起始任務里調用延時相關的函數,如以一定的頻率閃燈,或者向串口輸出信息。如果上述測試通過,那么意味著μC/OS—III已經運行起來了,接下來用戶就可以一步步按照應用需求進行開發(fā)了。
結語
使用CodeWarrior集成開發(fā)環(huán)境的讀者,只要按照以上步驟,即可在Kinetis系列單片機上完成μC/OS—III的編譯和運行。本文所講述的步驟也可用于其他開發(fā)環(huán)境,遵循Micrium官方的文件組織結構,可使得工程目錄結構清晰規(guī)范,方便代碼的升級和共享。