应用系统设计举例.ppt

上传人:牧羊曲112 文档编号:5723678 上传时间:2023-08-14 格式:PPT 页数:62 大小:1.06MB
返回 下载 相关 举报
应用系统设计举例.ppt_第1页
第1页 / 共62页
应用系统设计举例.ppt_第2页
第2页 / 共62页
应用系统设计举例.ppt_第3页
第3页 / 共62页
应用系统设计举例.ppt_第4页
第4页 / 共62页
应用系统设计举例.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《应用系统设计举例.ppt》由会员分享,可在线阅读,更多相关《应用系统设计举例.ppt(62页珍藏版)》请在三一办公上搜索。

1、第8章 应用系统设计举例,DSP应用中几个典型的案例:正弦信号发生器 FIR数字滤波器的设计和实现方法 快速傅里叶变换 语音信号采集和回放的实现方法,第8章:应用系统设计举例,8.1 DSP应用系统设计基本步骤,第8章:应用系统设计举例设计基本步骤,典型的DSP目标板结构框图,第8章:应用系统设计举例设计基本步骤,一个DSP应用系统设计包括硬件设计和软件设计两部分。硬件设计又称为目标板设计,考虑算法需求分析和成本、体积、功耗核算等。软件设计是指设计包括信号处理算法的程序,用DSP汇编语言或通用的高级语言(C/C+)编写出来并进行调试。这些程序要放在DSP片内或片外存储器中运行,在程序执行时,D

2、SP会执行与DSP外围设备传递数据或互相控制的指令。DSP的软件与硬件设计调试是密不可分的。,第8章:应用系统设计举例设计基本步骤,8.1 DSP应用系统设计基本步骤,第8章:应用系统设计举例 正弦信号发生器,8.2 正弦信号发生器用DSP实现正弦信号发生器的基本方法有三种:(1)查表法。即将某个频率的正弦/余弦值计算出来后制成一个表,DSP工作时仅作查表运算即可。这种方法适用于信号精度要求不是很高的情况。当对于信号的精度要求较高时,其信号采样点的个数增多,占用的存储器空间也将增大。(2)泰勒级数展开法。与查表法相比,需要的存储单元少,但是泰勒级数展开一般只能取有限次项,精度无法得到保证。(3

3、)迭代法。利用数字振荡器通过迭代方法产生正弦信号。,第8章:应用系统设计举例 正弦信号发生器,8.2.1 数字振荡器原理设单位冲击序列经过一系统后,其输出为正弦序列 则系统的传递函数为其中,其振荡频率由系数A、B和C来决定。因此,设计振荡器主要就在于确定这些系数。,第8章:应用系统设计举例 正弦信号发生器,设初始值为0,数字振荡器的二阶差分方程形式为:利用单位冲击函数性质,即仅当k=1时,xk1=1,得:当k2,yk能用yk1和yk2算出,递归的差分方程。,第8章:应用系统设计举例 正弦信号发生器,8.2.2 正弦波信号发生器的设计要求:设计产生频率为 的正弦波;采用定时中断的方法输出yn;设

4、采样率为(即通过定时器中断,每隔25s产生一个yn)。,第8章:应用系统设计举例 正弦信号发生器,递归的差分方程系数为:,将所有系数除以2,用16位定点,第8章:应用系统设计举例 正弦信号发生器,定时器的初值计算要求:定时器产生25s时间间隔,获得40kHz的采样频率。定时器的初值计算由下式决定式中 为DSP时钟频率,为采样频率。设预分频系数TDDR=0,则定时器周期寄存器初值PRD为本例中,则PRD=2499。,第8章:应用系统设计举例 正弦信号发生器,8.2.3 正弦波信号发生器的实现初始化:初始化y1和y2、初始化定时器、初始化中断1.初始化y1和y2SSBXFRCT;置FRCT=1,准

5、备进行小数乘法运算ST#INIT_A,AA;将常数A装入变量AAST#INIT_B,BB;将常数B装入变量BBST#INIT_C,CC;将常数C装入变量CCPSHD CC;将变量CC压入堆栈POPD y1;初始化y1=CCLD AA,T;装AA到T寄存器MPY y1,A;y1乘系数A,结果放入A寄存器STH A,y2;y2=AA*y1,第8章:应用系统设计举例 正弦信号发生器,2.初始化定时器程序STM#10h,TCR;停止定时器STM#2499,PRD;设置PRD寄存器值为2499,TINT中断频率为40KHzSTM#20h,TCR;重新装入TIM和PSC,启动定时器,第8章:应用系统设计举

