① DSP匯編指令
上面一段是中斷向量表,然後間隔十六個空間。
下面一段是表示在原地循環,一般是主程序時,這時就只響應中斷程序。
在有問題的話qq:1340621316
② 請問剛開始學習DSP應該怎麼學習,編程應該學習C語言還是匯編語言呢,請高手指點一下。
呵呵,看到這個問題和一些網友的回答,感到走自學成才之路的人真多!
很多人都不懂由淺入深,循序漸進的路子。
C語言是在大一學的,有了初中水平即可掌握C語言。不上大學,也能學會C語言。
學會了C語言,並不能算有什麼成就。
大約在大三、大四,學習了模電、數電等課程之後,才學到單片機和DSP。
學單片機和DSP,目的就是學習硬體和匯編。
在這個期間,怎麼還能提到學C語言? C語言編程不是在前兩年就會了嗎?
學DSP,如果學不好匯編語言,可以說是根本就沒有學會DSP。
學好了硬體和軟體,用什麼語言編寫程序,並沒有規定。
粗放型的,使用C即可,想要精雕細刻,就必須用匯編語言。
③ DSP匯編編程
.global start ; 定義全局標號
.sect ".resect"
B start
.text
.bss x,1 ;三個變數各為一個字(16位,非初始化段)
.bss y,1
.bss z,1
.textstart:
ldp #0 ;因下面諸變數使用直接定址,裝載DP值
splk #5,x ;變數賦初值,x=5
splk #6,y ; y=2
lacc x ;將x的值裝載至累加器
add y ;累加器加上y的值
sacl z ;將累加器結果(32位)的低16位存放到變數z
ldp #4 ;直接定址,裝載DP值,頁指針指向片內數據區DARAM B0
splk #1,1 ; 絕對地址201H開始的四個單元存1,2,3,4
splk #2,2
splk #3,3
splk #4,4; 以下使用間接定址將201H開始的4個單元的數
; 轉存到300H開始的4個單元 lar ar0,#201h ; 源起始地址存在輔助寄存器0
lar ar1,#300h ;目的起始地址存在輔助寄存器1
lar ar2,#3 ; 循環計數值為移動數-1
mar *,ar0 ; 設置當前輔助寄存器為ar0loop1: ;開始循環搬移數據
lacc *+,ar1 ;將當前輔助寄存器(ar0);所
;指向的數據內存單元的值裝載到acc,
; ar0加1,設置當前輔助寄存器為ar1
sacl *+,ar2 ; acc低16位存放到當前輔助寄存;器(ar1)指定的單元
ar1加1,設置當前輔助寄存器為ar2
banz loop1,ar0 ; 當前輔助寄存器(ar2)如果不等於0則當前輔助寄 存器(ar2)減1,轉loop1xh: B xh ; 空循環
.end
④ 如何用DSP匯編程序實現Z=X+Y
.global start ; 定義全局標號
.mmregs
.data
.bss x,1 ; 開設全局變數(非初始化段)
.bss y,1 ; 三個變數各為一個字(16位)
.bss z,1
.text
start:
ST #0f000h,*(x)
ST #0e000h,*(y)
LD #0h,A
ADD *(x),A
ADD *(y),A
STL A,*(z)
xh:
b xh ; 空循環
.end
⑤ 對DSP而言,CCS用C語言編程和匯編編程,二者的效率相差多少
我用的是28XX系列的,不知道經驗對你有沒有用,因為不同系列的晶元多少有些差別。
TI提供的庫已經相當可以了,兼顧易用與效率。我當時做過這樣的測試
1. 用IQMATH實現
2. 直接C語言實現
3. C語言優化實現
4. 原生匯編實現
IQMATH的運行周期在1000左右,比方案3快幾十個周期,比方案4慢幾個周期,方案2是10000多個周期。
另外,因為只是單獨測的演算法,匯編之所以快是快在寄存器的使用上,操作數可以直接入寄存器,但是考慮到程序其他部分是用C語言編寫的話,把操作棧的時間也加上,並不比方案1快。畢竟我對TI的匯編吃的也不透。
在編寫上,無疑是方案1提供了最接近C語言風格的實現,幾乎不用考慮ISA方面的問題。
另外對於執行效率,我覺得主要考慮三點:
1.分支的使用
CCS對C語言的優化我沒做過太多比對。其實單從反匯編的結果看,我接觸過的嵌入式開發環境的編譯器都能做出很好的優化。但是幾乎每個編譯器都會在邏輯的優化上有欠缺——它只能對一些顯而易見的判斷條件進行優化,而在寫程序的過程中,我們經常出於易讀性的考慮,或者穩定性的考慮,或者其他的考慮加入幾乎不會發生的分支,這樣的分支判斷會消耗一定比率的代碼段執行效率,視乎代碼段內有用功能的長度而定,越長這個比率越小,越短這個比率越高。
2.一般操作,就是各種賦值操作
在一般的操作上,編譯器的優化已經很令人滿意了,基本上可以作為編寫匯編的範本。我覺得所謂效率能達到90%就是針對這個部分說的。
3.特殊操作,比如對整塊內存的操作,或者是浮點運算上。
在一些特殊的操作上,就要看是否有現成的庫,或者看硬體是否支持。比如對整塊內存操作就別用循環一個位元組一個位元組的搬了。
以上三點都能考慮到的話,相信執行效率方面已經沒有太大的提升空間了。
另外如果你的代碼發生在初始化部分,也就是只在系統運行開始的時候運行一次,那麼優化不優化其實沒有太大的必要,除非你對系統初始化的時間有嚴格的要求。但是如果你的代碼是作為任務要被反復運行的,那就有優化的必要了。
在CCS里有代碼消耗時鍾周期的統計,如果你覺得某段代碼效率低下的話,可以先分段進行消耗時鍾周期的計算,這樣優化比較有針對性。
⑥ dsp匯編怎麼學
現在C5509的教材比較多,說的也很詳細。現在DSP代碼為了方便一直,都是用C寫的,你可以看看TI給的常式和庫文件。匯編了解就行,沒有必要深入到對寄存器的操作,就連現在DSP的C代碼,ti也給我們提供了很多庫文件,直接調用就行,執行效率也高。
⑦ DSP中如何用匯編指令讀寫一個全局變數
LDW和STW都是以地址來作為讀取和存儲的。你需要得到這個變數的地址,然後才能用ldw和stw來進行讀寫操作。
⑧ dsp要用到匯編語言嗎
肯定要匯編,你不用怕,匯編用得很少,你最好學學匯編,至少要看得懂(不難),絕大多數情況都是把匯編COPY過來用,C語言編程占據99%,剩下1%的匯編你搞不定,整個程序你就OVER了。
⑨ DSP實現數字濾波器,用匯編語言怎麼編寫程序
希望可以幫到你
用線性緩沖區實現FIR濾波器
程序清單:
.title 「FIR1.ASM」
.mmregs
.def start
x .usect 「x」,8
PA0 .set 0
PA1 .set 1
.data
COEF: .word 1*32768/10
.word 2*32768/10
.word -4*32768/10
.word 3*32768/10
.word -4*32768/10
.word 2*32768/10
.word 1*32768/10
.text
start: SSBX FRCT
STM #x+7,AR2
STM #6,AR0
LD #x+1,DP
PORTR PA1,@x+1
FIR1: RPTZ A,#6
MACD *AR2-,COEF,A
STH A,*AR2
PORTW *AR2+,PA0
BD FIR1
PORTR PA1,*AR2+0
.end
用循環緩沖區實現FIR濾波器
程序清單:
.title 「FIR2.ASM」
.mmregs
.def start
.bss y,1
xn .usect 「xn」,7
b0 .usect 「b0」,7
PA0 .set 0
PA1 .set 1
.data
table: .word 1*32768/10
.word 2*32768/10
.word 3*32768/10
.word 4*32768/10
.word 5*32768/10
.word 6*32768/10
.word 7*32768/10
.text
start: SSBX FRCT
STM #b0,AR1
RPT #6
MVPD table,*AR1+
STM #xn+6,AR2
STM #b0+6,AR3
STM #7,BK
STM #-1,AR0
LD #xn,DP
PORTR PA1,@xn
FIR2: RPTZ A,#6
MAC *AR2+0%,*AR3+0%,A
STH A,@y
PORTW @y,PA0
BD FIR2
PORTR PA1,*AR2+0%
.end
鏈接命令文件
FIR2.obj
vectors.obj
-o FIR2.out
-m FIR2.map
-e start
MEMORY
{
PAGE0:
EPROM:org=0E000h,
len=1000h
VECS: org=0FF80h,
len=0080h
PAGE1:
SPRAM:org=0060h,
len=0020h
DARAM:org=0080h,
len=1380h
}
SECTIONS
{
.text:>EPROM PAGE 0
.data:>EPROM PAGE 0
.bss :>SPRAM PAGE 1
xn:align(8){}>DARAM PAGE 1
b0:align(8){}>DARAM PAGE 1
.vections:VECS PAGE 0
}
⑩ dsp 用什麼編程
CCS
CCS有兩種工作模式:
1、軟體模擬器模式:可以脫離DSP晶元,在PC機上模擬DSP的指令集和工作機制,主要用於前期演算法實現和調試。
2、硬體在線編程模式:可以實時運行在DSP晶元上,與硬體開發板相結合在線編程和調試應用程序。
CCS的開發系統主要由以下組件構成:
① TMS320C54x集成代碼產生工具;
② CCS集成開發環境;
③ DSP/BIOS實時內核插件及其應用程序介面API;
④ 實時數據交換的RTDX插件以及相應的程序介面API;
⑤ 由TI公司以外的第三方提供的各種應用模塊插件。
(10)dsp匯編編程擴展閱讀
dsp編程中雙重循環、多重循環的優化:
(1)多重循環拆成單層循環,減少循環層數;
例如,雙重循環內一個cycle只使用了一個乘法器,拆成單層循環後,一個cycle可使用2個乘法器,充分利用DSP乘法器資源,同時運算速度也會加快;
(2)循環次數少的放在外層循環,循環次數多的放在內存循環;
(3)二維數組的二重循環:二維數組的行循環放在外層循環,列循環放在內層循環;
(4)避免循環內部的乘除運算:循環內部的乘除運算盡量移到循環外部以及用加法替代。