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