6、例 正弦信号发生器,3.中断初始化 包括设置中断总开关和中断屏蔽寄存器,修改中断向量表的入口地址。中断初始化程序代码片断:LD#0,DP;设置DP页指针SSBX INTM;关闭所有中断 LD#vector,A;读出中断向量(地址vector在中断 向量表程序中定义)AND#0FF80h,A OR PMST,A;保留PMST的低7位STLM A,PMST;设置PMST(其中包括IPTR)RSBX INTM;开所有中断,第8章:应用系统设计举例 正弦信号发生器,中断服务程序 利用前面的y1和y2,计算出新的yn。_tint:LD BB,T;将系数B 装入T寄存器MPY y1,A;y1乘系数B,结果

7、放入A寄存器LTD y2;将y2装入T寄存器,同时复制到y1MAC AA,A;完成新正弦数据的计算,a寄存器中为;y2*AA+y1*BBSTH A,l,y1;将新数据存入y1,因所有系数都除过2,所以;在保存结果时转移一位,恢复数据正常大小STH A,y0;将新正弦数据存入y0NOPRETE,第8章:应用系统设计举例 正弦信号发生器,要获得完整的程序,必须有中断向量表文件和内存定位文件。中断向量表清单如下:.mmregs.ref _ret.ref _c_int00.ref _tint.global vector.sect.int_table;-;interrupte vector table!

8、;-vector:rs b _c_int00 nop tint b _tint,第8章:应用系统设计举例 正弦信号发生器,内存定位文件清单如下:MEMORY PAGE 0:VEC:origin=1000h,length=0ffh PROG:origin=1100h,length=8000h PAGE 1:DATA:origin=080h,length=0807fhSECTIONS.text PROG PAGE 0.cinit PROG PAGE 0.switch PROG PAGE 0.int_table VEC PAGE 0.data DATA PAGE 1.bss DATA PAGE 1.

9、const DATA PAGE 1.sysmem DATA PAGE 1.stack DATA PAGE 1,第8章:应用系统设计举例 正弦信号发生器,4.观察输出信号波形以及频谱启动CCS,新建工程文件,sinewave.pjt。加入:汇编源程序sin.asm,包括初始化代码和中断服务程序;汇编源程序vec_table.asm,为中断向量表。连接定位sinewave.cmd文件(2)完成编译、连接,生成.out文件,并装载.out文件到片内存储器。(3)选择“ViewGraphTime/Frequency”,打开图形显示设置窗口。在弹出的对话框中按图8.3设置,主要修改“Star Addre

10、ss”为y0(y0为生成的正弦波输出变量);“Acquisition Buffer Size”为1,“DSP Data Type”为“16-bit signed integer”。,第8章:应用系统设计举例 正弦信号发生器,第8章:应用系统设计举例 FIR数字滤波器,8.3 FIR数字滤波器8.3.1 FIR滤波器的基本原理和结构差分方程:结构图:,算法实际上是一种乘法累加运算。它不断地从输入端读入样本值xn,经延时()后做乘法累加,输出滤波结果yn。,第8章:应用系统设计举例 FIR数字滤波器,8.3.2 FIR滤波器的设计方法 FIR滤波器的设计方法主要有窗函数法和频率采样法。窗函数法是最

11、基本的方法,窗的类型有:矩形窗 Hanning窗 Blackman窗 Kaiser窗 DSP设计者可以利用功能强大的MATLAB工具很方便的设计出逼近理想特性的FIR滤波器。得到阶数N和系数bi.然后将FIR系数放入DSP程序中。,第8章:应用系统设计举例 FIR数字滤波器,8.3.3 FIR滤波器的DSP实现 FIR滤波器的输出表达式为 不断地对输入样本进行n1延时后,再进行乘法累加。C54x通过两种方法实现FIR滤波器的延迟线:1.线性缓冲区法 2.循环缓冲区法 3.系数对称FIR滤波器的实现方法,第8章:应用系统设计举例 FIR数字滤波器,1.线性缓冲区法(又称延迟线法)实现N阶FIR滤

12、波器,需要在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本。DSP每计算一个输出值,都需要读取N个样本并进行N次乘法和累加;每当读取一个样本后,将此样本向后移动,如xn-7,读完最后一个样本后,最老的样本被推出缓冲区,输入最新样本xn+1存入缓冲区的顶部。优点:存储器中新老数据位置直观明了。缺点:线性缓冲区只能定位在DARAM中。,第8章:应用系统设计举例 FIR数字滤波器,N=8的线性缓冲区:顶部为低地址单元,存放最新样本,底部为高地址单元,存放最老样本;AR1被用作间接寻址的数据缓冲区的辅助寄存器,指向最老样本单元。AR2被用作间接寻址的系数区的辅助寄存器。,第8章

