DSP程式設計的幾個關鍵問題

2022-12-09 08:33:04 字數 4973 閱讀 7134

dsp晶元憑其優異的效能在高速計算領域有著巨大的應用前景。但其應用所涉及的知識非常龐雜。本文以ti公司320c54x系列為藍本進行提純,所有認識都是筆者在實際工作中親手實踐所得。

當程式調不通不知該從何處下手時,此文也許會有所幫助。這些關鍵點有些是tms320c5409所觸有而有些是與dsp所共有的。

1 mcbsp(multichannel buffered serial port)串列埠利用dma中的多幀(multi-frame)方式通訊的中斷處理

在實際通訊應用中,乙個突發之後,程式必須為下乙個突發作準備。因此一般採用串列埠的dma多幀方式但在串列埠以dma方式傳輸資料時卻有一些問題要討論。首先dma的傳輸同步事件應設mcbsp的傳輸事件即xevt,這樣一位元組傳輸後會自動準備另一位元組(mcbsp的ready上公升沿觸發dma傳輸)。

中斷發生時意味著乙個塊已傳完,這時dma的使能自動關閉,mcbsp的ready將一直保持高狀態。但是在下一次突發傳輸直接使能dma時卻啟動不了傳輸(相信會有許多我遇到此類問題)。這是因為無法產生mcbsp觸發啟動所需的ready上公升沿。

解決辦法是在中斷程式中先關閉mcbsp的傳送,使ready=0,隨後在程式中傳送使能dma,再開啟mcbsp的傳送即可。如先開啟mcbsp的傳送後開啟dma,也是不會工作的。因為mcbsp的ready已經由0變到1了,無法再產生ready上公升沿。

2 關閉dma與關閉mcbsp的區別

在通訊領域,為了充分利用dsp的片上外設資源,常常利用dma把從串列埠來的資料或要發的資料放入緩衝區,再處理。對dma而言,只要其在資料緩衝區的指標指向了中斷應發生的位置,就產生中斷。但此時最後乙個資料只是進入了mcbsp而並未真正發出去,所以在傳送結束的中斷程式中只能關閉dma不能關閉mcbsp。

因為此時mcbsp的發暫存器dxr中還有乙個字沒有發出。

3 mcbsp串列埠配置的關鍵時序

主要是暫存器spcr2的配置:在保持rrst、xrst、frst各位為0的前提下,配置好其它串列埠控制暫存器。等待至少2個clkr/t時鐘以確保dsp內部的同步。

(1)可以向dxr裝載資料或使能dma。

(2)使能grst(grst=1)(如果需要dsp內部產生取樣時鐘)。

(3)使能rrst或xrst,注意此時要保證spcr中僅有此一位發生改變。

(4)使能frst(frst=1)(如果需要dsp內部產生幀同步)。

(5)等待2個r/t clk時鐘週期後,收或發端便會有效。

4 組合語言程式中的變數

組合語言程式中的公用變數應在檔案中定義,如.def carry。組合語言程式中使用的區域性變數不需定義,可直接宣告,例如trn_num .

word 00h。如果在兩個asm檔案中有兩個都沒有定義的同名變數,則編譯程式會認為分他們不是同一變數。在匯程式設計序的開頭應有.

mmregs巨集語句。它一方面表示對預設定義的確認(ah,bh,trn等),另一方面可以對所用暫存器重新定義。如:

.mmregs

dmprec .set 54h ;定義dma優先和使能暫存器位址在54h

dmsa .set 55h

dmsdn .set 57h

dxr10 .set 23h ;定義串列埠1的傳送暫存器地睛在23h

5 st1暫存器中cpl位的影響

cpl位是編譯模式控制位,它表示在相對直接定址時採用哪種指標。當cpl=0時,使用頁指標dp;當cpl=1時,使用堆疊指標sp。實際使用中二者沒有什麼差別,但使用sp定址的程式更易讀。

在程式中經常使用cpl=1。

