周春良1,2,樊文杰1,2,王連成1,2,馮曦1,2,周芝梅1,2,唐曉柯1,2
(1. 北京智芯微電子科技有限公司 國家電網公司重點實驗室 電力芯片設計分析實驗室,北京 100192;2. 北京智芯微電子科技有限公司 北京市電力高可靠性集成電路設計工程技術研究中心,北京 100192)
摘要:在介紹實時操作系統Nucleus Plus和LTE230芯片及硬件平臺的基礎上,詳細論述了Nucleus Plus移植過程中的系統啟動、系統初始化、內存管理、中斷管理、高級中斷和任務管理以及操作系統的測試,指出了Nucleus Plus在LTE230芯片上移植的重點和難點。目前移植的操作系統已成功應用于LTE230通信模塊中,操作系統的實時性、任務及中斷管理完全滿足系統需求。
關鍵詞:Nucleus Plus操作系統;CEVA-X1643 DSP;移植;中斷;任務
中圖分類號:TP316.2文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2017.01.007
引用格式:周春良,樊文杰,王連成,等. 實時操作系統Nucleus Plus在LTE230芯片上的移植[J].微型機與應用,2017,36(1):22-24,31.
0引言
LTE230芯片是針對230M電力無線通信專網推出的終端基帶芯片,芯片采用軟件無線電技術,除物理層時域部分用中頻電路實現,物理層頻域和比特符號級處理、協議層媒體訪問和無線資源控制、網絡層協議以及芯片內外大量設備管理都是用CEAVX1643 DSP(簡稱X1643)軟件來實現[1],因此軟件非常復雜,涉及到很多實時性要求較高的中斷和任務,傳統的基于中斷觸發的軟件架構已不能滿足芯片基帶處理的需要,須將實時操作系統及其多任務調度機制引入進來,通過多任務管理來完成系統的多種功能及功能的擴展與更新,達到簡化DSP軟件設計、提高開發效率的目的。
目前主流的商用實時操作系統都不支持X1643,同時使用CEVA DSP的芯片廠商所需支持操作系統皆是自行購買后進行移植,故可借鑒的經驗很少。經詳細評估,考慮到實時性、內核大小、用戶數等諸多因素,最終選定Mentor Graphics的Nucleus Plus操作系統(簡稱Nucleus)作為移植對象。Nucleus是為實時嵌入式應用而設計的一款基于優先級的搶先式多任務操作系統,支持ARM等主流處理器,最新版本接近99%的代碼是用ANSI C編寫的,非常便于移植。在典型的目標環境中,核心代碼不超過20 KB。Nucleus采用軟件組件的方法,易于替換和復用,常用組件包括任務控制、內存管理、中斷管理及定時器管理等[2]。
1芯片及其硬件平臺
芯片是一個以DSP為核心的SoC,整體結構如圖1所示,片內集成了高性能的X1643處理器、大容量的eDRAM存儲器、具有載波聚合功能的中頻模塊以及通用的UART、SPI、I2C、Timer、WDT、GPIO、PWM等外設。
基于芯片的通信模塊采用基帶芯片+射頻芯片的方案,如圖2所示。基帶芯片與射頻芯片之間的控制接口為SPI,數據接口為JESD207;與電力終端之間的控制與數據接口皆為串口。
2操作系統移植
Nucleus暫不支持X1643,在芯片上進行移植涉及到系統啟動、系統初始化、內存管理、中斷管理和任務管理等工作。X1643采用單指令多數據SIMD和超長指令字VLIW相結合的架構,其核心寄存器約有100多個,包括累加寄存器ACF、尋址寄存器ARF、程序寄存器SRF、模式和狀態寄存器MSR、斷定寄存器PR以及存儲子系統寄存器MSSR幾大類[3],相比于ARM處理器,寄存器的分類及功能有較大的不同,移植時有些寄存器的使用須特別注意。
2.1系統啟動
芯片通過BootStrap Pin來控制啟動方式。可經BootROM引導,通過串口或SPI Flash把操作系統和應用程序加載到TCM和eDRAM中執行;因X1643支持從指定的地址啟動,也可通過SPI控制器的memory mode直接從SPI Flash啟動程序;在早期的調試過程中,可使用JTAG仿真器把程序直接下載到TCM和eDRAM后開始執行。與ARM等處理器稍有不同的是,Program TCM不能通過X1643內部數據總線和芯片系統總線訪問,只能通過JTAG或使用Program DMA進行程序加載。
2.2系統初始化
系統正常啟動后,PC指針將跳到零地址,即Program TCM中,開始系統的初始化。首先進行板級初始化,主要過程如圖3所示。
BootROM中會對時鐘復位及存儲器控制等進行基本的初始化,在板級初始化時主要進行操作系統本身及X1643核的初始化操作。操作系統的啟動棧放在系統的內存池中,在切換到系統棧后,啟動棧占用的空間將會被回收到內存池中。X1643提供的“飽和”、“乘移位”、“模”等操作是針對特定的數字信號運算的,操作系統不會使用,在初始化中須關掉,以防誤觸發引起程序行為異常,匯編代碼如下:
;Clear all saturation mechanisms
mov moda, a0
or #0x1F, a0
;Disable multiplier post shift mechanisms
mov #0xFFFF1FFF, a1
and a1, a0
mov a0, moda
;Disable the modulo mechanisms
mov mod0, r0
ands r0, #0xffffff00, r0
mov r0, mod0
X1643采用編譯器驅動的架構,指令流水線的數據、資源及控制相關是通過編譯器來解決的,但編譯器對匯編代碼不做處理,故在編寫初始化及其他匯編代碼時,需手工加nop指令來隔離相關操作,這一點須特別注意。
板級初始化后的操作系統軟件組件初始化和應用程序初始化都是用C代碼實現的,其過程與在ARM處理器上相似,在此不再詳述。
2.3內存管理
Nucleus提供分區內存管理和動態內存管理兩種方式,前者具有非常好的確定性,但不夠靈活;后者非常靈活,但內存分配與回收的時延不夠確定。考慮到芯片基帶處理的內存需求很明確,故選用分區內存管理的方式。具體的內存分配如圖4所示。
圖4中,Code Segment0使用Program TCM, Data Segment0使用Data TCM, X1643是哈佛結構,兩個TCM使用相同的地址空間。eDRAM起始地址為0x400000,總容量2 MB,前一部分分配給代碼段,后一部分分配給數據段。內存池起始地址在BSS段之后,結束地址為eDRAM末尾。Nucleus要求BSS段是鏈接時的最后的數據段,BSS后的空間保留給內存池,不能被占用,但鏈接器在鏈接基帶處理中調用CEVA庫函數時看不到這個區域,須加鏈接約束,確保其位于BSS之前。
2.4中斷管理
X1643有5個中斷源,其中INT0、INT1和INT2分別來自中頻、外設(所有外設中斷經中斷控制器合成一個中斷源)和OS Tick Timer,INT3和INT4保留給X1643內部Program和Data DMA,僅在啟動時使用,可采用查詢方式。在操作系統中只對INT0、INT1和INT2進行處理,且這三個中斷使用統一的通用中斷處理程序,通過ID來區分。在操作系統中,可調用NU_Register_LISR把每個低級中斷服務程序LISR注冊到中斷函數指針數組中。LISR耗時極短,僅能調用極少的系統服務,復雜的數據處理及系統調用可激活高級中斷服務程序HISR來完成。
當中斷發生時,處理流程如下:
(1)進入中斷入口,關中斷(硬件) ;
(2)設置中斷ID到a0,并保存a0原先的值到棧中,進入通用中斷處理程序;
(3)保存X1643寄存器到棧中(push);
(4)保存棧指針,切換棧指針到系統棧;
(5)跳轉到操作系統中斷服務入口,進行中斷處理(LISR);
(6)恢復棧指針;
(7)如中斷服務程序要求上下文切換,進行上下文切換(context switch,HISR);
(8)從棧中恢復X1643寄存器(pop);
(9)恢復中斷ID占用的a0寄存器;
(10)開中斷,中斷返回。
編譯器把X1643內部寄存器分為兩類:CallUsed寄存器和CallSaved寄存器[4]。為提高中斷處理效率、降低處理延遲,在步驟(3)、(8)中僅保存和恢復CallUsed寄存器。CallUsed寄存器主要有:
ACF(40bit register):a0~a7,a16~a23
ARF:r0~r3,g1~g3,s0~s1,modu0,modu1
SRF :lcstep0,lcstep1, lci0~lci3
MSR和PR: mod0,moda
2.5高級中斷和任務管理
Nucleus高級中斷可認為是一種優先級較高的任務,兩者都有各自的堆棧空間,在創建時進行堆棧初始化,在調用之前要保存上下文(堆棧),在調用之后要恢復上下文(堆棧)。在移植操作系統時,重點關注的是高級中斷和任務與X1643體系結構及編譯器密切相關的堆棧結構及初始化、堆棧保存及恢復的實現過程。
Nucleus堆棧有兩種:Solicited Stack和Unsolicited Stack。堆棧初始值僅在第1次調用時會用到,此時真正需要通過堆棧得到的值是高級中斷和任務運行的地址及傳遞的參數,大多數寄存器初值只要不影響運行,可不初始化。
Solicited Stack用于高級中斷,是一種minmum stack。在進入LISR時,已保存了CallUsed寄存器,Solicited Stack只須保存CallSaved寄存器。Solicited Stack數據結構是在C語言中聲明的。需要注意的是,X1643 ACF a8~a15是40 bit的寄存器,為使push/pop處理方便,高8位按“UINT32 a8e”方式聲明。此外,針對數字信號處理中大量運算都集中在循環執行少量核心代碼上,為省去循環計數測試指令,X1643設置了最大4級嵌套的零消耗循環控制專門硬件(BlockRepeat Mechanism Register[3])來提高代碼執行效率。用匯編語言編寫高性能循環代碼或用C語言編寫,且在加高級優化選項編譯時會用到循環控制硬件寄存器,為確保程序運行正常,須初始化這4組寄存器為0。同樣在進行上下文切換時,須對這4組寄存器進行保存和恢復,這4組寄存器使用相同的名字,其保存匯編代碼如下:
bkst ;第1組
push{dw}bknest1 || push{dw} bknest0
;第2/3組與第1組操作類似,此處省略
bkst ;第4組
push{dw} bknest1 ||push{dw} bknest0
Unsolicited Stack用于任務,須保存當前所有寄存器,其初始化、保存及恢復操作與Solicited Stack類似,但因其包含了用于“飽和”、“模”等操作的寄存器,故須對MSR的mod0和moda進行初始化。
3操作系統測試
操作系統移植后的測試分兩步:首先應用Kernel Demo[2]進行基本功能測試;然后應用LTE230附著過程進行典型場景測試。
Kernel Demo創建了7個任務、1個消息隊列、1個信號量和1個事件組。Task_0是一個定時器任務,每隔1 s產生一個事件;Task_1是一個生產者任務,向隊列中發送消息;Task_2是一個消費者任務,從隊列中獲取消息;Task_3和Task_4使用相同的任務入口函數來競爭一個信號量;Task_5等待Task_0產生的事件,并對事件進行計數;Task_6檢測串口按鍵輸入,輸出Task_0到Task_5的狀態信息。
LTE230附著是終端開機后與網絡建立連接的必要過程,包括小區搜索、隨機接入、MIB/SIB接收等步驟。在附著過程中,除OS Tick中斷外,還須處理中頻模塊收發相關的4個中斷、1個物理層定時中斷、發送和接收2個任務以及中斷與任務之間的信號量通信。
Kernel Demo和LTE230附著過程正常工作,表明操作系統的多任務調度、中斷處理及通信機制功能正常,在此基礎上,可進行完整的芯片驅動、LTE協議棧、TCP協議棧、業務通道處理等整個軟件系統的移植和測試。
4結論
本文詳細介紹了Nucleus在LTE230芯片上的移植過程和注意事項,目前移植的操作系統已在試點項目的通信
模塊中穩定運行了一年多,充分表明操作系統移植是很成功的。因操作系統移植是基于LTE230芯片的X1643進行的,故在移植過程中需對X1643內核寄存器有深刻的理解,用匯編語言完成板級初始化及任務調度和中斷處理時對內核寄存器的保存和恢復等操作,這是針對一款新的處理器進行操作系統移植的重點和難點。本文論述的方法對其他嵌入式實時操作系統在CEVA系列DSP核上進行移植也有重要的參考意義。
參考文獻
[1] 周春良,張峰,程倫,等. LTE230無線通信基帶芯片的設計與應用[J].電子技術應用,2015,41(12):4850
[2]Mentor Graphics,Inc.. Nucleus Kernel Guide[Z].2013.
[3] CEVA,INC.. CEVAX1643 Architecture Specification[Z].2012.
[4]CEAV,INC.. SmartNcode SDT Users Guides V9.2[Z].2011.