13、:应用系统设计举例 FIR数字滤波器,实现 的运算 可通过执行存储器延时指令DELAY来实现:DELAY Smem;(Smen)(Smem+1)将延时指令与其它指令结合使用,可在同样的机器周期内完成这些操作。例如:LTD LD+DELAY MACDMAC+DELAY注意:用线性缓冲区实现运算时,缓冲区的数据需要移动,这样在一个机器周期内需要一次读和一次写操作。因此,线性缓冲区只能定位在DARAM中。,第8章:应用系统设计举例 FIR数字滤波器,线性缓冲区法实现FIR滤波器的汇编语言程序设计.titleFIR1.ASM.mmregs.defstartX.usectx,7;自定义数据空间PA0.s

14、et0PA1.set1.dataCOEF:.word1*32768/10;定义b6.word2*32768/10;定义b5.word-4*32768/10;定义b4.word3*32768/10;定义b3.word-4*32768/10;定义b2.word2*32768/10;定义b1.word1*32768/10;定义b0.text,第8章:应用系统设计举例 FIR数字滤波器,start:SSBXFRCT;设置小数乘法STM#x+7,AR1;AR1指向缓冲区底部x(n-6)STM#7,AR0;AR0=7,设置AR1复位值PORTR PA1,x;输入x(n)FIR1:RPTZA,#7;累加器A

15、清0,设置迭代次数 MACD*AR1-,COEF,A;完成乘法-累加,数据移位STHA,*AR1;暂存y(n)PORTW*AR1,PA0;输出y(n)BDFIR1 PORTR PA1,*AR1+0;输入最新样本,并修改;AR1=AR1+AR0;指向缓冲区底部.end,第8章:应用系统设计举例 FIR数字滤波器,2.循环缓冲区法(重点)用线性缓冲区法的限制:实现运算时,缓冲区的所有数据需要移动,只能定位在DARAM中。循环缓冲区法:每当输入新的样本时,以新样本改写滑窗中最老的数据,而滑窗的其他数据不需要移动。优点:不用移动数据,不需要在一个机器周期中要求进行一次读和一次写的数据存储器,因此,可将

16、循环缓冲区定位在数据存储器的任何位置,而不像线性缓冲区要求定位在DARAM中那样。缺点:在循环缓冲区新老数据不很直接明了。,第8章:应用系统设计举例 FIR数字滤波器,指针ARx指向最新样本单元。顶部为低地址单元,底部为高地址单元;,第1次运算,求yn 的过程如下:(1)以ARx为指针,按xn,xn-7 的顺序取数,每取一次数后,完成一次乘法累加运算;(2)当经过8次取数、运算之后,得到 yn;(3)求得 yn后,ARx指向最老样本 单元;(4)从I/O口输入新样本xn+1,替代最老样本xn-7,为下次计算做好准备,如 图8.8(b)所示。第2次运算按xn+1,xn,xn-6 的顺序取数,求得

17、yn+1后,ARx指向xn-6,输入的新样本xn+2 将替代xn-6 样本,如图8.8(c)所示。,第8章:应用系统设计举例 FIR数字滤波器,第8章:应用系统设计举例 FIR数字滤波器,实现循环缓冲区间接寻址的关键:循环寻址方式第一,BK(循环缓冲区长度)满足:BK=N 在实现N阶FIR时,设定BK的值为FIR的阶数,就能保证循环缓冲区的指针ARx始终指向循环缓冲区,实现循环缓冲区顶部和底部的相邻。第二,必须满足2kN,其中k是循环缓冲区的基地址ARx的k个最低有效位,必须为0。如N=31时,由于25=3231,k=5,该地址的最低5位为0,所以循环缓冲区必须从二进制地址xxxx xxx0

18、0000B开始,第8章:应用系统设计举例 FIR数字滤波器,利用循环缓冲区和双操作数寻址方法实现的FIR滤波器,第8章:应用系统设计举例 FIR数字滤波器,.titleFIR2.ASM.mmregs.defstart.bssy,1X.usectx,7;定义数据存储器空间b0.usectb0,7PA0.set0PA1.set1.dataCOEF:.word1*32768/10;定义b6.word2*32768/10;定义b5.text,第8章:应用系统设计举例 FIR数字滤波器,start:SSBXFRCT;设置小数乘法STM#b0,AR1;AR1指向b0RPT#6 MVPD COEF,*AR1

