?

基于Cortex—M4內核的μCOS—Ⅱ移植

2016-04-26 10:19江達飛
科技視界 2016年9期
關鍵詞:移植

江達飛

【摘 要】針對TI公司新推出的基于Cortex-M4內核的TM4C123G高性能低功耗芯片,詳細介紹了嵌入式開源實時操作系統μCOS-Ⅱ在芯片上的移植方法。根據移植的需求,首先介紹了芯片的一些基本功能以及相關的軟件開發環境,然后結合芯片的固有特性以及μCOS-Ⅱ移植的需求,使用C語言和匯編語言修改了相關的源文件,并詳細闡述了修改的原因。

【關鍵詞】Cortex-M4;μCOS-Ⅱ;TM4C123G;移植

0 引言

目前,嵌入式芯片已經被廣泛應用到我們的生活工作中,各種智能電子設備中都有他們的身影,例如智能冰箱、云電視、智能窗簾、掃地機器人等等。嵌入式處理器在所有的處理器市場中已經占據了94%以上份額。在諸多的嵌入式芯片中,基于Cortex-M系列芯片以它高能效的兼容性以及易于使用性獲得了廣大開發者的青睞。

隨著芯片性能的提高,芯片所承擔的任務將變得更為復雜,與之前的MCU相比,嵌入式芯片可能需要同時運行幾十個不同的任務,因此如何更有效的編寫應用層軟件,管理眾多的硬件模塊以及滿足每一個任務對實時性的要求已成了亟待解決的問題。使用傳統的方式進行嵌入式開發時,開發人員需要在充分了解硬件的基礎上設計出驅動程序,并直接在主程序中調用不同的驅動函數完成相關功能。然而,當系統需要完成的任務數量變多時,設計人員將很難保證每一個任務所需要的CPU資源。使用嵌入式實時操作系統的優點是:它可以統一管理系統資源,讓開發人員從復雜的CPU資源分配中解脫出來,自動調度多個不同任務程序,提高程序開發效率;將硬件與軟件剝離開來,減少軟件與硬件的直接相關度,提高系統的可靠性。

μC/OS-II由美國嵌入式系統專家Jean J.Labrosse設計開發,可被移植到多種微處理器中,它是一個可以裁剪的操作系統,通過設置os_cfg.h頭文件中的相關宏定義,可啟用或者禁用相關的功能。它擁占256個優先級,是一個多任務搶占式的實時內核,優先級序號越低,其任務的優先級就越高,當高優先級任務就緒,就會中斷低優先級任務,保證高優先級任務的實時性。μC/OS-II已經通過聯邦航空局(FAA)商用航行器認證,符合航空無線電技術委員會(RTCA)DO-178B標準。

Cortex-M4處理器是ARM公司開發的新一代嵌入式處理器,在M3的基礎上,它新增了FPU、DSP和并行計算等功能,極大提高了運算能力。本次移植使用了TI公司生產的TM4C123G芯片,其基于ARM Cortex M4F的內核設計實現,浮點運算符合IEEE754標準,CPU位數32位,主頻最高可達80MHz,擁有低功耗模式, systick時鐘和嵌套向量中斷控制器NVIC,適用于μC/OS-II的移植。軟件使用了TI公司提供的CCS集成開發環境。

1 μC/OS-II的移植

μC/OS-II v2.91的源代碼分為三個部分,其中第一部分文件放置在Configure文件夾中,用于配置/裁剪系統;另外一部分文件放在Source文件夾中,此部分程序是操作系統的核心文件,無需修改;最后一部分文件在Ports文件夾中,內部包含OS_CPU.h、OS_CPU.c、OS_CPU_A.asm三個文件。在不同的芯片上使用μC/OS-II時,需要結合芯片的特性,對這三個文件進行修改。

1.1 OS_CPU.h文件的移植

該頭文件定義了數據類型、處理器堆棧數據字長度、堆棧的增長方向、任務切換的宏定義和臨界區訪問的處理方法。