6 指令的歧義

6.1 比較下面指令

stlm b,ar4 ;把bl內容送入暫存器ar4 (×)

stlm b,*ar4 ;把bl內容送入暫存器ar4 (√)

前者實際執行的是把bl內容送入乙個系統用的緩衝區,後者也可用:

mvdm bl,ar4 ;把bl內容送入暫存器ar4 (√)

其他易導致歧義的語句還有:

ld ar5,a ;把ar5的內容送入暫存器a (×)

ldm ar5,a ;把ar5的內容送入暫存器a (√)

andm #0x107e,ar4;把#107e加到暫存器ar4 (×)

andn #0x107e,*ar4;把#107e加到暫存器ar4 (√)

僅對某些暫存器有效的指令:

mvdd * ar2+,*ar3+ ;把以ar2為位址的內容拷入ar3的位址中

此類指令用作資料塊搬移特別有效,但僅對ar2、ar3、ar4、ar5有效。

易錯語句中對程式執行危害最大的是:

st #0,*(bsp0_out_sign) ;bsp0_out_sign是乙個變數名(√)

stm #0,bsp0_out_sign ;此語句被編譯為stm #0,pmst或stm #0,imr (×)

這種語句會導致程式執行中的隨機故障,且極難發現。

6.2 流水衝突

分析以下程式:

stm to_dce_buff,ar4

ldm ar4,b

add a,b ;b=ar4+al

mvdm bl,ar4 ;ar4=to-dce-buff+al

實際上,上段程式得不到ar4=to-dce-buff+al的結果。這是因為dsp一般採用深度為3~6級的流水結構,產生了無法解決的衝突,所以它不能被正確執行。解決的辦法是在賦值和引用之間插入一條或幾條其他的指令,或nop語句即可。

7 彙編與c語言混合程式設計的關鍵問題

7.1 c程式變數與匯程式設計序變數的共用

為了使程式更易於介面和維護,可以在匯程式設計序中引用與c程式共享的變數:

.ref_to_dce_num,_to_dte_num,_to_dce_buff,_to_dte_buff

在匯程式設計序中引用而在c程式可直接定義的變數:

unsigned char to_dte_buff[buff_size]; //dsp發向pc機的資料

int to_dte_num; //緩衝區中存放的有效位元組數

int to_dte_store: //緩衝區的存放指標

int to_dte_read; //緩衝區的讀取指標

這樣經過鏈結就可完成對應。

7.2 程式入口問題

在c程式中,程式的入口是main()函式。而在匯程式設計序中其入口由*.cmd檔案中的命令決定,如:

-emain_start;程式入口位址為main_start。這樣,混合彙編出來的程式得不到正確結果。因為c到asm的彙編有預設的入口c-int00,從這開始的一段程式為c程式的執行做準備工作。

這些工作包括初始化變數、設定棧指標等,相當於系統殼不能耐跨越。這時可在*.cmd檔案中去掉語句:

-e main_start。如仍想執行某些匯程式設計序,可以c函式的形式執行,如:

main_start(); //其中含有其他匯程式設計序

但前提是在匯程式設計序中把_main_start作為首位址,程式以rete結尾(作為可呼叫的函式)的程式段,並在匯程式設計序中引用_main_start,即.ref _main_start。

7.3 移位問題

在c語言中把變數設為char型時,它是8位的,但在dsp彙編中此變數仍被作為16位處理。所以會出現在c程式中的移位結果與匯程式設計序移位結果不同的問題。解決的辦法是在c程式中,把移位結果再用0x00ff去「與」一下即可。

7.4 堆疊問題

在匯程式設計序中對堆疊的依賴很小,但在c程式中分配區域性變數、變數初始化、傳遞函式變數、儲存函式返回位址、保護臨時結果功能都是靠堆疊完成。而c編譯器無法檢查程式執行時堆疊能否溢位。所以應盡量多給堆疊分配空間。

