《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 嵌入式C語言開發(fā)ADSP21XX系列DSP
嵌入式C語言開發(fā)ADSP21XX系列DSP
互聯(lián)網(wǎng)
摘要: 詳細(xì)介紹使用VisualDSP開發(fā)工具進(jìn)行ADSP21XX的C語言編程的方法;分析其C語言運行庫的結(jié)構(gòu),并且結(jié)合實例介紹C語言工具的使用方法,包括C語言與匯編語言混合編程的方法,從C運行庫提取代碼用于自己的匯編語言程序的方法、修改運行庫的源代碼以適應(yīng)自己開發(fā)需要的方法等。
Abstract:
Key words :
  摘要:詳細(xì)介紹使用VisualDSP開發(fā)工具進(jìn)行ADSP21XX的C語言編程的方法;分析其C語言運行庫的結(jié)構(gòu),并且結(jié)合實例介紹C語言工具的使用方法,包括C語言與匯編語言混合編程的方法,從C運行庫提取代碼用于自己的匯編語言程序的方法、修改運行庫的源代碼以適應(yīng)自己開發(fā)需要的方法等。

    關(guān)鍵詞:DSP VisualDSP 嵌入式C語言 匯編語言

引言

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

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

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

可執(zhí)行文件名

用      途

Asmpp.exe* 匯編預(yù)處理程序
Asm2.exe* 21XX系列匯編程序的匯編程序
Asm21.exe 21XX系列命令行匯編程序
Ld21.exe 21XX系列鏈接工具
G21.exe 基于GNU的21XX系列C編譯器
Bld21.exe 系統(tǒng)編譯工具,產(chǎn)生相應(yīng)于不同硬件體系的.ACH文件
Lib21.exe 21XX系列的庫管理工具
Hspl21.exe 把21XX系列可執(zhí)行文件變成HIP口可加載的格式
Spl21.exe 把21XX系列可執(zhí)行文件變成PROM可燒寫的格式

注:“*”代表該程序一般不單獨使用,而昌由G21.exe或Asm21.exe調(diào)用。

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

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

2 C語言運行庫結(jié)構(gòu)

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

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

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

_Reset_vector:CALL_lib_setup_everything;

CALL main_;

JUMP_lib_prog_term;

NOP;

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

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

_Interrupt2:JUMP_lib_int2_ctrl;NOP;NOP;NOP;

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

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

#include //包含所需的頭文件

……

float a,b,c; //定義所需的變量

……

c=a*sin(b); //數(shù)學(xué)運算

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

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

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

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

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

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

int img228; //定義C語言變量

asm("ax0=0x5c;")

asm("dm(ing228_)=ax0"); //用匯編語言賦值要將Img228變成Img228_

img228=0x5c; //直接用C語言賦值

編譯后的匯編語言代碼是

ax0=0x5c;

dm(img228_)=ax0

my1=92;

dm(img228_)=my1;

注意前者可能會破壞程序結(jié)構(gòu),因為它使用了未經(jīng)保護(hù)的寄存器AX0;而由C語言產(chǎn)生的匯編代碼,則會自動選擇合適的臨時寄存器MY1。

3.2 使用匯編子程序的方法

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

.MODULE/RAM_delay_;

.external del_cycle; //聲明del_cycle是外部變量

.global delay; //聲明delay為全局函數(shù)

delay_:

runction_entry; //子程序開始標(biāo)志,必須要的

ar=dm(del_cycle_);

cntr=ar;

do d_loop until ce;

d_loop:nop;

exit; //子程序結(jié)束標(biāo)志,必須要的

.ENDMOD;

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

add5_:

function_entry;

ar=ar+ay1; //前面的兩個變量放在AR、AY1中

readsfirst(ay1); //從程序堆棧中讀取第三個變量

ar=ar+ay1;

ay1=readsnext; //從程序堆棧中讀取第四個變量

ar=ar+ay1;

ay1=readsnext; //從程序堆棧中讀取第五個變量

ar=ar+ay1; //返回值放在AR中

exit;

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

4 C運行庫的匯編源代碼

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

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

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