19、+;完成数据搬移STM#x+6,AR2;AR2指向缓冲区底部xn-6 STM#b0+6,AR3;AR3指向系数缓冲区底部b6STM#7,BK;BK=7 STM#-1,AR0PORTR PA1,x;输入xn,第8章:应用系统设计举例 FIR数字滤波器,FIR2:RPTZA,#6;累加器A清0,迭代7次 MAC*AR2+0%,*AR3+0%,A;完成乘法-累加,循环STH A,y;暂存ynPORTW y,PA0;输出ynBDFIR2 PORTR PA1,*AR2+0%;循环输入最新样本并修改;AR2=AR2+AR0;指向xn-5.end,第8章:应用系统设计举例 FIR数字滤波器,3.系数对称FI

20、R滤波器的实现方法 长度为N 的线性相位FIR滤波器的输出表达式为:,优点:乘法的次数减少了一半。,第8章:应用系统设计举例 FIR数字滤波器,实现方法:使用专门用于系数对称FIR滤波器的指令。FIRS Xmem,Ymem,Pmad该指令的操作如下:执行:PmadPAR 当(RC)0(循环计数器)(Xmem)(Ymem)16A(B)(A(3216)PARB(PAR1)PAR(RC)1RC说明:FIRS指令在同一机器周期内,通过C和D总线读两次数据存储器,同时通过P总线读程序存储区的一个系数。,第8章:应用系统设计举例 FIR数字滤波器,注意两点:(1)在数据存储器中开辟两个循环缓冲区,如New

21、和Old缓冲区,分别存放N/2个新数据和老数据,循环缓冲区的长度为N/2。再设置相应的循环缓冲区指针,如用AR2指向New缓冲区中最新的数据,AR3指向Old缓冲区中最老的数据;(2)将系数表存放在程序缓冲区内。,第8章:应用系统设计举例 FIR数字滤波器,.mmregs.def start.bssy,1x_new:.usectDATA1,4x_old:.usectDATA2,4size.set4PA0.set0PA1.set1.dataCOEF.word1*32768/10,2*32768/10.word3*32768/10,4*32768/10.text,第8章:应用系统设计举例 FIR数

22、字滤波器,start:SSBXFRCTSTM#x_new,AR2;AR2指向新缓冲区第一个单元STM#x_old+(size-1),AR3;AR3指向老缓冲区最后1个单元STM#size,BK;循环缓冲区长度STM#-1,AR0PORTR PA1,x_new;输入xnFIR:ADD*AR20%,*AR30%,A;AH=xn+xn-7(第一次)RPTZB,#(size-1);B=0,下条指令执行size次FIRS*AR2+0%,*AR30%,COEF;B+=AH*a0,AH=xn-1+xn-6,STHB,y;保存结果,第8章:应用系统设计举例 FIR数字滤波器,PORTW y,PA0;输出结果M

23、AR*+AR2(2)%;修正AR2,指向新缓冲区最老数据MAR*AR3+%;修正AR3,指向老缓冲区最老数据MVDD*AR2,*AR3+0%;新缓冲区向老缓冲区传送一个数BDFIRPORTR PA1,*AR2;输入新数据至新缓冲区.end,第8章:应用系统设计举例 FIR数字滤波器,8.3.3 FIR滤波器应用举例设计指标:设计一个FIR低通滤波器 通带边界频率为1500Hz,通带波纹小于1dB,阻带边界频率为2000Hz,阻带衰减大于40dB,采样频率为8000Hz。设计步骤(4步):(1)设计FIR滤波器利用MATLAB工具箱Signal中的fir1函数,选择Hamming窗。b=fir1

24、(16,1500/8000*2);FIR数字滤波器系数为b0 b16,系数对称。将上述系数存盘,建立一个数据文件(如fir01.txt)。,第8章:应用系统设计举例 FIR数字滤波器,(2)建立DSP汇编程序的FIR滤波器系数文件。上述系数必须转换成Q15格式,并放置在DSP汇编程序的.inc文件中,进行FIR滤波器的汇编程序的汇编、链接时,inc文件将被自动地加入到工程中去。从MATLAB中产生的fir01.txt文件,通过执行转换命令,将自动变换为firdata.inc滤波器系数文件。利用MATLAB中的转换命令:!firdat fir01.txt 将产生firdata.inc文件。,第8

25、章:应用系统设计举例 FIR数字滤波器,(3)产生滤波器输入信号的文件 一个产生输入信号的C语言程序。这个信号是频率为1000Hz和2500Hz的正弦波合成的波形,文件名为firinput.c。该程序将产生名为firin.inc的输入信号程序。(4)编写应用FIR数字滤波器的汇编程序 一个FIR滤波器源程序 fir.asm 对应以上FIR滤波器的汇编程序的链接文件fir.cmd。,第8章:应用系统设计举例 快速傅里叶变换(FFT),8.4 快速傅里叶变换(FFT)FFT:是一种高效实现离散傅氏变换的算法。FFT:一个非常重要的工具经常使用,甚至成为DSP运 算能力的一个考核因素。主要内容:1

26、基2按时间抽取FFT算法 2 FFT算法的DSP实现 3 FFT算法的模拟信号产生和输入,第8章:应用系统设计举例 快速傅里叶变换(FFT),8.4.1 基2按时间抽取FFT算法,8点基2 FFT流图与蝶形运算,第8章:应用系统设计举例 快速傅里叶变换(FFT),第8章:应用系统设计举例 快速傅里叶变换(FFT),8.4.2 FFT算法的DSP实现 一般假定输入序列是复数。当输入是实数时,利用对称性质计算DFT。原始的2N个点的实输入序列组合成一个N点的复序列;之后对复序列进行N点的FFT运算;最后再由N点的复数输出拆散成2N点的复数序列。这2N点的复数序列与原始的2N点的实数输入序列的DFT

27、输出一致。使用这种方法,在组合输入和拆散输出的操作中,FFT运算量减半。下面用这种方法来实现一个256点实数FFT(2N=256)运算。,第8章:应用系统设计举例 快速傅里叶变换(FFT),1.实数FFT运算序列的存储分配 程序代码安排在0 x3000开始的存储器中,其中0 x30000 x3080存放中断向量表;FFT程序使用的正弦表、余弦表数据(.data段)安排在0 xc00开始的地方;变量(.bss段定义)存放在0 x80开始的地址中。256点实数FFT程序的输入数据缓冲为0 x23000 x23ff;图8.1 FFT变换后功率谱的计算结果存放在0 x22000 x22ff中。连接定位

28、.cmd文件确定。,第8章:应用系统设计举例 快速傅里叶变换(FFT),2.基2实数FFT运算的算法(四步)1)输入数据的组合和位倒序组合:首先,原始输入的2N=256个点的实数序列an,当成N=128点的复数序列dn,dn表示复合FFT的输入。dn=rn+j in rn a2n表示实部;in a2n1表示虚部。位倒序:按位倒序的方式存储dn到数据处理缓冲中,是为了在整个运算最后的输出中得到的序列是自然顺序。使用位倒序寻址方式可以大大提高程序执行的速度和使用存储器的效率。图8.12,第8章:应用系统设计举例 快速傅里叶变换(FFT),2)N点复数FFT运算,旋转因子分为正弦和余弦部分,用Q15

