葛科勇,陳 堅,傅正財
(上海交通大學(xué) 電氣工程系 電力傳輸與功率變換控制教育部重點實驗室,上海 200030)
隨著電子信息技術(shù)的飛速發(fā)展,嵌入式系統(tǒng)已經(jīng)廣泛應(yīng)用于生產(chǎn)生活的方方面面[1]。同時,人們對嵌入式系統(tǒng)的性能要求也日趨提高。ARM和DSP是如今應(yīng)用最廣泛的兩種嵌入式處理器,它們有著不同的工作特性,因而也被應(yīng)用于不同的領(lǐng)域。DSP芯片由于其強大的數(shù)據(jù)處理能力和高運行速度,多被應(yīng)用于對實時性要求較高的各類數(shù)據(jù)處理任務(wù)。與DSP相對,采用精簡指令集計算機結(jié)構(gòu)(Reduced Instruction Set Computer,RISC)的ARM芯片實時處理性能較弱,但因其交互性強、功耗低、價格低廉以及擴展功能豐富等特點,更加適用于控制類的電子產(chǎn)品[2]。為了充分利用這兩種處理器的優(yōu)點以完成復(fù)雜的工作,TI公司于2009年推出了OMAP-L138 DSP與ARM的雙核嵌入式微處理器。該處理器的推出在極大地簡化了電路設(shè)計復(fù)雜度的同時也對軟件開發(fā)提出了更高的要求。嵌入式開發(fā)者在分別進行DSP與ARM應(yīng)用程序開發(fā)的同時,也需考慮如何實現(xiàn)兩個處理器之間的信號與數(shù)據(jù)交流。在大多數(shù)已發(fā)表的文獻中,雙核之間的通信設(shè)計是通過TI公司提供的SYSLINK或DSPLINK組件的進程間通信工具(Inter-Processor Communication,IPC)實現(xiàn)的[3-4]。該方法需在DSP處理器運行DSP/BIOS或SYS/BIOS實時操作系統(tǒng),適用于邏輯復(fù)雜、進程龐大的雙核通信任務(wù)。但這無形中也增加了軟件開發(fā)難度,同時頻繁地調(diào)用IPC函數(shù)也占用了一定的CPU資源,降低了通信效率。針對邏輯相對簡單、數(shù)據(jù)交互量較大的雙核通信任務(wù),本文設(shè)計一種基于直接中斷觸發(fā)的雙核通信方法。在該方法中ARM內(nèi)核運行Linux操作系統(tǒng),通過SYSLINK驅(qū)動中的slaveloader工具啟動DSP內(nèi)核并加載ARM與DSP端應(yīng)用程序。雙核間通信不再依賴IPC,DSP端可以裸機運行,雙核之間可以通過中斷直接觸發(fā)的方式進行異步事件通知,極大地簡化了程序設(shè)計的難度,提高了通信效率。
OMAP-L138是TI公司推出的達芬奇架構(gòu)嵌入式應(yīng)用處理器,該處理器采用DSP與ARM結(jié)合的非對稱多核結(jié)構(gòu),兼具DSP和精簡指令集計算機(RISC)技術(shù)的特點[5]。圖1為OMAP-L138的功能框圖。
圖1 OMAP-L138功能框圖Fig.1 Function diagram of OMAP-L138
DSP子系統(tǒng)包含一塊高性能的TMS320C674x DSP內(nèi)核芯片以及相應(yīng)的內(nèi)部儲存器(L1P,L1D和L2)。DSP子系統(tǒng)主要負責(zé)大批量的數(shù)據(jù)處理任務(wù)(如音頻處理)。ARM子系統(tǒng)由一塊32位RISC處理器ARM926EJ-S及相應(yīng)內(nèi)存空間組成,主要負責(zé)整個OMAP-L138系統(tǒng)的控制工作,如系統(tǒng)初始化、系統(tǒng)配置、電源管理、用戶接口以及與上位機的通信工作。除了片上資源,OMAPL138還有大量外設(shè)和外部儲存器供DSP與ARM子系統(tǒng)訪問。
與一般的嵌入式處理器不同,OMAP-L138處理器為雙核通信提供了特殊的硬件支持,這些硬件支持是所有雙核通信設(shè)計的基礎(chǔ)。首先,OMAP-L138的內(nèi)存與外設(shè)采用統(tǒng)一編址,除了少部分內(nèi)存僅DSP或ARM可以單獨訪問,其余內(nèi)存及外設(shè)是兩者共享的。同時,OMAP-L138雖然沒有為雙核通信提供指定的控制指令,但為此預(yù)留了用于雙核相互控制的中斷寄存器[6]。
如圖2所示,OMAP-L138在SYSCFG系統(tǒng)配置模塊中的存儲器映射寄存器(Memory Map Register,MMR)中分配5個CHIPINT中斷位,用于DSP和ARM之間的信號交流。DSP可以通過其中的4位SYSCFG_CHIPIN[0~3]通知ARM,ARM也可以通過SYSCFG_CHIPIN[2~3]通知DSP。另外系統(tǒng)設(shè)置1位SYSCFG_CHIPIN[4]用來觸發(fā)DSP不可屏蔽中斷(None Masked Interrupt,NMI)。對中斷寄存器的某一位置1操作將產(chǎn)生一個事件(event),該事件會被傳遞到相應(yīng)的中斷控制器(Interrupt Controller,INTC)。中斷控制器將事件映射到相應(yīng)CPU的中斷輸入,CPU接收到中斷后可以進行相應(yīng)的中斷處理[7]。
表1為OMAP-L138內(nèi)存的訪問權(quán)限設(shè)置。從表1中可以看出,OMAP-L138一共有3處存儲空間是DSP與ARM內(nèi)核共享的:256 KB的DSP L2 RAM,128 KB的內(nèi)部共享內(nèi)存以及256 MB的DDR外部共享空間[8]。這三種共享空間可以在不同場合下使用。256 KB的DSP L2 RAM可以用于ARM直接讀寫DSP RAM的雙核通信方式[9],128 KB的內(nèi)部共享空間可用于較小數(shù)據(jù)量的雙核通信,當(dāng)數(shù)據(jù)量較大時可以使用256 MB的DDR外部儲存。
表1 OMAP-L138內(nèi)存訪問權(quán)限Table 1 Memory access permission of OMAP-L138
如引言中所提到在已發(fā)表的文獻中,OMAP-L138的雙核通信都要依賴于SYSLINK或DSPLINK通信組件。這樣的通信方式需要在DSP處理器上運行SYS/BIOS(或較早版本稱為DSP/BIOS)操作系統(tǒng)。DSP運行操作系統(tǒng)在提高程序模塊化和并行性的同時,也在一定程度上占用了DSP的CPU,影響了DSP的數(shù)據(jù)處理速度。另外,在事件通知和內(nèi)存讀取時,頻繁調(diào)用IPC函數(shù)會降低通信效率,造成一些不必要的開銷。因此本設(shè)計提出一種應(yīng)用于DSP裸機運行情況下的雙核通信方式。該方式適用于數(shù)據(jù)量較大、邏輯簡單的ARM與DSP間的核間通信任務(wù),即DSP與ARM將需要交互的數(shù)據(jù)寫入共享內(nèi)存,再通知對方讀取。在該任務(wù)中,所要傳遞的消息是單義的,即“數(shù)據(jù)寫入完成,可以讀取”,因此消息的傳遞可以直接使用觸發(fā)中斷的方式。
ARM核心處理器運行嵌入式Linux操作系統(tǒng)。由于ARM嵌入式處理器資源有限,無法完成龐大的Linux操作系統(tǒng)開發(fā)任務(wù),所以嵌入式Linux的軟件開發(fā)都是在一種交叉開發(fā)環(huán)境下完成的[10]。交叉開發(fā)環(huán)境由主機(host)和嵌入式開發(fā)板(target)構(gòu)成。在軟件開發(fā)過程中,引導(dǎo)程序(Bootloader)、開發(fā)板嵌入式Linux內(nèi)核、文件系統(tǒng)以及應(yīng)用程序都在主機上進行開發(fā)和編譯,再燒寫到開發(fā)板運行。
本文設(shè)計中所用的主機Linux系統(tǒng)為Ubuntu 12.04,嵌入式Linux內(nèi)核為Linux 3.3.0,系統(tǒng)引導(dǎo)程序為UBoot(Universal Boot Loader),文件系統(tǒng)為根文件系統(tǒng)Rootfs(Root Filesystem)。內(nèi)核文件、文件系統(tǒng)和U-Boot文件在使用交叉編譯工具編譯后生成對應(yīng)的鏡像文件。這些鏡像文件可以通過Linux串口工具minicom燒寫到開發(fā)板NAND FLASH中。
DSP軟件開發(fā)工具為TI公司提供的集成開發(fā)環(huán)境CCS(Code Composer Studio)及 StarterWare DSP 軟件開發(fā)包。StarterWare是TI公司提供的用于嵌入式裸機開發(fā)的免費軟件開發(fā)包。該開發(fā)包提供了用于TI平臺下DSP與ARM開發(fā)的庫文件、封裝函數(shù)以及運用例程[7]。通過調(diào)用這些函數(shù),可以大大減輕開發(fā)難度。
本設(shè)計采用U-Boot引導(dǎo)ARM嵌入式Linux系統(tǒng)啟動,slaveloader引導(dǎo)DSP處理器啟動的啟動方式。該過程可以劃分為U-Boot加載、內(nèi)核引導(dǎo)、內(nèi)核初始化和應(yīng)用程序加載4個階段,如圖3所示。
第一階段為RBL(ROM Boot Loader)加載 U-Boot。RBL為TI公司固化在芯片ROM中的引導(dǎo)程序。OMAPL138上電時首先運行RBL程序。當(dāng)開發(fā)板設(shè)置為NAND FLASH啟動時,開發(fā)板上電后RBL會自動運行位于NAND FLASH起始位置的UBL(User Boot Loader)程序。UBL從NAND FLASH中讀取提前燒寫的U-Boot鏡像文件并將其拷貝至RAM中運行。
圖3 OMAP-L138雙核啟動過程Fig.3 Dual-core start-up process of OMAP-L138
第二階段為U-Boot引導(dǎo)Linux內(nèi)核。U-Boot在完成部分初始化后開始解壓Linux內(nèi)核鏡像,內(nèi)核解壓完成并校驗通過后,U-Boot將引導(dǎo)Linux內(nèi)核運行。
第三階段為內(nèi)核初始化系統(tǒng)。Linux系統(tǒng)開始運行后先進行一系列初始化工作,包括系統(tǒng)初始化、設(shè)備驅(qū)動初始化以及根文件系統(tǒng)初始化。
第四階段為應(yīng)用程序加載。系統(tǒng)初始化完成后,Linux系統(tǒng)啟動DSP處理器并加載運行DSP和ARM的應(yīng)用程序。
由于DSP裸機運行,DSP由ARM啟動加載。DSP的啟動使用SYSLINK中的slaveloader工具。slaveloader是TI公司提供的用來加載、啟動和停止DSP處理器的DSP管理工具[3]。DSP的啟動與應(yīng)用程序的加載由Linux腳本程序完成,腳本內(nèi)容如下:
在雙核通信設(shè)計中設(shè)置中斷寄存器位SYSCFG_CHIPIN[2]與 SYSCFG_CHIPIN[3]為DSP 中 斷專用,因此ARM端可以通過對SYSCFG_CHIPIN[2]或[3]相應(yīng)位進行置1操作,實現(xiàn)對DSP中斷的觸發(fā)。由于ARM運行的Linux系統(tǒng)采用虛擬內(nèi)存管理,寄存器的讀寫首先需要將SYSCFG_CHIPIN寄存器物理地址映射到Linux用戶空間,然后再對用戶空間內(nèi)所對應(yīng)虛擬地址進行置1操作。
DSP響應(yīng)ARM觸發(fā)的中斷則通過調(diào)用StarterWare軟件包中的DSP中斷控制函數(shù)實現(xiàn)??梢酝ㄟ^調(diào)用表2中API函數(shù)實現(xiàn)DSP的中斷控制。
表2 StarterWare DSP中斷控制函數(shù)Table 2 DSP interrupt control functions in StarterWare
與ARM觸發(fā)DSP中斷類似,DSP觸發(fā)ARM中斷可以直接對相應(yīng)寄存器位置1。為了直接捕獲DSP觸發(fā)的中斷,本設(shè)計編寫了ARMLinux中斷響應(yīng)驅(qū)動程序。該驅(qū)動將對應(yīng)的中斷寄存器位注冊為外部輸入設(shè)備,通過對該設(shè)備的監(jiān)聽來獲取中斷信息。中斷響應(yīng)的原理如圖4所示,當(dāng)ARM中斷被觸發(fā),即SYSCFG_CHIPIN[0]或[1]為1時,該驅(qū)動會向輸入子系統(tǒng)報告。輸入子系統(tǒng)隨即通知相對應(yīng)的事件管理器。事件管理器接收到通知后,將驅(qū)動提交的輸入事件復(fù)制到相應(yīng)的緩沖區(qū)。ARM程序可以通過輸入設(shè)備的設(shè)備文件讀取事件的值。通過判斷讀取的值即可確定中斷源。
讀取與判斷的代碼實現(xiàn)如下:
當(dāng)DSP或ARM捕獲到中斷后,就可以在中斷服務(wù)函數(shù)中進行共享內(nèi)存的讀寫。DSP讀寫內(nèi)存使用直接指針轉(zhuǎn)換的方式。DSP程序直接對所要操作的共享內(nèi)存起始地址進行指針轉(zhuǎn)換,再通過指針操作訪問內(nèi)存中的數(shù)據(jù)。ARM讀寫共享內(nèi)存時,首先需要將共享內(nèi)存映射到應(yīng)用程序空間,然后才能通過指針訪問內(nèi)存中的數(shù)據(jù)。
利用廣州創(chuàng)龍公司提供的OMAP-L138測試開發(fā)板TL138 Easy EVM設(shè)計前述介紹的基于直接中斷觸發(fā)的雙核通信程序。為了測試直接中斷觸發(fā)通信方式的效率,分別使用IPC與直接中斷觸發(fā)的方式完成一個FFT計算任務(wù),并對運行時間與CPU占用情況進行比較。
測試程序中ARM與DSP共同完成對給定時域數(shù)據(jù)的FFT計算。其中ARM負責(zé)與上位機進行通信,下載時域數(shù)據(jù)以及上傳計算生成的頻域數(shù)據(jù)。DSP通過調(diào)用StarterWare工具包中的API函數(shù)完成FFT計算。
對比程序的設(shè)計中除了雙核通信部分,其他任務(wù)在兩種方法中實現(xiàn)代碼相同。表3為使用直接中斷觸發(fā)方式與使用IPC方式完成該任務(wù)的花費時間與占用CPU情況。由表3中數(shù)據(jù)可知,本文提出的直接中斷觸發(fā)雙核通信方式用時更短,CPU占用率更低。
表3 直接中斷與IPC通信方式運行結(jié)果比較Table 3 Comparison of running results of direct interrupt mode and IPC mode
本文通過直接中斷觸發(fā)的方式實現(xiàn)了OMAP-L138開發(fā)板ARM與DSP處理器間的雙核通信,并通過測試程序完成了對通信方式的驗證。測試結(jié)果顯示,該方式可以滿足雙核通信的要求,且比IPC組件方式實現(xiàn)簡單,CPU占用更少,通信效率更高。