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