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