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