29、格式将它们存储在两个分离的表中。每个表中有128项,对应从0180。把128点的复数FFT分为七级来算,第一级是计算2点的FFT蝶形结,第二级是计算4点的FFT蝶形结,然后是8点、16点、128点的蝶形结计算。最后所得的结果表示为,第8章:应用系统设计举例 快速傅里叶变换(FFT),3)分离复数FFT的输出为奇部分和偶部分分离FFT输出为相关的四个序列:偶实数RPk、奇实数RMk、偶虚数IPk和奇虚数IMk,以便第四步形成最终结果。RPk=RPN-k=0.5*(Rk+RN-k)RMk=-RMN-k=0.5*(Rk-RN-k)IPk=IPN-k=0.5*(Ik+IN-k)IMk=-IMN-k=0

30、.5*(Ik-IN-k)RP0=R0 IP0=I0 RM0=IM0=RMN/2=IMN/2=0 RPN/2=RN/2 IPN/2=IN/2 图8.14,第8章:应用系统设计举例 快速傅里叶变换(FFT),4)产生最后的N=256点的复数FFT结果 通过下面的公式由RPk、RMn、IPn和IMn四个序列可以计算出an的DFT。Ak=A2N-k=ARk+j AIk=Fa(n)即是an的DFT结果 实数FFT输出按照实数/虚数的自然顺序填满整个4N=512个字节的数据处理缓冲器。如图8.15所示。计算所求信号的功率由于最后所得的FFT数据是一个复数,通常对所得的FFT数据进行处理取其实部和虚部的平方

