馮瑞青,張 激,趙俊才
(華東計算技術(shù)研究所,上海 201808)
隨著集成電路技術(shù)的快速發(fā)展,嵌入式處理器早已從單核過渡到多核時代[1].在移動通信、雷達(dá)信號處理、航天、工控、機(jī)器人等領(lǐng)域,不僅需要高性能、低功耗的處理器,而且要求單個芯片能夠處理各種場景的應(yīng)用,如系統(tǒng)控制、信號處理、通信技術(shù)、圖形、圖像顯示等.同構(gòu)多核處理器功能單一,如Cortex-A9[2],無法應(yīng)對復(fù)雜多樣的場景,異構(gòu)多核處理器(Heterogeneous Multi-core Processor,HMP)應(yīng)運(yùn)而生.典型的異構(gòu)多核處理器有IBM公司的Cell Broad-Band Engine[3]、ARM 公司的 big.LITTLE[4]、TI公司的SitaraTMAM57x系列[5]、華為公司的麒麟970等.
國內(nèi)外針對某種特定構(gòu)架(如ARM、MIPS、X86)的嵌入式操作系統(tǒng)比較多,典型的有RT-Thread、ReWorks、DeltaOs、VxWorks、QNX、RT-Linux、SYS/BIOS等.目前,異構(gòu)多處理器大多采用單一的嵌入式操作系統(tǒng).為充分發(fā)揮異構(gòu)處理器的性能,需要在不同的核上運(yùn)行不同的操作系統(tǒng),因此多操作系統(tǒng)的通信協(xié)同技術(shù)非常關(guān)鍵.目前,對異構(gòu)多核處理器的操作系統(tǒng)、片上通信技術(shù)等方面的研究還并不是十分成熟.由于異構(gòu)多核處理器的特殊性,實現(xiàn)不同核上任務(wù)調(diào)度以及不同核之間的實時通信和調(diào)度,利用不同類型處理器的各自性能特點,才能充分發(fā)揮異構(gòu)多核處理器的性能優(yōu)勢[6].
本文對異構(gòu)多核處理器的發(fā)展以及異構(gòu)多核的核間通信機(jī)制進(jìn)行研究;著重研究分析了“ARM+DSP”片上基于共享總線的Mailbox異構(gòu)多核間通信機(jī)制;以TI公司的SitaraTMAM571為例設(shè)計實現(xiàn)了ARM核上Linux與DSP核上ReWorks之間的多核通信組件、DSP核的動態(tài)加載程序、協(xié)同計算等功能.
“RISC+DSP”架構(gòu)作為一種典型的異構(gòu)多核架構(gòu)在嵌入式領(lǐng)域應(yīng)用非常廣泛.“RISC+DSP”架構(gòu)將通用處理器與專用處理器融合,集合了通用處理器的通用性好、任務(wù)管理能力強(qiáng)和專用處理器的計算能力強(qiáng)的優(yōu)點,在功耗有限的前提下極大提升了系統(tǒng)性能[7,8].其中,“ARM+DSP”架構(gòu)是最常見的"RISC+DSP"架構(gòu)之一,見圖1.
本文以TI公司的AM5718為實例完成了具體的設(shè)計與實現(xiàn).TI公司在2015年推出的是一款為工業(yè)自動化應(yīng)用包括人機(jī)交互(HMI),工業(yè)通信、自動化和控制,機(jī)器視覺以及其它通用應(yīng)用設(shè)計的28 nm集成工藝的高性能處理器.ARM+DSP異構(gòu)多核處理器構(gòu)融合了可編程的視頻處理功能與高度集成的外設(shè),旨在提供集高集成度、可拓展性和外設(shè)與一體的芯片[9],見圖2.
圖1 ARM+DSP 異構(gòu)多核處理器結(jié)構(gòu)圖
圖2 AM5718 框圖
目前異構(gòu)多核處理器大多只有主核運(yùn)行操作系統(tǒng),其它核作為協(xié)處理器.這種架構(gòu)的特點是主核功能較為復(fù)雜,負(fù)責(zé)全局任務(wù)、資源的管理和調(diào)度,從核功能單一接受主核的管理,負(fù)責(zé)執(zhí)行由主核分配的任務(wù).這種操作系統(tǒng)結(jié)構(gòu)簡單便于設(shè)計實現(xiàn).如ARM+DSP異構(gòu)處理器在ARM核上運(yùn)行Linux,由ARM核通過指令或共享存儲設(shè)備實現(xiàn)協(xié)處理器的運(yùn)算.ARM負(fù)責(zé)事件管理和I/O接口等功能,DSP負(fù)責(zé)計算加速.這種多核協(xié)同加速處理的模式在大部分情況下可以同時滿足通用性和計算能力的要求[10].上述模式存在DSP核無法直接連接外設(shè)、DSP計算程序固定且修改程序的工作量大等缺陷.如何避免ARM核的多余過程并且實現(xiàn)動態(tài)加載DSP程序成為關(guān)鍵問題.在主核的操作系統(tǒng)上對從核進(jìn)行程序動態(tài)加載,并在從核上部署操作系統(tǒng),通過核間通信組件可以簡化上述模式流程,更好發(fā)揮從核的協(xié)同處理能力,靈活應(yīng)對復(fù)雜應(yīng)用場景.
本文在AM5718的ARM上運(yùn)行TI官方提供的嵌入式Linux內(nèi)核,在DSP核上運(yùn)行銳華操作系統(tǒng).嵌入式Linux操作系統(tǒng)是一款成熟穩(wěn)定的開源操作系統(tǒng),適用于不同的 CPU,支持如 X86,ARM,MIPS 等多種體系架構(gòu),具有內(nèi)核小、穩(wěn)定性高、資源豐富、可裁剪性強(qiáng)和結(jié)構(gòu)靈活等特點.
在AM5718的DSP核上運(yùn)行“銳華”ReWorks操作系統(tǒng).“銳華”操作系統(tǒng)是中國電子科技集團(tuán)公司第三十二研究所(華東計算技術(shù)研究所)自主研制的嵌入式實時操作系統(tǒng),提供了面向主流DSP芯片的高性能國產(chǎn)基礎(chǔ)軟件解決方案.操作系統(tǒng)內(nèi)核采用了“十二五”核高基成果--“銳華”ReWorks嵌入式實時操作系統(tǒng).ReWorks內(nèi)核可搶占,中斷可嵌套,具備高效的中斷管理機(jī)制和任務(wù)調(diào)度、上下文切換算法,具有強(qiáng)實時性;采用微內(nèi)核的體系架構(gòu)和面向?qū)ο蟮脑O(shè)計方法,具有良好的可裁剪性;支持C/C++編程語言,提供POSIX接口,具有較強(qiáng)的可移植性;提供故障檢測、隔離和恢復(fù)框架,具有高可靠性;提供核心擴(kuò)展接口,具備良好的系統(tǒng)可維護(hù)性;此外作為自主可控操作系統(tǒng)具有可持續(xù)性等特點[11].
銳華DSP操作系統(tǒng)軟件組成,如圖3所示,主要包括三部分:底層CSP(芯片級支持包)/BSP(板級支持包)、操作系統(tǒng)核心和擴(kuò)展功能組件.
圖3 “銳華”DSP 操作系統(tǒng)軟件組成
“銳華”DSP實時操作系統(tǒng)在系統(tǒng)裁剪、實時性、易用性、性能、標(biāo)準(zhǔn)化方面具備一定的優(yōu)勢,與TI的DSP操作系統(tǒng)SYS/BIOS相比,ReWorks內(nèi)核除了支持任務(wù)管理、信號量、消息隊列的功能外還擁有條件變量、任務(wù)讀寫鎖等SYS/BIOS不支持的功能點.經(jīng)對比測試,“銳華”在相同的測試平臺上多項功能、實時性優(yōu)于SYS/BIOS,滿足嵌入式實時操作系統(tǒng)的各項性能指標(biāo)要求.在下一章中,本文將設(shè)計一系列核間通信組實現(xiàn)上述兩種嵌入式操作系統(tǒng)在不同核上的部署以及核間的協(xié)同處理.
首先在ARM、DSP核上分別完成Linux和ReWorks的適配移植工作.設(shè)計一種核間通信組件基于MailboxMessage(郵箱消息)機(jī)制實現(xiàn)片上處理器之間通信.其中,Mailbox中包含ARM和DSP的共享數(shù)據(jù)寄存器組以及各自的控制/狀態(tài)寄存器.ARM和DSP通過訪問共享寄存器和共享內(nèi)存來完成數(shù)據(jù)交互,通過訪問控制/狀態(tài)寄存器來完成狀態(tài)同步.多核通信組件使用隊列郵箱中斷機(jī)制允許兩個不同的處理器之間通過一系列的寄存器和關(guān)聯(lián)中斷信號發(fā)送和接收消息來建立通信通道,總體框架見圖4.
AM5718執(zhí)行兩種郵箱類型:一種是IVA郵箱,數(shù)量為1個,用于圖像加速子系統(tǒng)與其它核之間的通信;另一種是系統(tǒng)級郵箱,共有13種,用來實現(xiàn)ARM與DSP、IPU等子系統(tǒng)之間的通信.每個郵箱模塊支持如下特性:可配置參數(shù),包括:用戶數(shù),郵箱消息、隊列數(shù),每個消息隊列 (FIFO,先進(jìn)先出)的消息數(shù);32-bit的消息寬度;使用中斷完成消息接收通知和隊列未滿的通知;支持 16/32-bit尋址空間[12].
總體的設(shè)計思路:ARM核作為主核先啟動并且運(yùn)行Linux操作系統(tǒng),設(shè)計ImageLoader動態(tài)加載工具,在Linux運(yùn)行ImageLoader將ReWorks鏡像文件動態(tài)加載到DSP核上.DSP上ReWorks操作系統(tǒng)等待任務(wù)消息;Linux將任務(wù)數(shù)據(jù)寫入共享內(nèi)存,并發(fā)送任務(wù)消息給 ReWorks.收到消息后,ReWorks 從共享內(nèi)存讀取任務(wù)數(shù)據(jù),并執(zhí)行相應(yīng)的操作,發(fā)送MailboxMessage通知ARM任務(wù)完成.接下來的章節(jié)將詳細(xì)介紹具體實現(xiàn)方法.
TI公司將AM5718的ARM核設(shè)計為主核,上電后ARM核最先啟動,首先對ARM核上Linux側(cè)的MailboxDriver模塊和ImageLoader動態(tài)加載工具進(jìn)行設(shè)計.
設(shè)計Linux系統(tǒng)下MailboxDriver模塊,MailboxDriver模塊包括:DSP子時鐘系統(tǒng)初始化模塊、DSP子系統(tǒng)啟動模塊、郵箱設(shè)備初始化模塊、MPU/DSP消息管理模塊、郵箱中斷模塊、郵箱管理模塊、共享內(nèi)存管理模塊等子模塊.MailboxDriver模塊初始化主要流程為:注冊郵箱字符設(shè)備創(chuàng)建dsp_mailbox,配置MPU和DSP寄存器,分別為 ARM和DSP創(chuàng)建一個共享內(nèi)存區(qū)域查找表,初始化DSP子系統(tǒng)時鐘、喚醒DSP,初始化郵箱中斷,模塊初始化完成.
在MailboxDriver模塊加載完成后,通過創(chuàng)建的dsp_mailbox設(shè)備可將ReWorks鏡像文件動態(tài)加載到DSP核,設(shè)計ImageLoader動態(tài)加載工具將ReWorks鏡像加載到DSP核.
ImageLoader動態(tài)加載工具的關(guān)鍵技術(shù)在于elf(coff)格式文件分析與加載;根據(jù)elf文件格式解析鏡像文件信息,獲取代碼段、數(shù)據(jù)段等段的數(shù)據(jù)內(nèi)容與相應(yīng)地址、段長度等信息,將數(shù)據(jù)寫到相應(yīng)的內(nèi)存地址.程序計數(shù)器獲取入口地址,程序從入口開始執(zhí)行.
創(chuàng)建dsp_mailbox設(shè)備句柄,將鏡像入口地址傳入dsp_mailbox設(shè)備并賦值給mailbox.ImageLoader的主要流程為先執(zhí)行elf_load函數(shù),得到入口地址entry;再執(zhí)行start_dsp函數(shù),鏡像文件加載完成.ImageLoader工具允許用戶自定義鏡像文件和目標(biāo)核,此設(shè)計同樣適用于其他異構(gòu)多核平臺.
Linux啟動后先安裝側(cè)完成MailboxDriver模塊安裝,創(chuàng)建mailbox字符設(shè)備并創(chuàng)建設(shè)備號等,運(yùn)行ImageLoader工具加載鏡像創(chuàng)建一個計算任務(wù)并將任務(wù)數(shù)據(jù)寫入共享內(nèi)存特定地址,檢查DSP郵箱狀態(tài);當(dāng)DSP郵箱可用時,向DSP發(fā)送消息;收到DSP發(fā)送來的消息后,讀取信息并從共享內(nèi)存的指定地址讀取結(jié)果,完成計算任務(wù)并釋放郵箱,Linux側(cè)流程圖見圖5.
設(shè)計在 DSP ReWorks添加郵箱中斷模塊,ReWorks嵌入式實時操作系統(tǒng)從c_int00開始執(zhí)行,逐步完成操作系統(tǒng)運(yùn)行環(huán)境初始化(例如處理器寄存器初始化、堆棧初始化等).然后跳轉(zhuǎn)到ReWorks內(nèi)核的入口函數(shù)main中完成操作系統(tǒng)啟動.設(shè)計在ReWorks啟動過程的中斷模塊初始化(int_module_init)增加Mailbox中斷模塊,具體流程見圖6.
圖6 ReWorks郵箱中斷模塊初始化流程圖
DSP核ReWorks啟動后創(chuàng)建idle任務(wù)掛起.ReWorks收到消息后從共享內(nèi)存特定地址讀取數(shù)據(jù)并處理,將計算結(jié)果寫入共享內(nèi)存特定地址;檢測ARM郵箱狀態(tài),ARM郵箱可用時,向ARM發(fā)送消息;使能中斷,釋放郵箱并退出中斷,繼續(xù)掛起.DSP 側(cè)流程圖見圖7.
圖7 ReWorks 側(cè)流程圖
Linux創(chuàng)建計算任務(wù)后需要將本地的任務(wù)數(shù)據(jù)寫入共享內(nèi)存地址.由于共享內(nèi)存區(qū)域在異構(gòu)多核處理器的不同核上會映射到不同的地址空間,即同一塊共享內(nèi)存區(qū)域在不同處理器的本地地址空間的邏輯位置不同,因此當(dāng)ARM Linux創(chuàng)建計算任務(wù)后通過將查找共享內(nèi)存地址表將本地內(nèi)存地址映射到共享內(nèi)存地址,根據(jù)本地指針及區(qū)域ID獲取當(dāng)前共享區(qū)域指針,將任務(wù)數(shù)據(jù)寫入共享內(nèi)存后,通過消息將共享內(nèi)存地址發(fā)送給 DSP.ReWorks DSP 收到任務(wù)消息時,郵箱中斷觸發(fā),進(jìn)入中斷程序后讀取消息中的共享內(nèi)存地址.ReWorks從共享內(nèi)存讀取任務(wù)數(shù)據(jù)需要先完成相應(yīng)的地址轉(zhuǎn)換,獲取本地地址后從共享內(nèi)存中讀取任務(wù)數(shù)據(jù)并完成相應(yīng)的計算;將結(jié)果寫入轉(zhuǎn)換后的共享內(nèi)存地址,以消息形式發(fā)送給ARM核,ARM核得到計算結(jié)果后繼續(xù)向下執(zhí)行,至此一次數(shù)據(jù)交互完成,交互流程見圖8.
圖8 Linux 與 ReWorks交互流程圖
在完成設(shè)計之后,我們在AM5718上進(jìn)行了測試,ARM和DSP核分別使用RT-Linux和ReWorks-2.1實時DSP操作系統(tǒng),依次進(jìn)行下列操作:
(1)MailboxDriver模塊安裝,測試結(jié)果顯示郵箱配置成功,DSP子系統(tǒng)初始化完成.
(2)創(chuàng)建設(shè)備號,使用 ImageLoader工具加載鏡像,DSP程序的入口地址讀取正確,將各個段寫入相應(yīng)地址成功.
(3)核間通信測試,由ARM向DSP發(fā)送消息,DSP收到消息后從共享內(nèi)存讀取運(yùn)算數(shù)據(jù),完成后向ARM發(fā)送消息.
(4)ReWorks 任務(wù)切換測試,在 ReWorks 創(chuàng)建兩個任務(wù)進(jìn)行任務(wù)切換.經(jīng)測試,ReWorks任務(wù)切換符合實時性要求.
(5)協(xié)同計算:ReWorks接受 Linux 上發(fā)來的任務(wù)消息,成功調(diào)用FFT函數(shù)完成,并將結(jié)果以消息形式返回給Linux.
ImageLoader對ELF鏡像程序進(jìn)行分析,解析符號表并分配相應(yīng)的內(nèi)存空間后寫入鏡像.測試加載一個2 MB的鏡像文件,使用ImageLoader的整個加載過程實際耗時6.8 s.而使用常用的J-TAG加載相同的鏡像耗時 8.7 s.因此,ImageLoader在加載效率上具有優(yōu)勢.ImageLoader直接在 ARM 上運(yùn)行,對 DSP進(jìn)行動態(tài)加載不需要斷電重啟,相比J-TAG等工具加載的復(fù)位等過程加載完成后,在ReWorks操作系統(tǒng)可以實現(xiàn)DSP 核上的任務(wù)切換,任務(wù)切換時間為 0.25 us,符合實時性要求.繼續(xù)使用ImageLoader向指定地址繼續(xù)動態(tài)加載應(yīng)用程序,這種逐層加載的方式具有靈活且簡易的優(yōu)勢.
本文主要論述了國產(chǎn)DSP嵌入式實時操作系統(tǒng)ReWorks面向異構(gòu)多核平臺的核間通信研究和設(shè)計,基于RISC+DSP共享總線的郵箱機(jī)制,著重對ARM Linux與 DSP ReWorks核間通信進(jìn)行了研究分析,設(shè)計并實現(xiàn)了Mailbox郵箱驅(qū)動模塊、DSP鏡像動態(tài)加載程序和ReWorks郵箱中斷模塊一系列核間通信組件.通過硬件開發(fā)板和軟件程序?qū)Ρ疚牡脑O(shè)計進(jìn)行了驗證和測試分析.
本設(shè)計能夠?qū)崿F(xiàn)Linux端對DSP程序的動態(tài)加載并可以實現(xiàn)與ReWorks的核間通信,增強(qiáng)了DSP的協(xié)同處理能力,降低了DSP應(yīng)用程序的開發(fā)難度,提高了開發(fā)效率.多核處理器的負(fù)載均衡等問題仍然是協(xié)同處理技術(shù)的難點,我們會在后續(xù)的研究工作中在ReWorks操作系統(tǒng)上繼續(xù)改進(jìn)或提出新的方案.