由于不同的處理器其內部一次所能處理的字長不一致,因此對于不同的CPU來說,int,unsigned int等數據類型它的字長可能是不同的,μC/OS-II為了保證可移植性,程序中自己定義了一套數據類型,例如使用INT32U表示無符號32位整形,TM4C123G是32位處理器,其unsigned int表示32位無符號整形,因此可以使用typedef將unsigned int定義為INT32U。然而,對于其它一些16位的處理器來說,unsigned int可能表示的是16位無符號整形,因此INT32U必須被定義為unsigned long型。

臨界段又被稱為關鍵代碼區,是指一小段代碼,同一時刻只能夠允許一個線程存取資源。在它能夠執行前,必須獨占某些共享資源的訪問權,一旦線程進入了臨界段,就意味著在這期間,其它想要獲得該共享資源訪問權的線程必須等待該線程處理完成,并釋放資源。這是讓若干行代碼能夠以原子操作方式來使用資源的一種方法。μC/OS-II是一個搶占式的實時內核,在進入和退出臨界段時需要關閉和打開中斷,它使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()這兩個宏來控制中斷打開或者關閉,并提供了三種方式:①直接通過使用指令_disable_interrupt()和_enable_interrupts()開關中斷;②將當前的中斷狀態字壓至堆棧,然后再關閉中斷,當中斷結束后,再將堆棧中的狀態字彈出;③保存當前CPU狀態字至局部變量,然后關中斷,當需要開中斷時,再將局部變量恢復至CPU寄存器中。使用前兩種方式會造成CPU在中斷前后狀態不一致,但第三種方式需要匯編指令支持。TM4C123G芯片使用Thumb-2指令集,支持MRS指令,可以將CPU狀態寄存器的值返回至通用寄存器中,因此可以使用第三種方式控制中斷。OS_CPU_SR_Save和OS_CPU_SR_Restore在.asm文件中定義,由于ARM編譯器默認會將函數的第一個參數傳送至R0通用寄存器,因此它們可以定義為:

OS_CPU_SR_Save

MRS R0, PRIMASK //保存CPU狀態寄存器

CPSID I //關中斷

BX LR

OS_CPU_SR_Restore

MSR PRIMASK, R0 //恢復CPU狀態寄存器

BX LR

堆棧增長方向是指數據入棧時字節變量在內存中的存儲順序,Cortex-M4內核支持的是“向下生長的滿?!狈绞?,即堆棧SP指針在壓入一個新的數據時,其值需要先被減去4,然后再存入新的數值。因此宏OS_STK_GROWT的值被設置為1。

1.2 OS_CPU.c文件的移植

OS_CPU.c文件中包含移植中可以在C語言環境下實現的代碼。在該文件中,包含了多個hook鉤子函數、OSTaskStkInit()任務堆棧初始化函數和Tmr_TickISR_Handler()時鐘中斷服務函數,其中 OSTaskStkInit()和Tmr_TickISR_Handler()函數是移植能否成功的關鍵。

OSTaskStkInit()在任務創建函數OSTaskCreate()函數中被調用,用于創建一個新的線程,因此,在剛開始,需要在堆棧中模擬一個線程剛被中斷的假象。在cortex-M4內核中,當系統被中斷時,xPSR,PC,LR,R12,R3~R0寄存器將被自動保存至堆棧之中,R11~R4則在需要時,通過人工的方式進行保存。另外由于cortex-M4包含浮點運算單元FPU,如果該單元被啟用,則內部的FPSCR,S0~S15寄存器也會自動保存至堆棧中,S16~S31寄存器通過人工方式保存。為了模擬任務線程被中斷的場景,OSTaskStkInit()的定義如下:

OS_STK *OSTaskStkInit()

{

保存FPSCR及S15~S0寄存器;//保存FPU自動保存的寄存器

保存xPSR,xPSR,PC,LR,R12,R3~R0等寄存器;//保存CPU自動保存的寄存器

保存S16~S31寄存器;//保存FPU中需要人工保存的寄存器

保存R4~R11寄存器;//保存CPU中需要人工保存的通用寄存器

}