31、和即求得该信号的功率。,第8章:应用系统设计举例 快速傅里叶变换(FFT),8.4.3 FFT算法的模拟信号产生和输入 在CCS集成开发环境下利用Simulator进行FFT的调试并观察运行结果时,需要输入一个模拟信号,该信号有两种方法产生:第一种方法:是用C语言程序产生FFTdata.inc文件,然后,在DSP汇编语言程序中通过.copy汇编命令将数据文件FFTdata.inc复制到汇编程序中去。第二种方法:先建立与信号对应的数据流文件FFTdata.dat,然后,输入数据通过CCS开发环境下的FileI/O功能完成待处理的数据的输入。,第8章:应用系统设计举例 快速傅里叶变换(FFT),8

32、.4.4 观察信号时域波形及其频谱,第8章:应用系统设计举例语音信号采集,8.5 语音信号采集8.5.1 语音接口芯片TLC320AD50C简介 TLC320AD50C是TI公司生产的音频接口芯片,集成了16位A/D和D/A转换器,可工作在主、从两种方式,由上电时M/S管脚的电平决定。在与DSP的McBSP连接时,一般TLC320AD50C配置为主方式,而McBSP为从方式。支持主通信和辅助通信两种通信模式,主通信用于正常的ADC或DAC的数据传输,辅助通信用于控制寄存器的读写。辅助通信模式可由硬件和软件两种方式触发。工作方式通过对其内部7个控制寄存器的设置来进行控制。其中寄存器0是无操作寄存

33、器。寄存器5和6保留用于工厂测试,故只有4个寄存器可用。表8-1表8-4,第8章:应用系统设计举例语音信号采集,8.5.2 TLC320AD50C与DSP的连接在实际应用中,一般将TLC320AD50C接至DSP的同步串行口,并将TLC320AD50C设置在主动工作方式,即由TLC320AD50C提供帧同步信号和移位时钟。,第8章:应用系统设计举例语音信号采集,8.5.3 语音采集和回放程序 实现初始化DSP后,打开McBSP串口;初始化AD50C,然后使串口在AD50C 的控制下接受数据。主函数用C语言编写(参考8.6节),其中InitC5402(void)是初始化DSP,OpenMcBSP

34、(void)是初始化串口和初始化AD50C,READAD50(void)用来读取数据。,第8章:应用系统设计举例C语言编程及应用,8.6 C语言编程及应用8.6.1 C语言编程的基本方法 通常DSP应用程序需要用C语言和汇编语言的混合编程方法来实现。以达到最佳的利用DSP芯片软、硬件资源的目的。用C语言和汇编语言混合编程方法主要有以下3种:(1)独立编写C程序和汇编程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将C模块和汇编模块链接起来。(2)直接在C程序的相应位置嵌入汇编语句。(3)对C程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。,第8章:应用系统设计举例C语

35、言编程及应用,8.6.2 独立的C模块和汇编模块接口 在编写汇编程序和C程序时必须遵循有关的调用规则和寄存器规则。如果遵循了这些规则,那么C程序既可以调用汇编程序,也可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C函数或访问C程序中定义的变量。在编写独立的汇编程序时,必须注意以下几点:(1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。包括AR1、AR6、AR7和SP。(3)中断程序必须保护所有用到的寄存器。,第8章:应用系统设计举例C语言编程及应用,在编写独立的汇编程序时,必须注意以下几点(续)(4)从汇编程序调

36、用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。(5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他寄存器C函数是可以自由使用的。(6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。(7)如果函数有返回值,则返回值存放在累加器A中。(8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。,第8章:应用系统设计举例C语言编程及应用,在编写独立的汇编程序时,必须注意以下几点(续)(9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。(10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。同样,如果在C程序中定义的对象或函数需要在汇编程序中访问或调用,在汇编程序中也必须用.global指令定义。(11)编译模式CPL指示采用何种指针寻址,如果CPL=1,则采用堆栈指针SP寻址;如果CPL=0,则选择页指针DP进行寻址。,第8章:应用系统设计举例C语言编程及应用,8.6.3 C语言编程应用 用C语言编程只需将rtb.Lib添加到工程中,CCS5000会自动完成相关操作。以下程序为FFT算法的实现,利用INT2获得输入信号,数组x是来自A/D采样的数据,长度128,为32位浮点数,数组mo是FFT输出。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号