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