梁小驁 宋慶國 王勃



摘要
介紹了嵌入式實時操作系統uCOS-Ⅲ的內核架構,通過對ST公司基于Cortex-M4平臺數字信號控制器STM32F407的體系結構進行分析,給出了移植的具體方案。描述了uCOS-Ⅲ在Cortex-M4平臺的移植關鍵技術并給出部分關鍵代碼,最后設計了多任務的應用程序-險證了移植的成功。
【關鍵詞】嵌入式系統 uCOS-Ⅲ Cortex-M4 STM32F407
1 引言
uCOS-Ⅲ是一個可擴展的,可固化的,搶占式的實時內核,它管理的任務個數不受限制。它作為Micrium推出的第三代操作系統內核,提供了現代實時內核所期望的大部分功能包括資源管理、同步、內部任務通信等功能。uCOS-Ⅲ也提供了很多特性是在其他實時內核中所不具備的。比如能在運行時測量運行時間性能,直接的發送信號或消息給任務,任務能同時等待多個信號量和消息隊列等。因此將uCOS-Ⅲ移植到嵌入式處理器上,對于提高軟件產品質量,推進軟件產品化及縮短產品研發周期等方面有著重要意義。本文主要介紹uCOS-Ⅲ在ST公司數字信號控制器STM32F407上的移植。
2 STM32F407硬件平臺架構
STM32F407作為ST公司推出的嵌入式數字信號控制器系列產品之一,具有更先進的Cortex M4內核、更多的存儲空間、較高的運行速度、支持較多高級外設、更低的功耗等優點,其主要指標具體如表1所示。
STM32F407系列處理器的通用寄存器如圖1所示,其中R0?R7為低組寄存器,字長全為32位,所有指令均可對其進行訪問;R0?R8為高組寄存器,字長全為32位,只有很少16位Thumb可對其進行訪問。R13為堆找指針,在CortexM4處理器內核中共有兩個堆棧指針,主堆棧指針(MSP)為缺省指針,由內核、異常服務例程及所需特權訪問的應用程序代碼來使用;進程堆棧指針(PSP)則用于常規的應用代碼。R14是鏈接寄存器,用于在調用子程序時返回存儲地址;R15是程序計數器,可用于程序內部分支跳轉。
此外,Cortex M4處理器內核還搭載了若干特殊功能寄存器,程序狀態字寄存器組(PSRs)用于反映程序執行狀態;中斷屏蔽寄存器組(PRIMASK、FAULTMASK、BASEPRI),用于控制異常的使能和禁能;控制寄存器(CONTROL)則用于定義特權級別和切換堆棧指針。處理器內部的SysTick定時器可產生固定的中斷信號,可作為操作系統的時鐘信號。
3 uCOS-lII移植關鍵技術
3.1 uCOS-Ⅲ源文件體系結構
uCOS-Ⅲ源文件按照由底層到上層的排列順序進行整理,具體源文件體系結構如圖2所示。用戶應用程序軟件位于最上層,通過調用uCOS-Ⅲ內核的接口函數來實現多任務調度和切換、內存管理和進程間通信等功能。從圖2可知,移植uCOS-Ⅲ操作系統的主要任務是對④、⑤兩部分代碼的更改,使其正常運行于Cortex-M4平臺。
3.2 uCOS-Ⅲ與移植相關代碼編寫
3.2.1 os—cpu—c.c文件
uCOS-Ⅲ移植時首先需確定任務的堆棧結構,進行任務堆棧的初始化工作,以方便第一次任務切換時將堆棧彈出,開始運行任務。需實現的C函數為OSTaskStklnit(),此函數主要功能是將寄存器的內容入棧,要注意堆棧的增長方向,嚴格按照Cortex M4處理器入棧的順序將寄存器的內容放入棧中。依據Cortex-M4內核的任務堆棧結構,OSTaskStklnit()函數具體實現如圖3所示。
還需編寫時鐘節拍中斷初始化函數OS_CPU_SysTickInit()及中斷服務函數0S_CPU_SysTickHandler()以便進行系統的時間管理。OS_CPU_SysTickInit()需在系統的第一個任務開始前進行調用,若在此之后調用,則可能導致系統異常崩潰。OS_CPU_SysTickHandler()函數具體實現如圖4所示。
3.2.2 os_cpu_a.asm及os_cpu.h
在os_cpu_a.asm文件中需要編寫關于CPU進行任務切換的匯編函數,0S_cpu.h則聲明了相關宏定義。該部分重點是編寫宏0S_TASK_SW()和宏OSIntCtxSw()。其中宏OS_TASK_SW()用于觸發一個軟件中斷或調用一個函數來實現任務切換,具體實現如圖5所示。
調用函數實現切換的具體過程為將當前任務的寄存器入棧,接著待切換任務出棧放入寄存器中即可。入棧時應注意入棧順序、是否全部入棧等細節。若采用觸發軟件中斷來實現切換時,則需在0s_cpu_a.asm中編寫中斷服務函數PendSV_Handler()。該函數實現系統未入棧的部分寄存器,然后將待切換任務的堆棧彈到各個寄存器中來實現。宏OSIntCtxSw()用于當執行中斷服務程序時,若更高優先級任務就緒,在退出中斷時進行任務切換。其代碼實現和OS_TASK_SW()類似。
3.3 uCOS-Ⅲ與CPU相關代碼編寫
該部分代碼中cpu_def.h文件用于定義和CPU配置相關的宏,cpu_core.c和cpu_core.h主要包含的是CPU命名、時間戳計算等。以上文件和移植無關,不用進行更改。Cpu_c.c和cpu_a.asm文件和CPU底層相關,這兩個文件必須要實現開關中斷函數CPU_IntSixEn()、CPU_IntSrcDis()。CPU_IntSrcEn()函數實現如圖6所示,CPU_IntSrcDis()函數實現類似。
4 uCOS-Ⅲ移植結果測試
本文定義了3個任務來驗證uCOS-Ⅲ在Cortex-M4平臺上的移植結果,如圖7所示,網絡數據處理任務對網絡數據包接收任務的數據包進行數據按位取反操作;數據處理完成后通過網絡數據包發送任務回送相應數據。任務之間通過郵箱機制進行同步。
系統運行結果如圖8所示,STM32F407可正常接收網絡數據包并進行數據處理,然后通過網絡數據包發送任務將數據處理結果返回,實現了移植測試的預期功能。
5 結語
本文選用ST公司的STM32F407數字信號控制器作為硬件平臺,針對Ccmex-M4的體系架構,對嵌入式實時操作系統uCOS-Ⅲ的源碼進行相應更改,實現了uCOS-Ⅲ操作系統在Cortex-M4平臺上的移植。對于將uCOS-Ⅲ操作系統移植到同類架構芯片上,具有實際的工程應用價值。
參考文獻
[1]ARM.Cortex-M4 Devices Generic User Guide [M]. ARM CORP, 2010.
[2]STMicroelectronics.STM32F3 and STM32F4 Series Cortex-M4 programming manual [M].STMicroelectronics group of companies, 2014.
[3]uC0SIII source code [EB/OL].www. micrium.com/downloadcenter/.
[4]吳常玉,曹孟娟,王麗紅,譯. Joseph Yiu. ARM Cortex-M3 與 Cortex-M4 權威指南[M].北京:清華大學出版社,2015.
[5]劉淵,田彥云,張天宏.基于μC/OS-Ⅲ和ARM的空心杯電機控制器設計[J].單片機與嵌入式系統應用,2015, 15 (04): 51-53.