最近在hellodsp(http://www.hellodsp.com)申請(qǐng)了個(gè)版主,本來是要申請(qǐng)TMS320C6000版塊的,不過這個(gè)版塊已經(jīng)有兩位優(yōu)秀的版主,我是做圖像處理的,于是就鎖定“語音視頻處理”版塊了,不過6000版塊我還是會(huì)經(jīng)常去,看到很多初學(xué)者在問一些入門的問題,有些提問題的同志對(duì)問題描述地也不夠清楚,可能更多的是想提問題可不知道怎么提吧,我剛學(xué)DSP的時(shí)候也一樣,碰到問題了不知道怎么把問題表述清楚,真有啞巴吃黃連的痛楚。最近有空回憶下自己學(xué)DSP的過程,算是個(gè)人經(jīng)歷吧,希望對(duì)大家有用。
我的經(jīng)歷
錯(cuò)過第一次學(xué)習(xí)機(jī)會(huì)
我2000年進(jìn)入大學(xué),專業(yè)通信工程。入學(xué)的時(shí)候成績(jī)不錯(cuò),還拿過一等獎(jiǎng)學(xué)金,自以為自己很聰明。當(dāng)時(shí)我們學(xué)院有個(gè)科技協(xié)會(huì),簡(jiǎn)稱科協(xié),那時(shí)的科協(xié)會(huì)長(zhǎng)是個(gè)大四的學(xué)兄,給人印象深刻,感覺他很厲害,就入了科協(xié),第一堂課是用555做個(gè)流水燈,科協(xié)已經(jīng)把印制板做好,我只用把器件焊上去就行了,燈是亮了很好玩,于是自己琢磨電路的原理,那時(shí)是個(gè)剛?cè)雽W(xué)的小子,什么也不懂,看那東西根本搞不懂,感覺太難了,后來慢慢就不去參加活動(dòng),再后來放棄了。
現(xiàn)在想想那個(gè)時(shí)候太輕言放棄了,包括后來大學(xué)里自學(xué)51單片機(jī)、學(xué)FPGA都是只淺嘗則止,而沒有持之以恒,以至于后來錯(cuò)過了很多很多機(jī)會(huì)。所以在這里要告訴大家,也告訴我自己,學(xué)技術(shù)一定要堅(jiān)持,不管碰到什么困難,絕不能輕言放棄,堅(jiān)持就會(huì)有進(jìn)步,就像長(zhǎng)跑,總有幾個(gè)困難點(diǎn),堅(jiān)持過去就覺得不是那么困難,水平才會(huì)有提升。
第一次使用C51
說起這個(gè),不得不感謝下我的一個(gè)大學(xué)室友,是他帶我入門C51,第一次用protel畫印制板,第一次申請(qǐng)免費(fèi)樣片、第一次編寫調(diào)試程序,第一次使用示波器等等,這些都得歸功于他的指導(dǎo)。
時(shí)間過得很快,一轉(zhuǎn)眼就大四了,想想自己大學(xué)游戲玩了三年,學(xué)業(yè)荒廢,畢業(yè)設(shè)計(jì)這個(gè)機(jī)會(huì)一定要把握住,不然自己沒什么資本找工作啊,于是在選題的時(shí)候選了個(gè)單片機(jī)的題目“基于DDS的信號(hào)發(fā)生器設(shè)計(jì)”。雖然之前接觸過51、protel,不過那都是看看書而已,實(shí)際做起來什么都不會(huì),我確定的方案是用C51去控制AD9853輸出相應(yīng)頻率的波形,當(dāng)然這里離不開鍵盤和LCD顯示,AD9853是從AD公司申請(qǐng)的樣片,那時(shí)我第一次知道還有免費(fèi)午餐,大公司真的不錯(cuò),記得當(dāng)時(shí)TIDSP都可以申請(qǐng),我就申請(qǐng)了一片6202,不過后來沒那么容易申請(qǐng)了,這次我堅(jiān)持了下來,一步一步地做,最終圓滿完成了畢業(yè)設(shè)計(jì)。
我是幸運(yùn)的,因?yàn)樯磉吘陀袀(gè)很好的老師,初學(xué)者大都沒有這樣的條件,即便如此,初學(xué)者還是應(yīng)充分挖掘身邊的資源,將它們都利用起來,這樣你才能更接近成功。
接觸DSP
2004畢業(yè)后我到一個(gè)研究所工作,我所在的部門是做視頻跟蹤器的,主要用DSP+FPGA,對(duì)我來說入魚得水,因?yàn)槲覍?duì)這些東西很有興趣。當(dāng)時(shí)我的同事們用的還是TI C50DSP,這個(gè)很多人可能聽都沒聽過,TI的DSP按時(shí)間大概經(jīng)歷了這幾個(gè)系列,C25-C50-V33-2000-5000-6000,C50的功能很有限,只有匯編開發(fā)環(huán)境,因?yàn)楣δ芎?jiǎn)單,所以學(xué)起來也相對(duì)容易,加上我有51的基礎(chǔ),很快就上手了,一年半后部門器件換代直接換成了64xx,由于受C50的影響,我們開發(fā)還是習(xí)慣用匯編,2006年5月前后,我率先用C開發(fā)產(chǎn)品,取得了不錯(cuò)的效果。
這當(dāng)中我接觸到了很多,由于我個(gè)人性格的原因,學(xué)什么都想學(xué)精,走了很多彎路。比如PCB剛開始用protel,后來發(fā)現(xiàn)它畫復(fù)雜板子的時(shí)候不方便,于是學(xué)用allegro,后來又學(xué)SI;DSP也是,6000會(huì)用了想學(xué)2000、5000,后來發(fā)現(xiàn)自己很幼稚,其實(shí)一到二門精通了足以,學(xué)什么要注意學(xué)習(xí)理念,工具平臺(tái)這些始終是外家功夫,要勤修內(nèi)功。
總結(jié)及建議
1)選好自己的工具和平臺(tái)學(xué)DSP當(dāng)然首先要選擇一款DSP(這里主要說TI的DSP,AD公司的不熟這里就不說了)。如果是個(gè)人學(xué)習(xí)的話主要看個(gè)人需要和應(yīng)用場(chǎng)合,比如做圖像處理那當(dāng)然首推TI6000了,初學(xué)者不必將DSP分出三六九等,各個(gè)系列沒有明顯的優(yōu)劣,但有明確的應(yīng)用領(lǐng)域,2000偏接口控制,5000偏語音,6000適合做大數(shù)據(jù)量信號(hào)處理,比如圖像、雷達(dá)等等。初學(xué)者最好有個(gè)開發(fā)板,不然無異于紙上談兵,2000、5000的開發(fā)板相對(duì)便宜,6000的就比較昂貴。
就上手容易度來說,我個(gè)人覺得6000更易上手,6000的結(jié)構(gòu)較2000、5000明了清晰,硬件上的條條框框比較少,你不需要看很多的硬件結(jié)構(gòu)資料就能著手編程,這個(gè)大概是技術(shù)的進(jìn)步吧。不過還是這句話,應(yīng)用場(chǎng)合決定你的選擇。
2)自己先動(dòng)手
初學(xué)者如果會(huì)C語言語法,在看過一些資料后就可以著手寫自己的第一個(gè)程序,如果寫不出來,看看TI最初級(jí)的例程,完成自己第一個(gè)程序。我給我們單位新同事做6000培訓(xùn)的時(shí)候,給他們的第一個(gè)題目就是寫一個(gè)程序讓LED燈不停閃爍,這個(gè)燈可能接在GPIO上或者通過EMIF譯碼與FPGA配合控制(后者可能更有意義),更進(jìn)一步的程序是控制閃爍的頻率。我比較喜歡讓他們用GPIO和EMIF,它們可能是6000里最簡(jiǎn)單和用的最多的外設(shè)了,它們是初學(xué)者最早要攻克的堡壘。
初學(xué)者往往對(duì)硬件結(jié)構(gòu)和軟件的配合沒有概念,對(duì)片內(nèi)存儲(chǔ)空間、片外存儲(chǔ)空間、片上外設(shè)這些概念沒有實(shí)在的理解,這些概念需要自己的反復(fù)的思考、反復(fù)的實(shí)驗(yàn)、反復(fù)的體會(huì)才能最終搞清楚,這些弄明白了你也就入門了。
初學(xué)者比較忌諱看太多和太復(fù)雜的例程,看得太多你的思緒會(huì)比較亂,看得太復(fù)雜你會(huì)心浮氣躁,復(fù)雜的例程一般它都有相對(duì)復(fù)雜的編程結(jié)構(gòu),這個(gè)初學(xué)者是很難體會(huì)到的,所以剛開始不要看,等你寫了20到30個(gè)程序的時(shí)候再試著看相對(duì)復(fù)雜的例程。
3)多動(dòng)手
這個(gè)不用多說了,光看不練假把式。
4)片上外設(shè)
這里拿DM642來說,我把常用的外設(shè)由簡(jiǎn)單到復(fù)雜排個(gè)序:GPIO-TIMER-EDMA-EMIF-I2C-MCASP-VideoPort-EMAC、MDIO,MCASP我沒用過,不過看過資料感覺不復(fù)雜,我給初學(xué)者的建議是先把前面4個(gè)學(xué)清楚,可以先學(xué)GPIO這個(gè)真的是簡(jiǎn)單,剛開始不要急著用CSL,用匯編或是C寫個(gè)程序讓某個(gè)GPIO腳上輸出波形,這樣有助于理解片上外設(shè)以及有關(guān)的概念。前面4個(gè)明白了后面的具體用到再學(xué),這個(gè)時(shí)候你可以看TI相應(yīng)的例程,拿來用就可以。
5)匯編、C和線性匯編
現(xiàn)在開發(fā)6000的標(biāo)準(zhǔn)流程是先用C寫,C的好處很多這里不說了,有太多的文章在論述,不過對(duì)于準(zhǔn)備做優(yōu)化的同志們來說,匯編不會(huì)也不行,用匯編相對(duì)于C更助于你理解6000的架構(gòu),很多初學(xué)者對(duì)C語言中用指針對(duì)某個(gè)空間操作不理解,用匯編寫的話相對(duì)要好理解的多。
大家不必對(duì)匯編心存畏懼,其實(shí)它也很簡(jiǎn)單,只不過它比較晦澀,用它開發(fā)整個(gè)系統(tǒng)的時(shí)間上的花費(fèi)太多,不過關(guān)鍵算法的優(yōu)化有時(shí)還是離不開它,TI目前還提供線性匯編,它是匯編和C的折中,兼?zhèn)鋮R編的效率和C的易開發(fā)性。
匯編和C都只是工具,關(guān)鍵還是你對(duì)架構(gòu)的理解和編程理念,所以選擇哪個(gè)都有道理,通過工具去探索架構(gòu)而已。我個(gè)人覺得初學(xué)者主要應(yīng)學(xué)習(xí)C,畢竟它是主流,可以用匯編寫4-5個(gè)小程序,熟悉它的語法就行,日后用它做優(yōu)化也不會(huì)什么都不知道,而且也助于對(duì)硬件架構(gòu)的理解。
結(jié)束
就寫這么多了,一家之言,里面有很多廢話,希望對(duì)初學(xué)者有點(diǎn)幫助,拋磚引玉,也希望高手們多多寫出自已的經(jīng)驗(yàn)。
優(yōu)化一起放過來了~~~
關(guān)于優(yōu)化我的經(jīng)驗(yàn)是這樣的:
一、首先考慮從系統(tǒng)結(jié)構(gòu)上優(yōu)化,比如盡量減少待處理數(shù)據(jù)的無謂搬移,考慮你DSP片內(nèi)存儲(chǔ)量和每次處理數(shù)據(jù)量對(duì)系統(tǒng)結(jié)構(gòu)優(yōu)化,這部分的優(yōu)化應(yīng)該最早做;
二、其次從算法層面上著手,看采用的算法有沒有更好更簡(jiǎn)單的計(jì)算方法,算法是否有某種對(duì)稱性,可否采用更合適的數(shù)據(jù)結(jié)構(gòu)等等,這方面的優(yōu)化比程序上的優(yōu)化更明顯;
三、如果算法層面暫時(shí)無更好的優(yōu)化辦法,看看軟件結(jié)構(gòu)能否優(yōu)化。
比如:
1)多層的循環(huán)結(jié)構(gòu)能否減層。我經(jīng)常看到這樣的程序:
for(i = 0; i++; i< A)
for(j = 0; j++ j< B)
{
E[j] = C[j] - D[j];
}
這個(gè)可以優(yōu)化成:
for(i = 0; i++; i<A*B)
{
E = C - D;
}
2) 關(guān)鍵循環(huán)結(jié)構(gòu)中的條件、跳轉(zhuǎn)指令應(yīng)盡量避免,哪怕會(huì)增加一些循環(huán)次數(shù),循環(huán)中沒有條件指令優(yōu)化器更容易優(yōu)化;
3)關(guān)鍵循環(huán)不要調(diào)用子函數(shù)
其它還有一些,具體可以看看手冊(cè),手冊(cè)上講的很清楚
四、結(jié)合DSP系統(tǒng)的硬件結(jié)構(gòu)優(yōu)化
1)看你處理的數(shù)據(jù)是放在片內(nèi)還是片外,如果放在片外的話這個(gè)建議將數(shù)據(jù)分塊分批倒入片內(nèi)處理,類似于流水結(jié)構(gòu);
2)針對(duì)外部數(shù)據(jù)可對(duì)L2 cache優(yōu)化
五、結(jié)合DSP優(yōu)化器、指令系統(tǒng)等進(jìn)行優(yōu)化
這部分可以詳細(xì)的看TI的手冊(cè),大概有這幾個(gè)方法:
1)優(yōu)化選項(xiàng),-o3 -pm 取消-g 等等這些選項(xiàng),如果你的軟件結(jié)構(gòu)很好,那么它們的優(yōu)化效果很明顯;
2)加一些優(yōu)化指示符指導(dǎo)優(yōu)化,這部分看手冊(cè),包括存儲(chǔ)地址無關(guān)性,SIMD(單指令多數(shù)據(jù)處理)等等;
3)用一些專用指令,比如6000提供飽和加、溢出減指令,可以不必用條件判斷;
4)如果效果還是不好,用線性匯編改寫你的程序,將你的優(yōu)化思想用線性匯編表述出來,一般到地步就可以了;
5)如果線性匯編優(yōu)化未能盡顯你的優(yōu)化思想,那就匯編吧,優(yōu)化器不會(huì)再幫助你優(yōu)化,完全是你自己控制程序了,自己做軟件流水吧;
這部分需要有比較豐富的優(yōu)化經(jīng)驗(yàn)和扎實(shí)的優(yōu)化功底,多多積累,多看資料。
最后要重點(diǎn)說下:
優(yōu)化是沒有止境的,在對(duì)程序?qū)?xì)致優(yōu)化前要對(duì)程序每個(gè)部分測(cè)試下時(shí)間,對(duì)非常耗時(shí)的部分做優(yōu)化,一但滿足你的要求就可以,不要為了優(yōu)化而優(yōu)化,我們應(yīng)該有更重要的東西要學(xué),不要陷在優(yōu)化上而不能自拔!!
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/ww303875615/archive/2009/12/10/4977742.aspx