呵,學(xué)習(xí)DSP,特別是Blackfin系列的,沒數(shù)據(jù)手冊簡直是沒法學(xué)的。 該系列基本上只有英文資料,而就我目前翻過的所有教材基本上都是從數(shù)據(jù)手冊上摘錄一個片段,翻譯一下就完事了,連個總結(jié)都沒有。很多關(guān)鍵的地方(比如中斷),要想理解完整,必須同時參考多個數(shù)據(jù)手冊,因此只看教材基本上是云里霧里的。 附件里是bf548與bf533的相關(guān)手冊,與bf561大部分是一樣的。bf561是雙核的,在編譯與鏈接庫參考手冊(6389974860119950_BF_cc_man.pdf)里有關(guān)于雙核編程的指導(dǎo)。 好吧,再講講Blackfin DSP與ARM的區(qū)別。 可以把嵌入式分成DSP與MCU兩種 MCU一般用于管理任務(wù),更注重代碼密度,而不是性能的極限(比如只做一個管理系統(tǒng),更多的是對外設(shè)讀寫,而外設(shè)一般是很慢(想想IIC,SPI,速度再快也不過幾M比特)的,因此大部分時間都在等待,很少需要考慮算法的優(yōu)化),ARM便是這類MCU。 DSP一般用于處理圖像、音頻、視頻(不僅是讀寫,而是處理,比如編碼解碼,或者從圖像完成人臉檢測),它更注重地是發(fā)揮處理器的極限性能,而其架構(gòu)(后講)也自然地與MCU有較大區(qū)別。 以前的話,大部分DSP對管理任務(wù)的能力很差,而像ARM這種MCU對于算法性能要求高的(比如圖像處理)的任務(wù)基本是無能為力。于是,既能有MCU出色 的管理功能,又能有DSP出色的計算性能便是很多人的一個目標(biāo),Blackfin DSP便是這樣誕生的。它既能作為100%的MCU使用,也能作為100%的DSP使用(這句是從U-boot的應(yīng)用筆記抄的,呵,100%,哥可不敢亂 說)。 好的,以一個例子說明一下圖像處理的艱巨來體現(xiàn)DSP的必要性。 我們現(xiàn)在拍攝的圖像再一般都是動輒130W像素,或者300W像素,假設(shè)想要從圖像中識別出人臉(或車牌號識別,都是一樣的)。那么便需要用一些圖像處理 與機器視覺的算法對圖像進行處理。無論對圖像作怎樣簡單的處理,都需要遍歷每個像素,對于130W像素的圖像,再快也得運算130W次(計算上尋址之類, 得130W*3~7)。那么對于PC的單核3G的CPU來說,一秒只能遍歷幾千次圖像(這里只是舉例說明,實際上由于現(xiàn)代CPU的架構(gòu)良好,GPU、協(xié)處 理器的存在,速度并不會這么慢)。把遍歷一次圖像看成一次加法,那么3G的CPU就相當(dāng)于一個只能計算幾千次加法的CPU,這樣的處理速度難以滿足實時要 求。而DSP便是為解決這些問題而存在的。 這里看一下Blackfin DSP的一些特點(為了防止太多廢話,這里假設(shè)大家有一點CPU的架構(gòu)知識與匯編知識):
零周期循環(huán): for (i = 0; i < 1000;i++) for (j = 0; j < 1000 ;j++) x = 0;
看上例,對于一般的CPU來說,循環(huán)都是模擬實現(xiàn)的,即判斷是否計數(shù)完成,然后減計數(shù),再JUMP,這至少得3個周期(更要命的是,流水線必須重新填充, 這個隱含了更多的周期浪費),也就是說上面的執(zhí)行至少得消費4M(3 * 1000 000 + 1000 000)個周期。 而Blackfin DSP使用硬件循環(huán),上面的兩個for不消耗周期,即只消費了1M個周期,這個節(jié)省是很可觀的。 同時Blackfin DSP還使用一個緩存區(qū)存放循環(huán)體內(nèi)的4條指令,以進一步提高效率。
循環(huán)尋址: for (i = 0; i < 1000;i++) a[i % 100] += 1;
大家要知道,%運算不是由硬件支持(對于PC與DSP都一樣)的,它的執(zhí)行效率很低,對于DSP,估計一次得上百個周期。在形態(tài)學(xué)圖像處理中,循環(huán)尋址是 很常見的,而每理一個像素要上百個周期,這對DSP是無法接受的。因此DSP提供了一組寄存器,叫DAG,通過合適的配置,可以使地址循環(huán),為了讓大家更 明白,將上例改成DSP的實現(xiàn)形式:
p = a; for (i = 0; i < 1000;i++) *p++ += 1;
這里假設(shè)p已經(jīng)配置好循環(huán)長度為100(這里其實應(yīng)該用匯編寫,不過只是為了演示,而忽略了晦澀的細節(jié)),當(dāng)p累加到100時(依此類推),會自動把p重設(shè)為a的起地址。相比于上面的代碼,每執(zhí)行一次循環(huán)可節(jié)。保埃岸鄠周期。
特別設(shè)計的指令集(對應(yīng)于特別設(shè)計的架構(gòu)): 1、一些高效指令: Blackfin DSP有兩個MAC,可以在一個周期內(nèi)同時完成2個16位乘法,而PC的CPU一般是幾個周期完成一次乘法。 各種專為視頻流處理設(shè)置的指令(至今沒用過,沒法細講)。 更多高效指令與細節(jié),參考指令集參考手冊。 2 、并行指令: 一個周期內(nèi)最高可以同時實現(xiàn)一條32位指令加兩條16位指令。這里通過一個例子,大家去體會其中的獨到之處: A1+=R0.L*R2.H,A0+=R0.L*R2.L || R2.L=W[I2++] || R0=[I1--] ; 這是一條匯編指令,在單周期內(nèi)完成,它完成了兩次乘法,并累加到專用累加器,完成兩次數(shù)據(jù)存取,同時移動兩次指針。將它換到PC上實現(xiàn),至少得10個周期。 更多的關(guān)于DSP與眾不同之處就不多說了,數(shù)據(jù)手冊多看些自然也就明白了。
那么學(xué)習(xí)Blackfin DSP應(yīng)該學(xué)什么? 雖然它既能完成MCU的功能,又有DSP的強悍,我認為還是側(cè)重DSP的方面的學(xué)習(xí),因為它比較貴,還有想學(xué)MCU,學(xué)ARM更合適,資料多。 要學(xué)會DSP,至少得學(xué)會匯編(Blackfin的匯編與C類似,好學(xué),但是加了限制),才能深刻理解它的架構(gòu)(有人說,不會匯編的DSP工程師稱不上合 格的工程師,而一般一個高度優(yōu)化的DSP項目的核心部分都會包含一部分匯編)。不會匯編去看架構(gòu),我認為最多只能走馬觀花(至少不會匯編前,哥是看得糊里 糊涂)。 然后實踐一些比較需要DSP的例子(一邊看例子,一邊學(xué)匯編),比如FFT、形態(tài)學(xué)處理之類的。更深入的也就不用說了,入門后大家就會漸漸明白適合自己的了。 談得比較空泛,更具體的還是只能通過實際的例子才講得明白。 |