隨著數(shù)字信號(hào)處理(Digital Signal ProcESSor,DSP)技術(shù)的發(fā)展,DSP已被廣泛應(yīng)用于雷達(dá)、通信等領(lǐng)域。雖然DSP經(jīng)歷了幾代的發(fā)展,運(yùn)算速度和能力都有了很大的提高,但在很多情況下,單片DSP已經(jīng)不能滿(mǎn)足實(shí)時(shí)處理的要求,必須尋求多片DSP并行處理的方案。
從系統(tǒng)結(jié)構(gòu)出發(fā)可以將并行系統(tǒng)分為共享存儲(chǔ)器并行系統(tǒng)和分布存儲(chǔ)器并行系統(tǒng)。AD公司推出的SHARC系列DSP芯片同時(shí)支持這二種并行處理器結(jié)構(gòu)。通常,將AD公司的一系列雙位高性能浮點(diǎn)DSP稱(chēng)為SHARC(Super Harvard Architecture)。對(duì)于共享存儲(chǔ)器系統(tǒng),通過(guò)SHARC間的外部共享總線(xiàn)實(shí)現(xiàn)。對(duì)于分布存儲(chǔ)器系統(tǒng),通過(guò)2個(gè)SHARC間的鏈路口直接連接,實(shí)現(xiàn)DSP間點(diǎn)對(duì)點(diǎn)的通信。
然而,不能認(rèn)為將多個(gè)SHARC互相進(jìn)行硬件連接就實(shí)現(xiàn)了并行處理。真正的并行處理應(yīng)該是使互連的各個(gè)DSP能夠協(xié)調(diào)工作,縮短系統(tǒng)處理的時(shí)間。這需要并行系統(tǒng)中SHARC間能完成數(shù)據(jù)流的傳遞。并行系統(tǒng)中各個(gè)SHARC間數(shù)據(jù)流的傳遞同數(shù)據(jù)處理同等重要。本文針對(duì)這二種并行方式,分別給出了軟件的設(shè)計(jì)方法和設(shè)計(jì)技巧,并且給出了針對(duì)ADSP2116X的程序?qū)崿F(xiàn)。
1 共享存儲(chǔ)器并行系統(tǒng)的設(shè)計(jì)
SHARC為多處理器系統(tǒng)提供了強(qiáng)大的支持,用戶(hù)可以在不附加任何外圍電路的情況下構(gòu)成共享存儲(chǔ)器并行系統(tǒng)。SHARC具有一套巧妙的分布式總線(xiàn)仲裁機(jī)制。使用2~6片SHARC把各SHARC的相應(yīng)引腳相連就可以共享外部總線(xiàn)。每片SHARC都可以訪問(wèn)其他SHARC的片內(nèi)存儲(chǔ)器,還可以通過(guò)設(shè)置IOP寄存器啟動(dòng)其他SHARC的DMA操作。
組成共享存儲(chǔ)器并行系統(tǒng)時(shí),每一個(gè)SHARC都有一個(gè)惟一的標(biāo)識(shí):ID2~0,取值范圍為000~110。ID=001表示該SHARC為1號(hào)DSP,ID=010表示該SHARC為2號(hào)DSP,依此類(lèi)推。ID=000表示是單DSP系統(tǒng)。在多DSP系統(tǒng)中,ID=001號(hào)的DSP是必須存在的,這是DSP加載成功以后的主處理器。
在共享存儲(chǔ)器系統(tǒng)中,任何時(shí)刻都只有一片SHARC可以驅(qū)動(dòng)外部總線(xiàn),該SHARC就被稱(chēng)為主處理器。其余的從SHARC如果需要訪問(wèn)總線(xiàn),則必須先申請(qǐng)總線(xiàn)。主處理器如果此時(shí)沒(méi)有數(shù)據(jù)傳遞或者總線(xiàn)占用時(shí)間到,就會(huì)釋放總線(xiàn)控制權(quán),把自己的外部總線(xiàn)驅(qū)動(dòng)為三態(tài),完成總線(xiàn)控制權(quán)的轉(zhuǎn)移。
主處理器對(duì)從SHARC的內(nèi)存訪問(wèn)和對(duì)自己的內(nèi)存訪問(wèn)一樣簡(jiǎn)單,既可以通過(guò)內(nèi)核直接讀寫(xiě)完成,也可以通過(guò)外部口DMA實(shí)現(xiàn)。在共享存儲(chǔ)器并行系統(tǒng)中,每一片SHARC根據(jù)自己的ID號(hào)都有一個(gè)映射的多處理器存儲(chǔ)空間。例如對(duì)于ADSP2116X,ID=001的SHARC對(duì)應(yīng)的多處理器存儲(chǔ)空間為0x100000~0x1F FFFF,ID=010的SHARC對(duì)應(yīng)的多處理器存儲(chǔ)器空間為0x20 0000~0x2F FFFF等。共享存儲(chǔ)系統(tǒng)的LDF文件與單DSP系統(tǒng)有些不同。下面給出它的一個(gè)示例(以2個(gè)SHARC為例)。
例1:共享存儲(chǔ)器系統(tǒng)LDF文件。
ARCHITECTURE(ADSP-21160)
SEARCH_DIR($ADI_DSP211xxlib)
MPMEMORY{
DSP1{START(0X100000)} //第一片DSP在多處理
//器空間的映射地址
DSP2{START(0X200000)} } //第二片DSP在多處理
//器空間的映射地址
MEMORY
{pm_rsTI { TYPE(PM RAM)START(0x00040004)END
(0x0004000f)WIDTH(48) }
pm_code { TYPE(PM RAM)START(0x00040100)END
(0x00049fff)WIDTH(48) }
dm_data { TYPE(DM RAM)START(0x00050000)END
(0x00059fff)WIDTH(32) } }
PROCESSOR DSP1
{LINK_AGAINST(DSP2.DXE) //需要重新連接的
//DSP2的目標(biāo)文件
OUTPUT(DSP1.DXE) //DSP1輸出的目標(biāo)文件
…… //和單DSP系統(tǒng)相同,故略去,下同
}
PROCESSOR DSP2
{LINK_AGAINST(DSP1.DXE) //需要重新連接的
//DSP1的目標(biāo)文件
OUTPUT(DSP2.DXE) //DSP2輸出的目標(biāo)文件
……
}
這樣,這二片DSP便可以通過(guò)外部總線(xiàn)訪問(wèn)對(duì)方的內(nèi)部資源。當(dāng)DSP1需要直接訪問(wèn)DSP2中的某一變量時(shí),只需要DSP2將該變量設(shè)置為global類(lèi)型,DSP1就可以在多處理器空間中通過(guò)外部總線(xiàn)直接訪問(wèn)該變量,當(dāng)然,也可以根據(jù)變量的內(nèi)存地址直接訪問(wèn)。
在共享存儲(chǔ)器并行系統(tǒng)中,當(dāng)二個(gè)SHARC之間通過(guò)總線(xiàn)進(jìn)行數(shù)據(jù)傳遞時(shí),如果此時(shí)其他的DSP需要訪問(wèn)外部總線(xiàn),則只有掛起等待。這樣,在多個(gè)DSP間數(shù)據(jù)交換比較頻繁時(shí),系統(tǒng)的效率就會(huì)大大降低。另外,在共享存儲(chǔ)器并行系統(tǒng)中,最多只能有6個(gè)DSP互相連接。如果需要更多的DSP并行工作,共享存儲(chǔ)器并行系統(tǒng)便無(wú)能為力。采用以下介紹的分布存儲(chǔ)器并行系統(tǒng),可以有效地解決這個(gè)問(wèn)題。
2 分布存儲(chǔ)器并行系統(tǒng)的設(shè)計(jì)
ADSP2116X提供了獨(dú)立的6個(gè)鏈路口,每個(gè)鏈路口可以實(shí)現(xiàn)與其他ADSP2116X或者外圍設(shè)備點(diǎn)對(duì)點(diǎn)的通信。每個(gè)鏈路口包括8位雙向數(shù)據(jù)線(xiàn)(LxDAT7~0),1個(gè)雙向時(shí)鐘信號(hào)(LxCLK),1個(gè)雙向確認(rèn)信號(hào)(LxACK)。但是,鏈路口沒(méi)有為發(fā)送和接收提供2套管腳,所以在任何時(shí)刻鏈路口只能工作在單工狀態(tài)。依靠鏈路口進(jìn)行雙DSP間的數(shù)據(jù)傳遞時(shí),只需要把2個(gè)DSP的10個(gè)管腳對(duì)應(yīng)連接即可,不需要任何外部附加邏輯。
在ADSP2116X內(nèi)部有6個(gè)鏈路緩沖器。用戶(hù)通過(guò)定義LAR寄存器,可以為每個(gè)鏈路口選擇一個(gè)或幾個(gè)緩存器。鏈路緩沖器一端與內(nèi)部總線(xiàn)相連,另一端通過(guò)LAR寄存器與不同的鏈路口相連。需要注意的是,鏈路口與鏈路緩存器是完全不同的概念。鏈路緩沖器可以理解為一個(gè)雙向的FIFO,而鏈路口僅僅代表其對(duì)外的10個(gè)管腳。鏈路口的特性很大程度上是由其正在使用的緩沖器的特性決定的。
ADSP2116X的鏈路口發(fā)送時(shí)鐘頻率可以通過(guò)LCTLx寄存器的LxCLKD位設(shè)置(1,1/2,1/3,1/4核時(shí)鐘頻率),鏈路口數(shù)據(jù)線(xiàn)根據(jù)需要可以選擇為8位或4位。發(fā)送方在時(shí)鐘LxCLK的上升沿送出8/4位碼,接收方利用時(shí)鐘下降沿鎖存8/4位碼,并且接收方使LxACK有效,表示已準(zhǔn)備好接收下一個(gè)字。在每個(gè)字開(kāi)始發(fā)送時(shí),發(fā)送方如果看到LxACK無(wú)效,則將LxCLK保持為高,并等待LxACK有效后才開(kāi)始發(fā)送新字。當(dāng)發(fā)送緩沖為空時(shí),LxCLK將保持為低電平。
鏈路口數(shù)據(jù)傳輸可以通過(guò)DMA方式和內(nèi)核直接訪問(wèn)二種方式。DMA方式傳輸時(shí)不需要內(nèi)核干預(yù),在傳輸數(shù)據(jù)量比較大時(shí)效率很高,但是需要首先進(jìn)行DMA參數(shù)設(shè)置。當(dāng)僅有個(gè)別數(shù)據(jù)需要通過(guò)鏈路口傳遞的情況下,往往不使用DMA方式,而是通過(guò)ADSP2116X的內(nèi)核直接訪問(wèn)。用戶(hù)可以通過(guò)LCOM寄存器中緩沖器的狀態(tài)來(lái)控制內(nèi)核對(duì)鏈路口緩沖進(jìn)行讀寫(xiě)操作,也可以通過(guò)相應(yīng)的中斷從鏈路口緩沖器中讀寫(xiě)數(shù)據(jù),如“DM(LBUF0)=R0;”或者“R0=DM(LBUF0);”等。值得注意的是,無(wú)論是試圖從一個(gè)空的鏈路緩沖中讀,還是試圖向滿(mǎn)的緩沖中寫(xiě),內(nèi)核的指令都會(huì)掛起,直到操作成功為止。因此,內(nèi)核指令直接讀寫(xiě)鏈路緩存時(shí),需要首先判斷鏈路緩沖狀態(tài)。
ADSP2116X為每個(gè)鏈路口提供了一個(gè)專(zhuān)用的DMA通道,它們分別占用DMA中的4~9通道。鏈路口的DMA使用非常方便,只需將對(duì)應(yīng)的DMA參數(shù)寄存器(IIx,IMx,Cx)設(shè)置完畢,使能LCTLx中對(duì)應(yīng)通道的LxDEN即可。在當(dāng)前DMA結(jié)束(或者鏈?zhǔn)紻MA全部結(jié)束)后,會(huì)觸發(fā)一個(gè)可屏蔽中斷通知用戶(hù)。啟動(dòng)鏈路口DMA的順序如下:
(1)由LAR寄存器的AxLB為鏈路口分配一個(gè)LBUFx;
(2)由LCTL寄存器的LxEN使能這個(gè)LBUFx,并設(shè)置好LCTL控制寄存器;
(3)設(shè)置DMA參數(shù)(IIy,IMy,Cy);
(4)置位LCTL寄存器的LxDEN,就啟動(dòng)了DMA。
其中:x=0~5,y=4~9。
下面給出一個(gè)利用鏈路口DMA發(fā)送數(shù)據(jù)的示例。
例2:利用鏈路口0進(jìn)行數(shù)據(jù)發(fā)送。
.SECTION/dm
dm_data;
.VAR
trans_data[size];
.SECTION/pm
pm_code:
……
r0=0x0002c688;
dm(LAR)=r0;
r9=0x00000229; /*LBUF0使能、發(fā)送、8位字寬、核時(shí)鐘速率*/
dm(LCTL0)=r9;
r0=trans_data;
dm(II4)=r0; /*需要發(fā)送數(shù)據(jù)的起始地址*/
r0=1;
dm(IM4)=r0;
r0=size;
dm(C4)=r0;
ustat1=dm(LCTL0);
bit set ustat1 L0DEN; /*啟動(dòng)發(fā)送DMA*/
dm(LCTL0)=ustat1;
如果傳輸?shù)臄?shù)據(jù)不在一段連續(xù)的內(nèi)存區(qū),而是在多段數(shù)據(jù)塊中,可以利用鏈?zhǔn)紻MA。鏈?zhǔn)紻MA可以在當(dāng)前DMA操作結(jié)束后自動(dòng)重新配置當(dāng)前通道并開(kāi)始新的DMA,所有這些操作都不需要內(nèi)核的干預(yù)。在鏈?zhǔn)紻MA過(guò)程中,用戶(hù)只要對(duì)DMA參數(shù)配置一次,就可以方便地完成多塊數(shù)據(jù)的DMA傳輸。
鏈?zhǔn)紻MA是通過(guò)CPx寄存器實(shí)現(xiàn)的。對(duì)于ADSP2116X來(lái)說(shuō),CPx是一個(gè)19位的寄存器。寄存器中低18位表示相對(duì)于基地址0x40000的偏移量,用戶(hù)在這個(gè)地址的內(nèi)部存儲(chǔ)器中存放下一次DMA的參數(shù),這些參數(shù)叫做TCB(Transfer Control Blocks)。CPx中的第19位是控制當(dāng)前鏈?zhǔn)紻MA完成后是否產(chǎn)生中斷的PCI位。如果把全局地址賦給CPx,則PCI位一定為1,表明一定會(huì)產(chǎn)生中斷。
用戶(hù)只需要在內(nèi)存區(qū)填寫(xiě)多個(gè)TCB的表格,用其中的CPx字段將每個(gè)表格串起來(lái)并將第一個(gè)表格的結(jié)束地址放入CPx寄存器,就可以啟動(dòng)鏈?zhǔn)紻MA。要終止一個(gè)鏈?zhǔn)紻MA,只需要把最后一個(gè)TCB中的CPx字段填0即可。TCB結(jié)構(gòu)如圖1所示。
下面是建立一個(gè)鏈?zhǔn)紻MA的順序:
評(píng)論
查看更多