[實驗一 新手上路] 初學者編寫的第一個程序通常是控制XF引腳的變化,然後用示波器測量XF腳波形或觀察與相接的LED。這個程序也常常用來測度一下DSP能否正常工作。
實驗1.1 最簡單的程序:控制XF引腳週期性變化
實驗目的:通過簡單的程序瞭解DSP程序的結構,熟悉CCS開發環境。
*************************************************************
*最簡單的程序:TestXF1.asm
*循環對XF位置1和清0,用示波器可以在XF腳檢測到電平高低週期性變化
*常用於檢測DSP是否工作。
*************************************************************
.mmregs ;預定義的寄存器
.def CodeStart ;定義程序入口標記
.text ;程序區
CodeStart: ;程序入口
SSBX XF ;XF置1
RPT #999 ;重複執行1000次空指令產生延時
NOP
RSBX XF ;XF清0
RPT #999 ;重複執行1000次空指令產生延時
NOP
B CodeStart ;跳轉到程序開頭循環執行
.end
NOP指令執行時間為一個時鐘週期,設DSP工作頻率是50MHz,可以估算出XF引腳電平的變化頻率約為:50M/2000=25kHz
在沒有示波器的情況下,就要將程序1.1稍作改進,增加延時,用一個延時子程序將XF腳電平變化頻率降到肉眼可分辨的程度,就可以用LED來顯示電平的變化,程序如下:
實驗1.2 子程序調用
實驗目的:學習子程序的調用
*************************************************************
*TestXF2.asm
*對TestXF1.asm稍作改進,用延時子程序設置較長的延時,
*可以用試驗板上的LED看到XF引腳電平的變化
*************************************************************
.mmregs ;預定義的寄存器
.def CodeStart ;定義程序入口標記
.text ;程序區
CodeStart: ;程序入口
SSBX XF ;XF置1
CALL Delay ;調用延時程序
RSBX XF ;XF清0
CALL Delay ;調用延時程序
B CodeStart ;跳轉到程序開頭循環執行
**************************************************************
*延時子程序:Delay
*用兩級減一計數器來延時。調整AR1和AR2的大小LED閃爍的頻率不同
**************************************************************
Delay:
STM #999,AR1 ;循環次數1000
LOOP1: STM #4999, AR2 ;循環次數5000
LOOP2: BANZ LOOP2,*AR2- ;如果AR2不等於0,AR2減1,再判斷
BANZ LOOP1,*AR1- ;如果AR1不等於0,AR1減1,跳轉到LOOP1
RET
.end
**************************************************************
*注意這種延時方法並不精確,需要精確定時必須用定時器。
*按此法延時的近似公式為:4*(AR2+1)*(AR1+1)*時鐘週期
*當DSP工作在50MHz(時鐘週期20ns),AR1=999, AR2=4999時
*延時約為400ms,則LED閃爍的週期為800ms,頻率1.25Hz
**************************************************************
設計指導:
1.源代碼書寫格式
源代碼的書寫有一定的格式,初學者往往容易忽視。簡單歸納如下:
1.每一行代碼分為三個區:標號區、指令區和註釋區。標號區必須頂格寫,主要是定義變量、常量、程序標籤時的名稱。指令區位於標號區之後,以空格或TAB格開。如果沒有標號,也必須在指令前面加上空格或TAB,不能頂格。註釋區在標號區、程序區之後,以分號開始。註釋區前面可以沒有標號區或程序區。另外還有專門的註釋行,以*打頭,必須頂格開始。
2.一般區分大小寫,除非加編譯參數忽略大小寫。
3.標點符號有時不注意會打成中文全角字符導致錯誤。
書寫格式的要求在很多DSP書裡都沒有提,初學者往往只把書上的代碼輸入進去,編譯時得到錯誤的提示,而不知所措。其中最容易犯的錯誤指令頂格寫,不過一般經提示後不會犯第二次。
有些格式CCS並沒有做要求,但注意養成良好的代碼書寫風格,增加代碼的可讀性。以上兩個例子的書寫風格可作參考,但不是硬性規定:
1.標號區佔3個TAB的間隔,即12個字符
2.指令中的指令碼佔兩個TAB間隔,然後是操作數。
3.每一行的尾注能對齊的儘量對齊
4.標明一段程序功能的註釋以*號打頭頂格寫,如果功能說明的註釋較多,用分格線框起來。
此外其它編程語言的編程風格也可以借用過來,比如標示符命名規則、程序說明的要求等。如果項目組有規定,則按規定執行。
本書的代碼儘量保持一定的風格,不過讀者可以發現前面的代碼註釋較多,後面隨著學習的深入,一般不會對每一條指令加註釋,只註明程序段的功能。另外代碼貼到word裡後,格式有些錯位,無法一一糾正。
2.鏈接配置文件
一個完整的DSP程序至少包含三個部分:程序代碼、中斷向量表、鏈接配置文件(*.cmd)。這裡介紹一下鏈接配置文件文件,對本次試驗影響不大的中斷向量表將在後文介紹。
連接配置文件的確定了程序鏈接成最終可執行代碼時的選項,其中有很多條目,實現不同方面的選項,其中最常用的也是必須的有兩條:1.存貯器的分配
2.標明程序入口。以本次實驗為例,下面的簡單的鏈接配置文件就夠用了:
/* TestXF.cmd */
-e CodeStart /*程序入口,必須在程序中定義相應的標號*/
MEMORY {
page 0:
PRAM: org=0100h len=0F00h /*定義程序存貯區,起始0100H,長度0F00H*/
}
SECTIONS{
.text:>PRAM page 0 /*將.text段映射到page0的param區*/
}
由於每個程序都需要一個鏈接配置文件,可以編寫一個滿足通常需要的鏈接配置文件。作為本手冊通用的鏈接配置文件如下,可以滿足本書大部分程序的需要。在未特別指明的情況下使用這個通用的鏈接配置文件:
/* 5402.cmd */
-e CodeStart /*程序入口,必須在程序中定義相應的標號*/
-m map.map /*生成存儲器映射報告文件 */
MEMORY {
PAGE 0:
VECT: org=0080h len=0080h /*中斷向量表*/
PARAM: org=100h len=0F00h /*代碼區*/
PAGE 1:
DARAM: org=1000h len=1000h /*數據區*/
}
SECTIONS {
.text :> PARAM PAGE 0 /*代碼段*/
.vectors :> VECT PAGE 0 /*中斷向量表*/
STACK :> DARAM PAGE 1 /*堆棧*/
.bss :> DARAM PAGE 1 /*未命名段*/
.data :> DARAM PAGE 1 /*數據段*/
}
更多參考:
1.關於代碼書寫格式:SPRU102: TMS320C54x Assembly Language Tools User's Guide,3.5
Source Statement Format
2.關於鏈接配置文件:SPRU102: TMS320C54x Assembly Language Tools User's Guide,7.5
Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive
練習:
1、試一下不按規定格式書寫代碼會產生什麼樣的編譯錯誤。
2、試一下將鏈接配置文件中的MEMORY,SECTIONS改成小寫會出現什麼樣的編譯錯誤。
3.修改程序1.2中AR1,AR2的值,觀察LED閃爍頻率
|