c編譯器的預設大小為1kb。在程式不正常跑飛時應注意檢查是否堆疊溢位。

7.5 程式跑飛問題

編譯後的c程式跑飛一般是對不存在的儲存區訪問造成的。首先要查.map檔案並與memery map圖對比,看是否超出範圍。

如果在有中斷的程式中跑飛,應重點查在中斷程式中是否對所用到的暫存器進行了壓棧保護。如果在中斷程式中呼叫了c程式,則要查彙編後的c程式中是否用到了沒有被保護的暫存器並提供保護(在c程式的編譯中是不對a、b等暫存器進行保護的)。

8 命令檔案的編寫

在編輯*.cmd檔案時編譯聯結器預設:page 0就是rom區,page 1就是ram區。下列段必須放在rom區。

.text load=prog page 0 ;程式段

.const load=data page 0 ;常數段

.cinit load=data page 0 ;初始化段

.switch load=data page 0 ;switch指令常數表

值得注意的是盡量不要用fill選項,一旦進行填充會使生成的.out檔案增大甚至超過內部的儲存空間而無法bootload。

9 bootload問題

一般都採用從eprom引導,但通常很費腦筋。下面介紹一下可為54x系列dsp內部引導程式識別的eprom儲存結構,如表1所示。

假使已經生成了*.out檔案,生成時必須帶有晶元,此處為ms320vc5409,版本引數如:asm500 init_54x-v548)。

.hex檔案與eprom的儲存空間相對應,其生成的引數由.cmd檔案決定。下面以例項介紹.cmd檔案中的引數編寫及意義。

;將檔案轉換成.hex檔案

-swwsr 7fffh ;將外部裝置的等待時間設為7個等待狀態

-bscr 0f800h ;設定4k為一頁,頁面切換時插入1個等待狀態

-o ;轉換成檔案

-i ;intel格式

-boot ;把所有的程式塊裝入eprom

-bootorg 8000h ;從eprom儲存器的8000h處開始寫入程式內容

-memwidth 8 ;系統資料寬度轉為8位,以避免生成2個檔案

-romwidth 8 ;eprom資料寬度為8位

-e 0840h ;從8040h開始執行程式

-map ;生成eprom儲存器占用對映

這時生成的可以直接寫入eprom。需要說明320c5409的外部ram範圍從8000h~ffffh,所以設首位址為8000h。但是對c54x系列而言,其轉換有個bug,即它總是不能在0xffff處寫入從外部eprom儲存器裝載的開始位址,只好自己填入。

對本例而言在0xfffe處寫0x80,在0xffff處寫0x00。

圖說物聯網發展的幾個關鍵問題

一 概念辨析 目前,關於物聯網的一般概念是 通過射頻識別 rfid 紅外感應器 全球定位系統 雷射掃瞄器等資訊感測裝置,按約定的協議,把任何物品與網際網路連線起來,進行資訊交換和通訊,以實現智慧型化識別 定位 跟蹤 監控和管理的一種網路 但是,對於物聯網的本質卻一直沒有統一明確的界定,有人說物聯網就...

工程結算中需注意的幾個關鍵問題

摘要 總結了目前工程結算工作中存在的三個方面的主要問題,深入分析了問題的根源。針對這些問題提出了相應的措施和方法,並進行了詳盡的闡述。關鍵詞 工程結算 技術措施 現場簽證 隨著社會主義市場經濟體制的建立,工程建設管理者的思想觀念發生了很大轉變。建設單位為合理使用建設資金而精打細算,以獲取更多的投資效...

試論企業管理中的幾個關鍵問題

摘要 有學者說,企業興衰,在於三分技術,七分管理,現代企業制度的特點是產權清晰 權責明確 政企分開 管理科學。一切社會事務的實現均要通過管理,一切決策意圖 決策過程 決策實施均是管理過程。關鍵詞 企業管理 投資專案 合理定位 一 投資專案要進行可行性論證,才做決策 投資任何專案都是有風險的,是否可行...