研究生期間斷斷續續做過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:mian函式 2:cmd檔案3:runtime support lib。這是讓乙個基於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 user guide
(2) how to write dsp device driver
... 5?_requestid=176707
(3) 嵌入式實時作業系統uc/os-ii
3:dsp演算法的移植和優化工作
這部分是最後工作,一般也是比較耗時間的工作。現在如果實現比較複雜的系統不做dsp程式的優化是肯定不行的。dsp程式的優化方法有很多,網上也有很多資料,但是以我實際的經驗來看很多人都沒有把握關鍵的地方,如果是複雜演算法的話dsp優化的第一步應該是儲存器優化,也就是說利用ping-pong buffer技術將待處理的資料分批的搬運到片記憶體儲器中,在這個工程中要結合片內資源,設計好資料結構,並一定要考慮讓資料對齊。儲存器優化是 program optimization 文件中沒有提及,而是在乙個叫cache user guide 文件中說明,所以這樣就造成很多人不知道原因。在完成儲存器優化之後就是program optimization 文件中所講的方法,-o3,資料打包,inline,迴圈展開,彙編等等。
做優化的過程中一定要保證優化之前和之後的處理結果正確性,也就是說優化不能導致錯誤的發生,然後在盡量提高時間。
關於優化後函式執行時間的測量ti的有個文件裡面有教你怎麼測,就是利用定時器來測量函式執行的時間,另外對於執行時間本來就只有幾百個cycle的短小彙編函式也可以利用ccs 的clock功能來測時間。
總之程式優化就是一項耗時間的體力活,哈哈!
這部分的參考資料可以檢視
(1) program optimization guide
(2) cache user guide
前言
我2023年進入大學,專業通訊工程。入學的時候成績不錯,還拿過一等獎學金,自以為自己很聰明。當時我們學院有個科技協會,簡稱科協,那時的科協會長是個大四的學兄,禿頂,給人印象深刻,感覺他很厲害,就入了科協,第一堂課是用555做個流水燈,科協已經把印製板做好,我只用把器件焊上去就行了,燈是亮了很好玩,於是自己琢磨電路的原理,那時是個剛入學的小子,什麼也不懂,看那東西根本搞不懂,感覺太難了,後來慢慢就不去參加活動,再後來放棄了。
現在想想那個時候太輕言放棄了,包括後來大學裡自學51微控制器、學fpga都是只淺嚐則止,而沒有持之以恆,以至於後來錯過了很多很多機會。所以在這裡要告訴大家,也告訴我自己,學技術一定要堅持,不管碰到什麼困難,絕不能輕言放棄,堅持就會有進步,就像長跑,總有幾個困難點,堅持過去就覺得不是那麼困難,水平才會有提公升。
第一次使用c51
優化是沒有止境的,在對程式對細緻優化前要對程式每個部分測試下時間,對非常耗時的部分做優化,一但滿足你的要求就可以,不要為了優化而優化,我們應該有更重要的東西要學,不要陷在優化上而不能自拔!!
Linux 學習指南
第乙個話題,嵌入式學習的路徑有哪些.這是乙個初學者常問的問題,也是初學者問嵌入式該如何入門的根源.我感覺有兩個方面,偏硬和偏軟.我不認為嵌入式開發軟體佔絕對比重,相反,軟硬體都懂,才是嵌入式高手所應該追求的,也是高手的必由之路.硬體道路 第一步 pcb設計,一般為開發板的電路裁減和擴充,由開發板原理...
Perl學習指南
首先,請考慮如下問題 如果你學過其他語言,那就可以從學習 perl 的語法開始 perl語言入門 或者是從 perl 的自帶文件。當你對 perl 的語法了解後,嘗試書中的例子,試著寫一些簡單的程式。很快你就會發現 perl 和你以前學過的語言類似。如果你是乙個有經驗的程式設計師,你可能直接會從讀程...
SAP HANA 學習指南
sap hana 學習指南 第一部分 sap hana 概覽 第二部分 sap hana資料庫體系結構 2.1 體系結構概覽 2.2 記憶體結構 2.3 sap hana 多版本併發控制 sap hana mvcc 2.4 列儲存 column store 2.5 行儲存 row store 2.6...