《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 嵌入式C語言開發(fā)ADSP21XX系列
嵌入式C語言開發(fā)ADSP21XX系列
摘要: 詳細介紹使用VisualDSP開發(fā)工具進行ADSP21XX的C語言編程的方法,;分析其C語言運行庫的結構,,并且結合實例介紹C語言工具的使用方法,,包括C語言與匯編語言混合編程的方法,,從C運行庫提取代碼用于自己的匯編語言程序的方法,、修改運行庫的源代碼以適應自己開發(fā)需要的方法等,。
Abstract:
Key words :

  引言

  長期以來,,在DSP系統(tǒng)開發(fā)中,,一直把匯編語言作為主要的開發(fā)工具,;但匯編語言與自然語言差距很大,,不易常,,而且匯編語言是依賴于處理器的,不利于軟件的可重復利用和系統(tǒng)的穩(wěn)定性,,程序不易移植,,給開發(fā)工作帶來了很大的困難。隨著嵌入式系統(tǒng)復雜程度的不斷提高,,用匯編語言編寫一個巨大的程度將是困難,,甚至是不可能的。為此,,AD公司推出了針對ADSP21XX系列DSP的嵌入式C和C++語言集成開發(fā)工具,,分別是VisualDSP和VisualDSP++系列,這些開發(fā)工具提供了C語言和C++語音的開發(fā)功能,。以下就以筆者在實際開發(fā)中的一些經驗,,結合VisualDSP6.1版本,介紹用C語言開發(fā)VisualDSP6.1版本,,介紹用C語言開發(fā)ADSP21XX的方法,。VisualDSP提供了一個開放源碼軟件組織GNU的C編譯器,和一套成熟穩(wěn)定的C運行時間庫(C Run time Library)等,。GNU的編譯器一向以編譯效率高著稱,在編譯后的代碼長度和運行速度方面非常優(yōu)秀,;C運行時間庫則把很多重復性的工作,,如浮點運行、三角函數(shù),、FFT等作為C語言的庫函數(shù),,提供給用戶,大大提高了用戶的開發(fā)效率和程序的穩(wěn)定性,,降低了開發(fā)難度,,另外,由于把這些庫函數(shù)的源代碼提供給了用戶,,還提高了C語言與匯編語言之間的透明性,,使用戶開發(fā)的程序兼具兩者的優(yōu)點。

  1 Visual DSP簡介

  VisualDSP是AD公司的DSP開發(fā)工具,,主要由可執(zhí)行文件,、庫文件和各種幫助文檔組成。6.1版本還帶有一個基于圖形界面,,針對21XX系列DSP的軟件仿真和調試工具,。

  VisualDSP的可執(zhí)行文件包括匯編、編譯,、鏈接工具以及可執(zhí)行文件重新格式化工具等,,見表1。

表1 VisualDSP的可執(zhí)行文件及用途

VisualDSP的可執(zhí)行文件及用途

  注:“*”代表該程序一般不單獨使用,而昌由G21.exe或ASM21.exe調用,。

  VisualDSP套件中的軟件仿真調試工具DEBUGAPP,,采用Windows圖形界面,使用方便,。它的主要特點是:可以仿真調試從ADSP2101~2189全系列的DSP,;支持斷點、單步,、全速運行等各種常見調試方法,;可以隨時查詢和修改DSP的程序RAM(PM)、數(shù)據(jù)RAM(DM)和各寄存器的內容,;可以仿真中斷,,進行可執(zhí)行程序性能評估(Profile),因此可以進行時序仿真,。DEBUGAPP是調試程序和驗證復雜算法的極好工具,。

  VisualDSP6.1還提供了豐富的幫助文檔,包括21XX系列的用戶手冊,、匯編和C語言工具以及仿真調試程序的使用手冊,;還有C運行庫的參考手冊,列出了所有可用的C庫函數(shù),。

  2 C語言運行庫結構

  C語言運行時間庫是位于LIB目錄下的*.a文件,,是整個C開發(fā)工具的核心之一,提供了大量的可以直接調用的庫函數(shù),。這些庫函數(shù)的函數(shù)原型包含在INCLUDE目錄下的頭文件中,。這些頭文件有的還包含一些宏定義。另外,,VisualDSP還把這些庫函數(shù)的匯編語言源代碼提供給出了用戶,,方便了用戶從中提取有用的代碼,甚至修改源代碼,,生成新的庫,,來適應自己的要求。利用LIB21程序,,還可以把自己的常用匯編子程序做成庫,,或是將實時性要求較高的代碼用匯編語言來寫,做成庫,,供C語言程序調用,。

  VisualDSP的C語言運行庫由兩部分組成:應用程序框架和預定義的各種庫函數(shù)。

  不同的DSP型號有不同的硬件結構,、中斷向量表,,所以對應的應用程序框架庫也不同,,相應的文件是21*_HDR.DSP.其中*代表不同的DSP型號。應用程序框架的主體是中斷向量處理部分,,把中斷向量引到合適的地址,。其中最重要的是對系統(tǒng)復位(RESET_VECTOR)的中斷向量的處理:

程序

  第一條指令是調用C庫函數(shù)中的_ _lib_setup_everything函數(shù)作程序啟動時的初始化工作。接下來,,調用C語言程序中的main_函數(shù),,進入C程序的主體,也就是進入用戶自己程序,,開始正常工作,。主程序結束后,再調用_lib_prog_term函數(shù),,作程序退出時的結尾工作,。由于嵌入式系統(tǒng)的特性,系統(tǒng)絕大多數(shù)都在主程序運行時被繼電了,,所以_lib_prog_term得到執(zhí)行的機會很小,。

  其它的中斷向量由C運行庫來管理,匯編指令如下:

_Interrupt2:JUMP_lib_int2_ctrl;NOP;NOP;NOP,;

  其中的_lib_int2_crtl就是C語言庫中控制INT2的函數(shù),。如果用戶要使用該中斷,應先把中斷服務程序用一個C庫函數(shù)Interrupt()把服務函數(shù)指針設定好,,并打開相應的中斷允許位,,當該中斷發(fā)生時,_lib_int2_ctr1函數(shù)就會控制DSP跳轉到相應的指針位置,。

  VisualDSP預定義的C語言庫函數(shù)包括數(shù)學函數(shù)、FFT函數(shù),、ANSI標準內存管理和字符串管理函數(shù)的一個子集,。所有的函數(shù)列表可參考VisualDSP的聯(lián)機文檔。這些庫函數(shù)以二進制代碼的形式,,打包集合在lib*.a文件中,,用戶的C語言程序可以像使用自己的子程序一樣方便地調用這些庫函數(shù)。下面是調用庫函數(shù)的一個例子,。

 

程序

  編譯后產生的匯編源代碼中有call sin_指令,,就是調用sin庫函數(shù)的匯編語言指令語句。

  從嵌入式開發(fā)的角度講,,VisualDSP的C語言工具已經提供了一個操作系統(tǒng)雛形的功能,。在AD公司的ADMC系列DSP中,已經把這些庫函數(shù)和一些電機控制專用的函數(shù),,以及程序加載功能,,集成在了DSP的片內ROM中,。

  3 C語言與匯編語言混合編程方法

  用C語言開發(fā)的缺點是不能精確控制程序運行的時間,對于實時性要求較高的應用,,必須用匯編語言,。VisualDSP為用戶提供了兩種與匯編語言的接口方法:用ASM()方法,直接嵌入?yún)R編語言語句,;用匯編語言編寫子程序,,供C語言程序調用。為了支持C語言與匯編程序程序的接口,,VisualDSP預定義了諸如FUNCTION_ENTRY,、EXIT、SAVE_REG,、RESTORE_REG等13個宏,。限于篇幅,不詳細介紹其功能,。使用這些宏以前,,要包含asm_sprt.h頭文件。

  3.1 使用ASM()嵌入行的方法

  使用這一方法時,,一定要注意各寄存器和堆棧當前的狀態(tài),,以免破壞程序運行的環(huán)境,產生錯誤的結果,。VisualDSP保留了一些內部寄存器供用戶的匯編代碼使用,。用戶可以自由地修改其內容,而不會對程序造成破壞,。這些寄存器包括AR,、AF、AY1,、M5,、11、16,、MF,、MR0等18個。如果不夠用,,可以用系統(tǒng)定義的宏save_reg和restore_reg保護現(xiàn)場,,得到另外11個可用寄存器。另外要注意的是,,在匯編語言中操作C語言中定義的變量時,,要在變量名后加下劃線。下面是一個嵌套匯編語言的例子:

程序

  編譯后的匯編語言代碼是

程序

  注意前者可能會破壞程序結構,,因為它使用了未經保護的寄存器AX0,;而由C語言產生的匯編代碼,,則會自動選擇合適的臨時寄存器MY1。

  3.2 使用匯編子程序的方法

  使用匯編子程序是C語言程序與匯編語言接口的另一種方法,。用戶定義的子程序放在單獨的匯編文件中,,或是做成二進制的庫文件,并將子程序的定義用GLOBEL輸出,,匯編后就可以供C語言程序調用,。下面是一個不需要參數(shù)的子程序的例子:

程序

  如果匯編語言子程序中用到了參數(shù),情況就復雜些,。子程序中的入口參數(shù)前兩個一定要保存在AR,、AY1中。如果參數(shù)多于兩個就要把其余的放在堆棧中,。所有子程序的第一個返回值放在AR中,。如果返回值不止一個,就要用到變量型參數(shù)或者指針來獲得取所有的返回值了,。下面是一個有5個輸入?yún)?shù),、1個返回值的子程序例子。

程序

  注意其中的readsfirst和readsnext都是匯編語言接口宏,。其功能是從堆棧中讀取所有的參數(shù),。

  4 C運行庫的匯編源代碼

  如果只用C語言來開發(fā)21XX程序,只要有C運行庫的二進制版就夠了,。幸運的是,,AD公司把所有C運行庫的匯編源代碼隨VisualDSP提供給了用戶,所以對那些用匯編語言開發(fā)的工程師來說,,這些源代碼也提供了很大的幫助,。因此這代表很多功能的子程序不需要自己去編碼、調試,,用到某功能時只要把相應的匯編代碼鏈接進自己的程序就可以,。C運行庫的源代碼是擴展名為DSP的文本文件?;旧弦粋€庫函數(shù)對應一個文件,文件名就是函數(shù)名,。比如說sin.dsp是正弦,、余弦查找、使用都很方便,,但是對于其中的交叉調用要注意,。

  反過來,用戶也可以把自己已經調試,、驗證過的匯編子程序,,做成二進制庫文件,,供C程序調用,這樣可以大大提高軟件的可重復利用率,。要制作二進制庫文件,,只要用lib21.exe工具處理就行了。注意,,生成的二制庫文件的名字必須以.a作為文件擴展名,。

  筆者在實際的開發(fā)中,遇到這樣的情況,,自制的2181目標板上有一個自己開忍氣吞聲駐留程序,,通過軟件模擬的異步串口與PC通信,加載程序,。但是這個駐留程序占據(jù)了0~0x500的空間,,用戶開發(fā)的程序只能加載到從0x500開始的空間內,而用C語言開發(fā)的程序起始地址都是從0開始的,。為了解決這個問題,,只能自己修改2181_hdr.dsp源文件。首先把第一行的.MODULE/ABS=0改成.MODULE/ABS=0x500,,然后匯編成obj文件,,代替原來的文件。另外,,在自己的程序中定義一個從0開始0x500大小的PM區(qū)域,,并初始化成0,就可以防止編譯器在該區(qū)域內分配別的變量或程序代碼,,這樣編譯后的可執(zhí)行文件的0~0x500空間都是0,,加載時把它剔除,而其它有用的指令代碼都在0x500之后,,解決了這一個問題,。

  5 總結

  從實際開發(fā)的經驗來看,VisualDSP的C語言開發(fā)功能十分豐富,。雖然提供的庫函數(shù)只是ANSI的一個不完備子集,,但是對于一般的工程開發(fā)來說已經足夠用了,而且VisualDSP還提供了C運行庫的源代碼,,這對于解決函數(shù)不完備的問題也好處,。用C語言開發(fā)的好處還包括開發(fā)時間大大減少,程序的穩(wěn)定性大大提高,,這對于面對激烈的市場競爭,,對于減輕設計工程師的工作量都很有好處。最后,,用C語言開發(fā)是趨勢,,必將更加流行,。

此內容為AET網站原創(chuàng),未經授權禁止轉載,。