Tmr_TickISR_Handler()是時鐘中斷函數,其內部調用了μC/OS-II的節拍服務函數OSTimeTick(),在實時操作系統中起著”心臟“的作用。Tmr_TickISR_Handler()可以使用通用時間定時器或者看門狗定時器,但在cortex-M4內核中,單獨為RTOS提供了一個24位周期性定時器systick,使用它作為系統時鐘的優勢是:所有基于ARM架構的M3或是M4內核,其內部都會有一個systick定時器,這樣做方便了程序在不同的器件之間的移植。

1.3 OS_CPU_A.asm文件的移植

該文件中包含多個用于任務切換的關鍵函數,由于要涉及寄存器的保存與恢復,因此只能使用匯編語言實現。另外,由于使用CCS作為編譯環境,因此在文件的起始處,使用.global引入外部C文件聲明的函數,使用.def引出本文件中聲明的函數。

OSStartHighRdy()函數的作用是啟動第一個最高優先級任務,它的工作過程分為以下五個步驟:①設置PendSV異常中斷的優先級為最低。這樣能夠保證上下文切換是在沒有任何中斷需要被響應時進行的,保證系統的實時性。②設置PSP進程棧指針為0,指定是第一次任務切換。③設置OSRunning標志位1,表示系統已開始運行。④觸發PendSV中斷,實現上下文切換。⑤使能中斷。

OSCtxSw()和OSIntCtxSw()兩個函數的功能類似,都是完成任務的切換,不同的是一個是任務級的,一個是中斷級的,但由于是在cortex-M4上移植,所有的任務切換工作都在PendSV中斷函數中完成,以加快處理速度,因此這兩個函數的內容是完全一致的,只要觸發PendSV中斷即可。

PendSV函數是完成任務切換的核心函數,為了實現高低優先級任務間的切換,該函數必須完成以下幾個操作:①獲取進程堆棧指針PSP,如果是0則表示當前是第一次任務切換,無需保存寄存器;②保存S16~S31寄存器,其它FPU寄存器系統將自動保存;③保存R4~R11通用寄存器,其它CPU寄存器系統自動保存;④將PSP指針保存至TCB中,令OSTCBStkPtr指針的值等于PSP;⑤調用OSTaskSwHook鉤子函數,在任務切換之前完成用戶需要完成的一些特定工作;⑥獲得當前就緒的最高優先級任務,并從相應的TCB中獲得進程堆棧指針;⑦根據獲取的堆棧指針,從相應的堆棧中將S16~S31恢復至FPU中;⑧恢復R4~R11寄存器到CPU中,并執行相應的中斷返回指令。

2 總結

通過對基于cortex-M4內核的TM4C123G芯片工作原理以及內部寄存器研究,結合μC/OS-II實時操作系統移植的需求,正確配置了OS_CPU.h,OS_CPU.c,OS_CPU_A.asm三個文件,實現了實時操作系統在M4內核上的移植,實驗表明,使用操作系統可以很好的控制TM4C123G開發板上LED燈的閃爍,證明移植是成功的。

【參考文獻】

[1]肖圣兵,肖紅菊.μC/OS-II在ARM+Cortex-M3處理器上的移植[J].電子技術設計與運用,2014,8:54-55.

[2]關海,馮大政.μC/OS-II在基于Cortex-M3核的ARM處理器上的移植[J].電子科技,2009,22:69-73.

[3]潘麗蕊,袁保社.基于Cortex-M3核的μC/OS-II移植與應用[J].電腦知識與技術, 2010,5111-5114.

[4]盧有亮.嵌入式實時操作系統[M].北京:電子工業出版社,2014.

[責任編輯:湯靜]

猜你喜歡
移植
臍帶間充質干細胞移植治療難治性系統性紅斑狼瘡患者的療效分析
“移植”瘦人糞便能減肥?
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合