研究生期間斷斷續(xù)續(xù)做過(guò)TI DSP研究,從一個(gè)對(duì)嵌入式一點(diǎn)也沒(méi)有了解的新手到快畢業(yè)時(shí)完成一個(gè)自認(rèn)為滿意的項(xiàng)目,其中走過(guò)很多彎路,現(xiàn)在把我對(duì)DSP學(xué)習(xí)的心得和一些參考文獻(xiàn)列出來(lái),可能對(duì)初學(xué)者具有幫助。 實(shí)驗(yàn)室用的是一款聞亭的DM642開(kāi)發(fā)板,當(dāng)時(shí)這款開(kāi)發(fā)板還比較新,國(guó)內(nèi)中文資料很少,而且聞亭但是的例子程序均是采用TI的原程序,不像合眾達(dá)的例子程序容易上手,所以可能合眾達(dá)的板子比較適合初學(xué)者使用。 DM642是一款針對(duì)圖像應(yīng)用的高端DSP,近幾年來(lái)國(guó)內(nèi)應(yīng)用的范圍很廣。對(duì)于DSP軟件學(xué)習(xí)而言個(gè)人認(rèn)為包含了3個(gè)方面的東西:1:芯片的外設(shè),對(duì)芯片的基本操作和簡(jiǎn)單程序運(yùn)行環(huán)境。2:嵌入失操作系統(tǒng)原理(DSP/BIOS)。3:DSP算法的移植和優(yōu)化工作。下面分別對(duì)這三個(gè)方面做論述。 1:芯片的外設(shè),對(duì)芯片的基本操作和簡(jiǎn)單程序運(yùn)行。 學(xué)習(xí)DSP 首先是要對(duì)芯片和你所用到的芯片外設(shè)的數(shù)據(jù)手冊(cè)說(shuō)明比較清楚,對(duì)于初學(xué)者可能在剛開(kāi)始看datasheet時(shí)感覺(jué)很頭暈,因?yàn)閐atasheet只是一些說(shuō)明性的東西,他沒(méi)有教你怎么去用,所以datasheet部分一定要結(jié)合相應(yīng)的例子程序去看。對(duì)于芯片的外設(shè)操作TI提供了一個(gè)CSL的函數(shù),幫你事先定義好了一些寄存器地址,這樣就不用你去查找每個(gè)寄存器的詳細(xì)地址。 現(xiàn)在的C6000 程序開(kāi)發(fā)大部分采用C語(yǔ)言,極少數(shù)的關(guān)鍵代碼采用線性匯編或者匯編語(yǔ)言。對(duì)于一個(gè)C語(yǔ)言運(yùn)行工程需要的最少元素是:1:main函數(shù) 2:cmd文件3:runtime supportlib。這是讓一個(gè)基于C語(yǔ)言的工程跑起來(lái)的最少條件。換句話說(shuō)只要有了這三個(gè)東西我們就可以在DSP上做任何想做的事,但是考慮到做大型工程和復(fù)雜應(yīng)用的需要,通常又要用到操作系統(tǒng)DSP/BIOS和驅(qū)動(dòng)。 在階段首先是讓一個(gè)最簡(jiǎn)單的hell world工程跑起來(lái),這個(gè)工程這包含三個(gè)文件,一個(gè)main.c 一個(gè)CMD文件,一個(gè) rts.lib。然后在查數(shù)據(jù)手冊(cè)DSP的外設(shè)資源調(diào)試一遍,這個(gè)過(guò)程完成后幾基本上手了:)。 在這個(gè)過(guò)程中需要搞明白的是一個(gè)過(guò)程,三個(gè)文件,和簡(jiǎn)單的調(diào)試方法。一個(gè)過(guò)程是C語(yǔ)言怎么生成.out可執(zhí)行文件的過(guò)程,通常包含編譯,匯編,連接三個(gè)過(guò)程。幾個(gè)文件是obj, cmd, map,文件Obj,Cmd和Map文件的格式在TI的CCS 文擋幫助中都有詳細(xì)論述。調(diào)試方面我們可可以利用防真器可以讓程序在任何地方停下來(lái),然后利用CCS的Memory View功能可以查看想要知道的CPU地址映射的區(qū)域。 這部分的參考資料可以查看 (1)電子科技大學(xué) 出版的 C/C++語(yǔ)言硬件程序設(shè)計(jì)--基于TMS320C5000系列DSP (2)幫助文檔
2:嵌入失操作系統(tǒng)原理(DSP/BIOS) 這部分就有嵌入式操作系統(tǒng)知識(shí)了,DSP/BIOS是不開(kāi)源的,如果想對(duì)操作系統(tǒng)的知識(shí)了解深入的話可以看看uc/os-II的原代碼。嵌入式操作系統(tǒng)的基本原理都一樣。這個(gè)完成后在把Ti關(guān)于DSP/BISO的列子程序跑一便熟悉操作系統(tǒng)中各個(gè)模塊,如TSK, TIMER…..。 在熟悉完操作系統(tǒng)后,剩下的就是對(duì)DSP/BISO的驅(qū)動(dòng)模型了,TI 的驅(qū)動(dòng)模型采用的是class-mini driver模式,其中class driver就是一些函數(shù)接口,提供到mini driver的訪問(wèn)。其中mini driver實(shí)現(xiàn)方式根據(jù)不同的板子和芯片會(huì)不一樣,建議選取一個(gè)外設(shè)資源,看懂其源代碼,這些代碼一般都在幾個(gè)c 文件內(nèi),其中最主要是5-7個(gè)函數(shù)的實(shí)現(xiàn); mdBindDev() mdUnBindDev() mdControlChan(); …………………. DSP/BIOS的驅(qū)動(dòng)比較簡(jiǎn)單,總得來(lái)說(shuō)驅(qū)動(dòng)可以分為2個(gè)部分,一部分函數(shù)硬件的初始化和控制工作,這部分相對(duì)交簡(jiǎn)單;另外一部分函數(shù)負(fù)責(zé) I/O,buffer的同步工作,這部分通常要復(fù)雜的多,而且這部分函數(shù)常常和中斷牽涉在一起,所以在看驅(qū)動(dòng)源代碼時(shí)一定要時(shí)刻知道中斷什么時(shí)候發(fā)生,中斷服務(wù)函數(shù)里面做了些什么,對(duì)其他函數(shù)的影響是什么等。如果能把驅(qū)動(dòng)代碼看一遍對(duì)于C語(yǔ)言提高是很大的。 這部分的參考資料可以查看 (1) DSP/BIOS userguide (2) How to write DSP device driver
3:DSP算法的移植和優(yōu)化工作 這部分是最后工作,一般也是比較耗時(shí)間的工作。現(xiàn)在如果實(shí)現(xiàn)比較復(fù)雜的系統(tǒng)不做DSP程序的優(yōu)化是肯定不行的。DSP程序的優(yōu)化方法有很多,網(wǎng)上也有很多資料,但是以我實(shí)際的經(jīng)驗(yàn)來(lái)看很多人都沒(méi)有把握關(guān)鍵的地方,如果是復(fù)雜算法的話DSP優(yōu)化的第一步應(yīng)該是存儲(chǔ)器優(yōu)化,也就是說(shuō)利用ping-pong buffer技術(shù)將待處理的數(shù)據(jù)分批的搬運(yùn)到片內(nèi)存儲(chǔ)器中,在這個(gè)工程中要結(jié)合片內(nèi)資源,設(shè)計(jì)好數(shù)據(jù)結(jié)構(gòu),并一定要考慮讓數(shù)據(jù)對(duì)齊。存儲(chǔ)器優(yōu)化是 program optimization 文檔中沒(méi)有提及,而是在一個(gè)叫Cache user guide 文檔中說(shuō)明,所以這樣就造成很多人不知道原因。在完成存儲(chǔ)器優(yōu)化之后就是program optimization 文檔中所講的方法,-o3,數(shù)據(jù)打包,inline,循環(huán)展開(kāi),匯編等等。 做優(yōu)化的過(guò)程中一定要保證優(yōu)化之前和之后的處理結(jié)果正確性,也就是說(shuō)優(yōu)化不能導(dǎo)致錯(cuò)誤的發(fā)生,然后在盡量提高時(shí)間。 關(guān)于優(yōu)化后函數(shù)運(yùn)行時(shí)間的測(cè)量TI的有個(gè)文檔里面有教你怎么測(cè),就是利用定時(shí)器來(lái)測(cè)量函數(shù)運(yùn)行的時(shí)間,另外對(duì)于運(yùn)行時(shí)間本來(lái)就只有幾百個(gè)cycle的短小匯編函數(shù)也可以利用CCS 的clock功能來(lái)測(cè)時(shí)間。 總之程序優(yōu)化就是一項(xiàng)耗時(shí)間的體力活,哈哈! 這部分的參考資料可以查看 (1) program optimizationguide (2) cache user guide http://blog.sina.com.cn/s/blog_4d32d0b401009ntg.html |