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