林淦,劉建群,許東偉,李嘉健
(廣東工業(yè)大學(xué)機(jī)電工程學(xué)院,廣東廣州510006)
TI 公司于2009年推出了一款高性能、低功耗的浮點、定點能力兼?zhèn)涞娜码p核處理器——OMAPL138。OMAPL138 是基于DSP 的SoC,采用C6748 DSP 內(nèi)核+ARM9 內(nèi)核的雙核結(jié)構(gòu),可實現(xiàn)高達(dá)375/456MHz 的內(nèi)核頻率。利用片上嵌入式微處理器內(nèi)核ARM9,開發(fā)人員可以在操作系統(tǒng)平臺上充分利用浮定點兼容C6748 DSP 來支持高強(qiáng)度的數(shù)據(jù)實時處理計算,同時將非實時性任務(wù)交給ARM9 內(nèi)核負(fù)責(zé),這種優(yōu)異的架構(gòu)能幫助設(shè)計者開發(fā)出更為出色的產(chǎn)品[1]。
文中主要介紹一種基于OMAPL138 雙核握手通信的機(jī)制。在ARM 端運(yùn)行LINUX 系統(tǒng),主要處理人機(jī)交互、向DSP 發(fā)送數(shù)據(jù)等任務(wù);而在DSP 端運(yùn)行DSPBIOS,循環(huán)地接收從ARM 傳來數(shù)據(jù),進(jìn)行運(yùn)算處理。該設(shè)計充分地利用ARM 和DSP 自身的強(qiáng)大優(yōu)勢,為工業(yè)控制上需要高強(qiáng)度運(yùn)算的實時控制系統(tǒng)設(shè)計提供了一定的借鑒和參考。
OMAPL138 是一款集成了ARM926EJ-S 和C6748 DSP 的雙核處理器。對比DSP C6000 系列,OMAPL系列更具有低功耗、高處理能力等優(yōu)勢。其內(nèi)部集成了EDMA3、EMIFA、EMAC、SPI 等豐富的外設(shè)接口,ARM 和DSP 都可以獨自操作這些外設(shè)。由于具有高運(yùn)算處理能力和先進(jìn)的電源管理,使得OMAPL 系列非常適合智能和工業(yè)行業(yè)的應(yīng)用[2]。OMAPL138 嵌入式雙核處理器的內(nèi)部系統(tǒng)框圖如圖1所示。
該設(shè)計以O(shè)MAPL138 為硬件平臺,實現(xiàn)雙核快速、準(zhǔn)確地通信。該設(shè)計具有以下幾個優(yōu)勢:
(1)OMAPL138 雙核之間大數(shù)據(jù)量通信的一般方式是采用發(fā)送方先往共享內(nèi)存(也就是在圖1 外設(shè)系統(tǒng)中128 kB RAM)寫數(shù)據(jù),然后直接給接收方一個中斷,接收方在響應(yīng)中斷后再進(jìn)行讀寫數(shù)據(jù)。而該設(shè)計對于大數(shù)據(jù)量的傳輸是采用ARM 直接對DSP RAM 進(jìn)行讀寫操作,大大提高了兩核之間的通信速度。
(2)系統(tǒng)啟動后,兩核單獨運(yùn)行,這樣就存在雙核運(yùn)行速度不協(xié)調(diào)的問題。設(shè)計中,通過利用DSPLINK 中的MSG 模塊,協(xié)調(diào)兩核之間的運(yùn)行速度,解決了雙核運(yùn)行速度不協(xié)調(diào)的問題。
(3)在DSP 端采用兩級循環(huán)緩存區(qū),避免了DSP 在進(jìn)行高速實時運(yùn)算時,雙核之間的數(shù)據(jù)讀寫沖突,并減少了DSP 讀取數(shù)據(jù)的時間,提高了系統(tǒng)的強(qiáng)實時性。
圖1 OMAPL138 嵌入式雙核處理器的內(nèi)部系統(tǒng)框圖
OMAPL138 擁有總共4 GB 的存儲器地址空間,地址范圍為0x00000000-0xFFFFFFFF。OMAPL138 所有外設(shè)資源,包括片內(nèi)存儲器、片外存儲器和各個控制寄存器等共同分享了這4 GB 地址空間。其中,共享內(nèi)存的地址范圍為0x80000000-0x8001FFFF,占了128 kB[3-4]。DSPLINK 是TI 提供的通用雙核通信的API 函數(shù),它包含了PROC、MSG、CHNL、POOL 等組件。DSPLINK 大部分通信原理都是發(fā)送方(ARM或DSP)將數(shù)據(jù)放在128 kB 的共享內(nèi)存中,然后給接收方一個中斷,告知接收方可接收數(shù)據(jù)[5]。而這其中的實現(xiàn)過程都是由DSPLINK 封裝好的。
該設(shè)計在ARM 端運(yùn)行LINUX 操作系統(tǒng),加載dsplink.ko 驅(qū)動,在ARM 應(yīng)用程序中調(diào)用DSPLINK的函數(shù)庫。同時在DSP 端運(yùn)行DSPBIOS 實現(xiàn)與ARM的握手通信,通信機(jī)制的整體設(shè)計框架如圖2所示[6-8]。
圖2 通信機(jī)制的整體設(shè)計框架
該設(shè)計使用了 PROC、MSG、POOL 這3 個DSPLINK 組件。其中:
(1)PROC 組件。PROC_write 可對DSP 內(nèi)部的L2 RAM 直接進(jìn)行寫操作,可以傳輸大容量數(shù)據(jù),無需通過共享內(nèi)存。
(2)MSG 組件。MSG_put 和MSG_get 可進(jìn)行信息發(fā)送和接收,所有信息內(nèi)容都被包含在SampleMessage 結(jié)構(gòu)體中。MSG 傳輸?shù)淖止?jié)大小就是sizeof(SampleMessage),它必須與128 字節(jié)對齊。而SampleMessage 結(jié)構(gòu)體的成員可自行定義,例如該設(shè)計就把PROC_write 在DSP RAM 寫的首地址和寫的長度封裝在結(jié)構(gòu)體中。
#define DSPLINK_BUF_ALIGN 128
DSPLINK _ ALIGN(sizeof(SampleMessage),DSPLINK_BUF_ALIGN)
(3)POOL 組件。為MSG 組件在外設(shè)DDR 中分配內(nèi)存區(qū),其分配大小就是sizeof(SampleMessage)的大小。
由于ARM 啟動后就會喚醒DSP,之后它們之間就各自運(yùn)行自己的程序。為了解決兩核之間的協(xié)調(diào)問題,該設(shè)計利用了DSPLINK 中的MSG 組件。一方面,MSG 為兩核之間傳遞一些狀態(tài)變量,使它們可以獲取對方執(zhí)行的情況;另一方面,接收方接收消息是采用無限等待模式,這就解決了兩核之間執(zhí)行速度快慢不協(xié)調(diào)的問題。雙核的握手機(jī)制示意圖如圖3所示。
圖3 雙核的握手機(jī)制示意圖
在工業(yè)控制應(yīng)用中,對于外接設(shè)備的控制,如伺服電機(jī)的控制等,都必須要求是實時的。這就要求DSP 必須不間斷地實時地在內(nèi)存中讀取數(shù)據(jù),運(yùn)算后輸出控制命令。若采用DSP 處理完ARM 傳來的一幀數(shù)據(jù)后,再請求ARM 發(fā)另一幀數(shù)據(jù)來進(jìn)行運(yùn)算處理的方案,不能滿足強(qiáng)實時性的要求。因此,該設(shè)計建立了兩級循環(huán)緩存區(qū),以確保緩存區(qū)中總有數(shù)據(jù)供DSP 進(jìn)行實時運(yùn)算。
DSP 端建立的兩級循環(huán)緩存區(qū)如圖4所示。DSP L2 RAM 為一級緩存區(qū),循環(huán)存儲從ARM 發(fā)過來的數(shù)據(jù),而在外設(shè)DDR 中開辟第二級緩存區(qū)。DSP 在第二級緩存區(qū)DDR 中讀取數(shù)據(jù),進(jìn)行實時運(yùn)算處理。建立兩級循環(huán)緩存區(qū)作用在于:(1)避免了DSP 進(jìn)行實時運(yùn)算時讀取數(shù)據(jù)與ARM 往DSP L2 RAM 寫數(shù)據(jù)的沖突;(2)減少了DSP 進(jìn)行實時計算時的讀取數(shù)據(jù)的時間,提高了系統(tǒng)的強(qiáng)實時性。
圖4 DSP 端建立的兩級循環(huán)緩存區(qū)
首先,在ARM 端定義Message 結(jié)構(gòu)體,其狀態(tài)變量如下:
Message 就是上面提到MSG 傳遞的結(jié)構(gòu)體。發(fā)送方通過修改該結(jié)構(gòu)體的成員變量,從而告知對方當(dāng)前的運(yùn)行情況。
其次,ARM 隨時用MSG_get 獲取Message 結(jié)構(gòu)體,查詢一級緩存區(qū)(DSP L2 RAM)的Empty 區(qū)的數(shù)據(jù)大小是否已經(jīng)大于one_rw_size,如果是就往一級緩存區(qū)寫one_rw_size 個數(shù)據(jù)。
最后,當(dāng)ARM 需要往一級緩存區(qū)(DSP L2 RAM)的Empty 區(qū)寫數(shù)據(jù)且剩下的數(shù)據(jù)大小已經(jīng)小于或等于one_rw_size 的時候,ARM 置位gppwriteover,并將剩下的數(shù)據(jù)寫到一級緩存區(qū)(DSP L2 RAM)的Empty 區(qū)中。
而在DSP 端,每次查詢二級緩存區(qū)(DDR)的Empty 區(qū)大小是否大于one_rw_size 并且dspreadover未置位,那么就從Ptr_ram_read 開始地址往下讀one_rw_size 個字節(jié)寫到二級緩存區(qū)(DDR)中。
當(dāng)ARM 已經(jīng)置位gppwriteover 且二級緩存區(qū)(DDR)需要從一級緩存區(qū)(DSP L2 RAM)讀的數(shù)據(jù)大小已經(jīng)小于one_rw_size 的時候,DSP 將一級緩存區(qū)剩下的數(shù)據(jù)全部讀到二級緩存區(qū),并置位dspreadover。而當(dāng)DSP 在二級緩存區(qū)中讀取數(shù)據(jù)去進(jìn)行運(yùn)算的大小等于file_transfer_size 時,表示數(shù)據(jù)已經(jīng)執(zhí)行完,DSP 置位Processover,并通知ARM 程序執(zhí)行完畢。
ARM 工作流程圖如圖5所示,DSP 工作流程圖如圖6所示。
圖5 ARM 工作流程圖
圖6 DSP 工作流程圖
設(shè)計了一種基于OMAPL138 的雙核通信機(jī)制:一方面,對于小數(shù)據(jù)量的消息傳輸,通過共享內(nèi)存進(jìn)行交互通信;另一方面,對于大數(shù)據(jù)量的通信,直接采用ARM 往DSP RAM 里面進(jìn)行讀寫,提高了通信速度。并且,在DSP 端建立了兩級循環(huán)緩沖區(qū),而ARM 端監(jiān)視緩沖區(qū),一旦緩沖區(qū)有空閑區(qū)域就往里面寫數(shù)據(jù),確保了緩沖區(qū)一直有數(shù)據(jù)供DSP 讀取進(jìn)行運(yùn)算。經(jīng)測試,該機(jī)制運(yùn)行穩(wěn)定、快速,ARM 和DSP 都可以準(zhǔn)確地進(jìn)行通信。
[1]彭啟琮,楊錬,潘曄.開放式多媒體應(yīng)用平臺——OMAP處理器的原理及應(yīng)用[M].北京:電子工業(yè)出版社,2005.
[2]TEXAS INSTRUMENTS.OMAP-L138 Applications Processor System Reference Guide[M],2010.
[3]付浩,劉建群.基于OMAP-L138 的嵌入式運(yùn)動控制器的設(shè)計與研究[J].科學(xué)技術(shù)與工程,2013,13(1):196-200.
[4]TEXAS INSTRUMENTS.OMAP-L138 Applications Processor System Reference Guide[M],2010.
[5]TEXAS INSTRUMENTS.Building DSPLink Applications version 1.65.00.02[M],2010.
[6]趙加祥.DSP 系統(tǒng)設(shè)計和BIOS 編程及應(yīng)用實例[M].北京:機(jī)械工業(yè)出版社,2008.
[7]CorbetRubini,Kroah Hartman.Linux 設(shè)備驅(qū)動程序[M].3 版.北京:中國電力出版社,2010:21-44.
[8]宋寶華.設(shè)備驅(qū)動開發(fā)詳解[M].2 版.北京:人民郵電出版社,2010.