5 總結(jié)

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

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲黄色一区| 一区二区三区四区精品| 伊人久久大香线蕉综合热线 | 欧美深夜福利| 国产美女高潮久久白浆| 欧美成人激情视频| 久久久久国产精品一区三寸| 中文精品在线| 亚洲精品视频啊美女在线直播| 亚洲免费一级电影| 日韩视频一区二区三区在线播放免费观看 | 亚洲日本免费电影| 亚洲成人中文| 国产欧美大片| 国产精品久久久久久五月尺| 老司机一区二区| 欧美综合激情网| 亚洲欧美日本另类| 亚洲图片欧洲图片日韩av| 狠狠干狠狠久久| 国产综合色一区二区三区| 国产精品一页| 国产精品美女一区二区| 欧美色大人视频| 欧美日本中文字幕| 欧美电影在线观看完整版| 久久综合亚州| 久久精品二区| 久久精品一区二区| 欧美在线播放视频| 欧美在线不卡视频| 欧美一区二区私人影院日本| 亚洲欧美一区二区视频| 亚洲免费在线视频| 亚洲男人av电影| 亚洲视频电影在线| 亚洲性图久久| 亚洲一区二区黄| 亚洲尤物视频在线| 亚洲欧美激情一区| 亚洲欧美在线另类| 欧美一级免费视频| 午夜视频在线观看一区| 欧美一级片在线播放| 亚洲一区不卡| 亚洲永久网站| 午夜在线观看免费一区| 欧美一级二区| 久久先锋资源| 欧美mv日韩mv国产网站| 欧美夫妇交换俱乐部在线观看| 久久久中精品2020中文| 老司机成人网| 欧美成人小视频| 欧美经典一区二区| 亚洲一区二区日本| 亚洲视频综合| 午夜视频一区二区| 久久精品盗摄| 欧美3dxxxxhd| 欧美日韩一区二区三区四区五区 | 亚洲免费视频在线观看| 欧美在线看片| 亚洲日韩第九十九页| 亚洲精品美女91| 在线视频欧美日韩精品| 亚洲欧美第一页| 久久国内精品视频| 亚洲视频在线二区| 亚洲尤物视频网| 欧美亚洲一区| 亚洲国产精品久久久久婷婷884 | 久久不射中文字幕| 久久亚洲高清| 欧美日韩在线免费| 国产婷婷成人久久av免费高清| 伊人夜夜躁av伊人久久| 亚洲免费精彩视频| 亚洲男女毛片无遮挡| 欧美亚洲午夜视频在线观看| 亚洲高清资源| 亚洲一区二区三区高清不卡| 久久精品99国产精品酒店日本| 欧美 日韩 国产在线| 欧美精品久久久久久| 欧美午夜一区二区| 激情综合视频| 亚洲视频在线播放| 99视频精品全国免费| 久久五月激情| 国产欧美亚洲视频| 亚洲桃花岛网站| 99re6热只有精品免费观看| 久久女同互慰一区二区三区| 国产精品手机在线| 99一区二区| 99国产精品久久久久久久久久| 久久久久久久久蜜桃| 国产精品欧美一区二区三区奶水| 亚洲人www| 亚洲激情欧美| 久久综合亚州| 韩国在线一区| 欧美一级专区| 欧美一区二区三区久久精品茉莉花| 欧美日韩国产综合网| 亚洲激情不卡| 亚洲精品久久| 免费试看一区| 激情一区二区| 亚洲国产高清aⅴ视频| 久久另类ts人妖一区二区| 国产亚洲成av人片在线观看桃| 亚洲免费婷婷| 欧美一区二区日韩一区二区| 国产精品福利在线观看| 一区二区三区欧美在线| 一区二区日韩免费看| 欧美噜噜久久久xxx| 亚洲国产精品综合| 日韩午夜三级在线| 欧美日韩国产影院| 日韩一级裸体免费视频| 一区二区三区高清不卡| 欧美区一区二区三区| 亚洲精品国产品国语在线app| 日韩亚洲欧美高清| 欧美精品一区二区三区在线看午夜 | 国产精品视频观看| 亚洲砖区区免费| 欧美一区二区女人| 国产日韩在线一区| 久久精品日产第一区二区| 久久亚洲一区二区三区四区| 精品动漫3d一区二区三区| 亚洲黄色一区二区三区| 欧美激情五月| 亚洲麻豆av| 亚洲综合国产| 国产伦精品一区二区三区免费| 香蕉精品999视频一区二区| 久久精品亚洲精品国产欧美kt∨| 韩日欧美一区二区| 亚洲激情在线观看| 欧美日本成人| 亚洲一区二区三区四区在线观看| 欧美一区二区三区视频在线观看| 国产一区二区无遮挡| 亚洲国产精品久久久久久女王| 欧美国产视频在线| 日韩一级黄色av| 欧美在线视屏| 亚洲成人在线免费| 亚洲一级网站| 国产一区二区三区在线播放免费观看 | 国产精品毛片| 久久精品国产精品亚洲精品| 欧美成人一区在线| 在线视频精品一| 久久精品av麻豆的观看方式| 亚洲第一天堂av| 亚洲一区二区三区免费观看| 国产日韩精品视频一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 欧美精选午夜久久久乱码6080| 亚洲一区二区视频| 久久精品亚洲一区| 亚洲精品在线一区二区| 香港久久久电影| 1000部国产精品成人观看| 亚洲一区高清| 狠狠色噜噜狠狠色综合久| 一本色道久久99精品综合| 国产拍揄自揄精品视频麻豆| 亚洲日本va午夜在线电影| 欧美日韩一区二区三区在线观看免| 欧美一级专区| 欧美日韩免费精品| 欧美在线观看一区二区| 欧美日韩国产影院| 久久精品国产99精品国产亚洲性色| 欧美日韩你懂的| 亚洲国产精品一区二区尤物区| 国产精品99免费看 | 亚洲激情在线观看| 欧美一区午夜视频在线观看| 亚洲欧洲日本国产| 久久精品五月| 亚洲午夜精品一区二区| 欧美xxx成人| 午夜久久99| 国产精品扒开腿做爽爽爽视频| 亚洲福利小视频| 国产精品亚洲人在线观看| 亚洲精品中文字幕有码专区| 国产午夜精品美女视频明星a级| 一区二区三区视频观看| 在线欧美三区| 久久久久国产成人精品亚洲午夜| 一区二区三区欧美日韩|