《DSP 第4章编程.pdf》由会员分享,可在线阅读,更多相关《DSP 第4章编程.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1西安电子科技大学电子工程学院西安电子科技大学电子工程学院1ADSP技术与应用技术与应用浮点浮点SHARC系列系列主讲:冯小平 教授罗勇江主讲:冯小平 教授罗勇江西安电子科技大学电子工程学院西安电子科技大学电子工程学院2第4章SHARC 系列DSP程序设计第4章SHARC 系列DSP程序设计4.1 概述4.2 汇编语言程序设计4.3 DSP的C程序设计4.4 链接器和链接描述文件4.1 概述4.2 汇编语言程序设计4.3 DSP的C程序设计4.4 链接器和链接描述文件2西安电子科技大学电子工程学院西安电子科技大学电子工程学院34.1 4.1 程序开发概述程序开发概述西安电子科技大学电子工程学院
2、西安电子科技大学电子工程学院4Visual DSP+IDDE的用户界面3西安电子科技大学电子工程学院西安电子科技大学电子工程学院5SHARC DSP开发工具和流程西安电子科技大学电子工程学院西安电子科技大学电子工程学院6IDDE:输出文件4西安电子科技大学电子工程学院西安电子科技大学电子工程学院7IDDE:编辑器西安电子科技大学电子工程学院西安电子科技大学电子工程学院8IDDE:编辑器的特点?编辑器能够完成 自动识别关键字 自动识别注释等 支持标准的编辑操作?查找和替换?剪切和复制?选择等 可以设置不同的颜色区分关键字等 支持OLE拖拉 支持书签5西安电子科技大学电子工程学院西安电子科技大学电
3、子工程学院94.2 4.2 4.2 4.2 汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计西安电子科技大学电子工程学院西安电子科技大学电子工程学院10汇编语言程序特点?代数化语言 容易理解和学习 可读性好?编译器支持伪指令 传统的结构 数据定义具有高级语言特点?预处理器处理宏 C的预处理器类似的工具6西安电子科技大学电子工程学院西安电子科技大学电子工程学院11汇编语言程序结构各 种 伪 指 令(directive)#include const.h#define PI 3.14259DM区 数 据 段.SECTION/DM data1;.VAR xd10=1,2,3,4,5,6
4、,7,8,9,0XA;.ENDSEG;port段,映 射 到 PM区.SECTION/PM portseg;.PORT clk_in;.ENDSEG;代 码 段.SECTION/PM codeseg;指 令 指 令.ENDSEG;西安电子科技大学电子工程学院西安电子科技大学电子工程学院12通过SECTION组织程序.section/dm data1;.var a1;.var b=10;var c15;.var d=1,2,3,4,5;.section/dm program;addtwo:ar=dm(a);.ax1=ar;rts;SECTION 伪指令数据程序代码?SECTION 伪指令定义程序
5、的段?至少需要代码和数据两个段7西安电子科技大学电子工程学院西安电子科技大学电子工程学院134.1.1 标识符和运算符标识符和运算符?标识符(名称)必须以 26个大小写英文字母和下划线_开始;?可以包括09的数字符号;?大小写字母代表不同含义;?编译器使用的保留字是不能用于命名西安电子科技大学电子工程学院西安电子科技大学电子工程学院14编译器的保留关键字FLAG0_INFLAG1_INFLAG2_IN FLAG3_1NFLOATFMERGFOREVERFRFTAFIBFICGEL10L11lL12DMA2SDMADRDMAPARITYCKDMBANK1DMBANK2F4F5F6F7F8F9FA
6、DDRFDEPFEXT FIXDADDRDA11lDA12DBDECDMDM0DM1DM2DM3DMA1EDMA1SDMA2EAVB0B1B10B11B12B13B14B15COSCURLCNTRDAB1DAB2.BNK.ENDSYS.PROCESSOR.SEGMENT.SYSTEMABSACACTADS21020ADSP_21020ANDASHIFTASTAT关键字关键字关键字关键字关键字8西安电子科技大学电子工程学院西安电子科技大学电子工程学院15编译器的保留关键字(续)STEPSTKYSTSSUFSUFRSUISUIRSVSZTCOUNTTFTGLTPERIODTRUETSTUFUIR1
7、lR12R13R14R15R2R3R4R5R6R7R8 SSFRSSI SSIRSTSTACKNOTNUORP20P24P32P40PSA3SPSA4EPSA4SPUSH PXPX1PX2 R0R1R10LEFTZLOAD MR0FMR1BMR1FMR2BMR2FMRBMRFMSMVNE NEWPAGE NOFONOFZ NOPNORMAL113L14L15L2L3L4L5L6L7L8L9LALADDRLCELCNTR LELEFTO关键字关键字关键字关键字关键字西安电子科技大学电子工程学院西安电子科技大学电子工程学院16表达式?汇编表达式与 C类似,如:2.8e-3,l.67,(120-32
8、)3,0 x470 x7F9西安电子科技大学电子工程学院西安电子科技大学电子工程学院17运算符及其含义运算符及其含义运算符运算符含义含义()()*十 一|datbuff*十 一|datbuff括号求补、负号乘、除、求余、加、减按位左移右移按位与按位或按位异或表示求datbuff这个数据缓冲的长度(按字计)括号求补、负号乘、除、求余、加、减按位左移右移按位与按位或按位异或表示求datbuff这个数据缓冲的长度(按字计)西安电子科技大学电子工程学院西安电子科技大学电子工程学院184.1.2 预处理伪指令预处理伪指令SHARC系列的汇编器包括一个能处理某些C语言形式的伪指令和宏的预处理器,这些伪指令
9、包括(必须小写):define undefif endifelse elififdefif definedifndefinclude10西安电子科技大学电子工程学院西安电子科技大学电子工程学院19预处理伪指令例子预处理伪指令例子?文件包含命令#include private_header_file#include?宏用于条件汇编控制#define DEBUG#ifdefDEBUG/如果DEBUG已定义,编译此段#endif?宏替换 符号常数#define N 10.var aN;#define arg(j)dm(i5+j)ar=arg(4);ar=dm(i5+4);也可以在IDDE的defin
10、es对话框中设置西安电子科技大学电子工程学院西安电子科技大学电子工程学院20定义和使用宏(定义和使用宏(Macro)?例1 定义:define mac=mrfmrfR2*R5使用:R2=Rl-R3;R5DM(I0,M0);mac;?宏定义必须在一行内写完,超过一行时,在行末加续行标志“”,例2define copy(src,dest)R0=DM(src);PM(dest)=R0语句copy(0X3f,0XC0),将3f地址的值拷贝到C0地址11西安电子科技大学电子工程学院西安电子科技大学电子工程学院21Include伪指令伪指令?include有两种形式:?include“文件名”在当前和指定
11、途径中搜索指定文件?include 仅在指定途径中搜索指定文件?def21060.h 是很重要的头文件,它包含了对ADSP2106X中大量寄存器、位段、初始化值、I/O地址等惯用名称的定义西安电子科技大学电子工程学院西安电子科技大学电子工程学院224.1.3 汇编伪指令汇编伪指令?汇编伪指令经汇编器处理后不产生代码,它们都以“”打头:SECTION 标记段的起始ENDSEG 标记段的结束VAR 定义变量或缓冲PRECISION=3240 定义浮点精度,32 bit为默认ROUND=ZERO 浮点常数取整方法:向零取近似ROUND_MINUS 浮点常数取整方法:负向取近似ROUND_PLUS 浮
12、点常数取整方法:正向取近似12西安电子科技大学电子工程学院西安电子科技大学电子工程学院23汇编伪指令(续)汇编伪指令(续)ROUND_NEAREST 浮点常数取整方法:取最接近值(默认)PORT 定义存储器映射的I/O口GLOBAL 使一个符号全局化(其它文件可用)EXTERN 使一个符号外部化(由其它文件定义)NEWPAGE 在列表文件中(lst)开启新页西安电子科技大学电子工程学院西安电子科技大学电子工程学院24SECTION伪指令?程序的每一部分都应该有一个有名段(named section)在汇编语言中指明编译器有默认的段名称?汇编程序中必须指明段名.section name 有效范围
13、到下一个段指定?如果需要,编译器会利用“section”命令产生非默认的段?LDF中指定每个段如何放置到存储区中?许多源文件中都可以命名段13西安电子科技大学电子工程学院西安电子科技大学电子工程学院25默认段名?默认段名由默认的LDF支持,编译器使用?默认段名如下:code:programdm data:data1pm data:data2system use:stack,heap,ctor?用户可以定义自己的段名,然后修改LDF文件,使得LDF文件里的段名与用户定义的段名一致西安电子科技大学电子工程学院西安电子科技大学电子工程学院26数据定义?定义数据的伪指令是:.var格式:.var 符号
14、名定义符号保留空间:1 各或者多个字可选:初值表?举例:.var a;.var b=10;.var c37;.var d6=1,-1,5,-5,0 xA,-10;length(d)/expression returning /declared size (6)?可以指定符号的作用域.global 符号名/全局,在本模块定义,外部也可以使用.extern 符号名/外部,在其它模块定义14西安电子科技大学电子工程学院西安电子科技大学电子工程学院27汇编程序举例(汇编程序举例(DMDM数据传输)数据传输)/*_Dtran.ASMADSP-2106x Data transfer_*/#include
15、def21060.h /*IOP register definitions*/#define N 64 .SECTION/DM dm_data;/*Declare variables in DM*/.VAR inputN=sin64.dat;.ENDSEG;.SECTION/PM pm_data;/*Declare variables in PM*/.VAR outputN;.ENDSEG;西安电子科技大学电子工程学院西安电子科技大学电子工程学院28汇编程序举例汇编程序举例(DMDM数据传输)数据传输)-续续.SECTION/PM pm_rsti;/*The interruput vector
16、s*/NOP;JUMP start;/*rest vector*/NOP;NOP;RTI;RTI;RTI;RTI;/*other vector*/.ENDSEG;SECTION/PM pm_code;/*Example program for data transfer*/start:I0=input;M0=1;I8=output;M8=1;LCNTR=N,DO LOOP1 UNTIL LCE;F0=DM(I0,M0);LOOP1:PM(I8,M8)=F0;NOP;IDLE;.ENDSEG;15西安电子科技大学电子工程学院西安电子科技大学电子工程学院294.2 SHARC4.2 SHARC4.
17、2 SHARC4.2 SHARC系列系列系列系列 DSP DSP DSP DSP 的的的的C C C C程序设计程序设计程序设计程序设计西安电子科技大学电子工程学院西安电子科技大学电子工程学院30C和C编程的基本特点?优势:可移植性好,维护方便,缩短开发周期优势:可移植性好,维护方便,缩短开发周期?完全的ANSI 标准 加上 C+特点的注释可扩展性好?完整的特征库完整的特征库完整的标准数学函数支持附加的 DSP函数基本I/O:printf,简化的文件 I/O?DSP扩展功能扩展功能?高效优化器高效优化器?完全集成的开发环境完全集成的开发环境编辑、编译支持实时系统支持源代码级调试16西安电子科技
18、大学电子工程学院西安电子科技大学电子工程学院314.2.1 cc21k编译器的有关概念编译器的有关概念1 编译器的输入输出文件SHARC系列提供了完善的C/C+编译器cc21k,可以对C/C+语言源程序进行预处理、编译、汇编、链接等一系列处理,编译过程中的输入输出文件如表4-3所示。西安电子科技大学电子工程学院西安电子科技大学电子工程学院32表4-3 编译过程中的输入输出文件DSP系统符号映射输出文件.symDSP系统存储器映射输出文件.map目标库文件.dlb目标文件.doj链接描述文件.ldf汇编源文件.s,.asm预处理后的C源文件,由C预处理建立.i交叉处理文件ipa,.opa模板安装
19、文件.ii,.ti编译预处理头文件.pch头文件(由include 伪指令说明).hC+源文件.cpp,.cxxC/C+源文件.c描述文件扩展名17西安电子科技大学电子工程学院西安电子科技大学电子工程学院332编译器支持的数据类型2编译器支持的数据类型数据类型存储长度及意义数据类型存储长度及意义int32位有符号整数unsigned short32位无符号整数unsigned int32位无符号整数poonter32位long32位有符号整数float32位浮点数unsigned long32位无符号整数double32位浮点数char32位有符号整数long double64位浮点数shor
20、t32位有符号整数fract32位定点数西安电子科技大学电子工程学院西安电子科技大学电子工程学院343编译器的C/C+扩展特征3编译器的C/C+扩展特征?编译器支持ANSI标准的C/C+扩展集,这些扩展集提供了对DSP硬件的支持。?扩展的关键字可以使用双下划线_开始,以避免与ANSI C/C+关键字的冲突。?扩展的关键字如表4-5所示。18西安电子科技大学电子工程学院西安电子科技大学电子工程学院35表4-5 扩展的关键字表4-5 扩展的关键字关键字简要说明Inline 函数名使编译器将函数代码集成到程序代码中asm(“汇编指令”)直接将汇编指令嵌入到C/C+程序中dm指定静态或者全局变量、受限
21、指针到数据存储区DMpm指定静态或者全局变量、受限指针到程序存储区PMsection(“字符串”)指定对象或者函数所放置的段(section),代替老版本中的segmentboot,true,false逻辑量restric指定受限的指针特征西安电子科技大学电子工程学院西安电子科技大学电子工程学院36InlineInline 关键字引导cc21k编译器将指定的函数代码集成到程序代码中该命令的应用举例如下:inline int add_one(int*a)(*a)+;一般情况下将上述的inline 定义放置到某个头文件中。19西安电子科技大学电子工程学院西安电子科技大学电子工程学院37行嵌入式汇编
22、语句行嵌入式汇编语句?行嵌入汇编asm()在 C程序中直接写出汇编语句,直接形式为:asm(“汇编指令”);如:asm(“bit set mode2 0 x40”)模板形式为:asm(模板:输出操作数,:输入操作数,:选中寄存器);模板形式给出了调用汇编指令的形式,其操作数分别用0,1,2等表示,依次用后续输出输入操作数取代。如:asm volatile(“%0=dm(SRCTL0);”:“d”(temp);等价于汇编指令:temp=dm(SRCTL0);西安电子科技大学电子工程学院西安电子科技大学电子工程学院38行嵌入式汇编语句说明行嵌入式汇编语句说明?ASM包含几个用冒号隔开的部分?这个例
23、子中有三部分:模板、输入和输出asm(“模板”:“c”(res):”e”(x),”e”(5);输入输出部分按照模板中的顺序,替换n第3部分:表示输入0第1部分:模板是汇编指令字符串如:01*2第二部分:表示输出12字母表示某个寄存器20西安电子科技大学电子工程学院西安电子科技大学电子工程学院39利用利用dm和和pm指定存储位置指定存储位置?dm和和pm命令指定静态或全局变量、指针的存储器的位置,如:命令指定静态或全局变量、指针的存储器的位置,如:int pm abc100;将数组将数组abc定位到程序存储区定位到程序存储区 int dm def100;将数组将数组def定位到数据存储区定位到数
24、据存储区 int ghi100;将数组将数组ghi定位到数据存储区定位到数据存储区 int*dd;使指针使指针dd指向指向DM区的一个整数区的一个整数 int*y();函数函数y 返回一个指向返回一个指向DM区的整数的指针区的整数的指针 extern int foo(int pm*);函数函数foo()的形参是指向的形参是指向PM整数的指针整数的指针西安电子科技大学电子工程学院西安电子科技大学电子工程学院40SECTION 命令?对象或者函数在汇编中间文件中如何放置到指定的段,格式为:Section(“name”)对象;可以用于程序(函数)可以用于静态数据?在LDF中控制段放置的位置 放置到指
25、定的 绝对 地址放置到指定类型的存储器组合相同名称的段注:对早期版本使用的“segment”也支持21西安电子科技大学电子工程学院西安电子科技大学电子工程学院41SECTION 命令举例放置全局数据放置局部和静态数据放置程序代码西安电子科技大学电子工程学院西安电子科技大学电子工程学院424.程序的预处理4.程序的预处理表46 常用的预处理命令命令描述define定义宏或者常数#elifif#endif 对的子分支命令#else在if#endif 对内部的二选一命令#endifif#endif 对的结束命令#ereor报告一个错误信息ifif#endif 对的开始命令22西安电子科技大学电子工程
26、学院西安电子科技大学电子工程学院43常用的预处理命令(续)#ifdef开始ifdef#endif 对,并且测试宏是否已经定义#ifndef开始ifndef#endif 对,并且测试宏是否没有定义#include包含其它文件中的源代码#line输出行号#undef取消已经定义的宏#waring报告告警信息#将宏参数转换成一个字符串#串接两个字符串西安电子科技大学电子工程学院西安电子科技大学电子工程学院445存储器堆及其管理5存储器堆及其管理?cc21k支持标准的存储器堆管理函数 如calloc、free、malloc、realloc等 标准的堆管理函数访问默认的存储器堆?用户程序中还可以使用附加
27、堆,它是ADSP-21XXX系列DSP的内部存储器块?附加堆可以借助上述标准的堆管理函数访问,也可以借助ADI扩展的函数访问。?ADI扩展的函数是heap_calloc、heap_free、heap_malloc和heap_realloc。23西安电子科技大学电子工程学院西安电子科技大学电子工程学院454.3.2 C/C+的实时环境实时环境是一组约定,它保证C/C+程序可靠的在ADSP-21XXX系列DSP上运行。这些约定说明了如何编写被C/C+调用的汇编子程序,包括:存储器指定参数传递堆栈管理等所有链接到C/C+程序中的汇编子程序必须遵守这些约定。西安电子科技大学电子工程学院西安电子科技大学
28、电子工程学院461存储器段及其含义1存储器段及其含义?cc21k需要指定一组存储器段来放置其代码,在汇编语言中,使用.SECTION伪指令来指定,同时在链接描述文件(*.ldf)中使用SECTION 命令指定。?汇编程序和链接描述文件中使用的存储器段的名称和含义如变47所示。24西安电子科技大学电子工程学院西安电子科技大学电子工程学院47表47默认的存储器段名及其含义表47默认的存储器段名及其含义DMPMDMPMPMDMPM条件带实时库时必须有此段实时堆段seg_heap带实时库时必须有此段实时初始化和中断矢量段seg_rth所有情况都必有此段实时堆栈段seg_stack系统作初始化必须此段初
29、始化数据段seg_init带实时库时必有此段PM区数据存储段seg_pmda带实时库时必有此段DM区数据存储段seg_dmda带实时库时必有此段指令代码段seg_pmco条 件含义段 名西安电子科技大学电子工程学院西安电子科技大学电子工程学院481)指令代码段)指令代码段seg_pmco该段用来存放指令代码,位于PM区。编译器将程序汇编后放置到该段,链接器使用链接描述文件将程序代码映射到指定的程序存储空间。25西安电子科技大学电子工程学院西安电子科技大学电子工程学院492)DM数据存储段seg_dmda该段用来存放全局和静态变量的数据区,位于DM区。编译器将全局和静态变量汇编后放置到该段,链接
30、器使用链接描述文件将它们映射到指定的数据存储空间。如:static int data 64;等效于 static int dm data64,将为整型数组data在DM区的seg_dmda段,当数据说明不含PMDM时,默认为DM。西安电子科技大学电子工程学院西安电子科技大学电子工程学院503)PM数据存储段seg_pmda该段用来存放全局和静态变量的数据区,位于PM区。编译器将全局和静态变量汇编后放置到该段,链接器使用链接描述文件将它们映射到指定的存储空间。PM区存储的数据类型只能是静态(static)型,如:static int pm coeff15;将在PM区为整型数的coeff分配15个
31、连续的存储位置,并放在表47所列的seg_pmda或其它由用户定义的PM数据区段内。26西安电子科技大学电子工程学院西安电子科技大学电子工程学院514)初始化数据段seg_init该段用来存放初始化数据,位于PM区。编译器将初始化数据汇编后放置到该段,链接器使用链接描述文件将它们映射到指定的存储空间。西安电子科技大学电子工程学院西安电子科技大学电子工程学院525)实时堆栈段seg_stack该段是编译器的实时堆栈区,位于DM区。链接器使用链接描述文件将它们映射到指定的数据存储空间。典型的堆栈区为4K字(32位),该段必须由用户定义,并且映射到DM区。它用于存储局部变量、保存调用函数的返回地址,
32、此堆栈为 32 位宽度,入栈时地址递减,出栈时地址递增。堆栈用帧指针(frame pointer)寄存器 I6和堆栈指针(stack pointer)寄存器 I7进行管理。堆栈的每个堆栈帧块,用于保存C程序上下文切换时要保留的信息,例如局部、中间变量、入栈参数等,这一堆栈帧的范围即I6、I7寄存器所表示的地址之间。帧指针I6提供了地址基准,加上某偏移量就可以访问堆栈中存储的局部中间变量、入栈参数等。27西安电子科技大学电子工程学院西安电子科技大学电子工程学院536)实时初始化和中断矢量段seg_rth编译器放置系统初始化代码和中断矢量表在此段,位于PM区。链接器使用链接描述文件将它们映射到程序
33、存储空间的中断矢量表。如果用户没有指定实时头文件,编译器将使用默认的头文件。对于编译选择-21060、-21061、_21062、_21065L,默认的头文件是060_hdr.doj,它位于子目录21klib对于编译选择-21160、21161,默认的头文件为160_hdr.doj,它位于子目录211xxlib。如果当前目录中存在一个xxx_hdr.doj的副本,编译器使用副本。开发工具包中提供了上述两个文件的源文件060_hdr.asm和160_hdr.asm。用户可以根据自己的需要去修改它们。西安电子科技大学电子工程学院西安电子科技大学电子工程学院547)实时堆段seg_heap编译器放置
34、实时堆在此段,位于DM区。链接器使用链接描述文件将它们映射到数据存储空间。它用于存储动态数据类型,有4个函数与其有关,负责为动态数据分配释放存储空间,它们是:malloc()calloc()realloc()free()28西安电子科技大学电子工程学院西安电子科技大学电子工程学院552寄存器的使用C编译器默认了许多寄存器作某些特定用途,它们分为:保留寄存器 临时寄存器如果用户要用某些寄存器存储变量,则需要注意避免使用这些寄存器表48是编译器可能使用的寄存器及其有关信息:西安电子科技大学电子工程学院西安电子科技大学电子工程学院56表48 编译器可能使用的寄存器可以修改作为临时变量使用,用完以后必
35、须恢复0I0,I1,I2,I3,I4,I5,I8,I9,I10,I11,I12,I13,I14,I15不可修改堆栈深度I6,I7不可修改堆栈基址B6,B7不可修改-1M7,M15不可修改1M6,M14不可修改0M5,M13修改规则值寄存器29西安电子科技大学电子工程学院西安电子科技大学电子工程学院57表49 用户程序可以保留的寄存器?用户程序中可以使用-reserve编译选项为自己的嵌入式汇编代码或者子程序保留寄存器。?编译器的使用权优先于用户,即发生冲突时优先保证编译器的使用。?建议使用备用寄存器?如果未选择作为保留寄存器,可以修改作为临时变量使用,用完以后必须恢复;?如果选择作为保留寄存器
36、,使用没有限制。用户定义I0,B0,L0,M0,I1,B1,L1,M1,I8,B8,L8,M8,I9,B9,L9,M9,MRB,USTAT1,USTAT2修改规则值寄存器西安电子科技大学电子工程学院西安电子科技大学电子工程学院58编译器使用寄存器举例交叉使用寄存器时会出现什么?那些寄存器可以使用?Subr();主调程序子程序Subr()调用返回保留寄存器:调用前后应该有相同的值临时寄存器:调用前后的值可以不同保留寄存器:如果使用,必须注意保存和恢复原值临时寄存器:可以放心使用注意:专用(DEDICATED)寄存器比保留寄存器的限制更强!30西安电子科技大学电子工程学院西安电子科技大学电子工程学
37、院594.2.3 C/C+4.2.3 C/C+与汇编程序的接口方法与汇编程序的接口方法西安电子科技大学电子工程学院西安电子科技大学电子工程学院60C与汇编接口的注意事项?在下列情况需要注意接口问题:C调用汇编语言子程序 汇编语言中使用了库函数 使用了标准的中断调度程序?需要特别注意的是:C实时堆栈由帧指针(I6)和堆栈指针(I7)管理地址寄存器?最好保留它们,尽管可能并不使用堆栈?堆栈的完整性借助 debugger可以观察 函数参数和返回值处理?编译器是按照约定的规则?寄存器可以分为:保留寄存器和临时寄存器 编译器把某些寄存器指定为特定值或者功能31西安电子科技大学电子工程学院西安电子科技大学
38、电子工程学院61C/C+与汇编程序的接口方法C/C+程序和汇编程序可以互相调用,在C/C+程序中调用汇编程序有3种方式:?把C变量和汇编语言符号联系起来;?编写可用C调用的汇编子程序函数;?利用行嵌入汇编语句。西安电子科技大学电子工程学院西安电子科技大学电子工程学院62联系C变量和汇编语言符号?使C程序和汇编程序使用同一变量,要求:变量在C程序和汇编程序中都说明成全局变量 在汇编中的汇编变量命名为下划线“_”加C的变量名,以便明确其对应关系。如:C函数:int count_start();汇编声明为:.global _count_start;?使用此功能时要注意:全局变量必须在函数定义前声明;
39、选择始终被调用函数安全保存、恢复的寄存器;寄存器用以表示全局变量后,它将不会被其它函数使用。32西安电子科技大学电子工程学院西安电子科技大学电子工程学院63C调用汇编函数时的参数传递?函数参数传递可以通过:寄存器 堆栈?参数传递规则:最多允许3个参数通过寄存器传递,并且左起三个参数依次传递到R4,R8,R12;如果有一个参数传到堆栈,其右边的所有参数都应传到堆栈;字宽大于32位的复数或双精度型将传递到堆栈,且占用两个连续的地址单元:?实部在低地址、虚部在高地址;?或者高32位在低地址、低32位在高地址 函数参数个数可变时,最后一个有名参数进入堆栈。西安电子科技大学电子工程学院西安电子科技大学电
40、子工程学院64汇编函数返回值传递?被调用的汇编函数在返回前必须完成:把返回值存入寄存器R0、R1。?单字时放在R0中;?双精度字时,高32位放在R0,低32位放在R1;?复数时,实部放在R0,虚部放在R1;?返回值是大于二个字的结构型时,R1指向结构地址。被保存并有新值覆盖的编译寄存器必须恢复其旧的保存值:通过以帧指针I6为基准即可从堆栈中恢复这些寄存器。原堆栈指针I7也要恢复,即执行指令I7I6。原帧指针I6必须从堆栈恢复,在入口处,I6值经R2再压入堆栈。33西安电子科技大学电子工程学院西安电子科技大学电子工程学院65C/C+和汇编支持的宏和汇编支持的宏cc21k为了简化C/C+程序与汇编
41、程序接口,提供了多种宏,它们在系统头文件asm_sprt.h 中定义和说明。利用宏可以简化C/C+和汇编程序相互调用子程序的程序代码的编写,汇编函数中一般使用entry,exit,ccall来管理返回地址和实时堆栈。其主要功能模块如表410所示:西安电子科技大学电子工程学院西安电子科技大学电子工程学院66表410 C/C+和汇编支持的宏和汇编支持的宏宏名称意义简述entry针对非末端函数,把旧的I6保存在R2,R2入栈,返回地址入栈,此宏必须是被调函数的第一条指令,目前该宏体为空。exit针对非末端函数,从堆栈中恢复旧的I6值,然后恢复I7,再弹出返回地址,执行跳转指令(迟延),实际上I6、I
42、7的恢复发生在跳转完成之后。此宏必须是被调函数的最后一条指令,目前该宏体为空。leaf_entry针对末端函数,末端函数不会再调用其它函数,因而操作少、效率高。I7和返回地址存于寄存器中,因而不必保存。此宏为空指令,但仍建议放在被调函数开始位置。leaf_exit针对末端函数,也是空指令,仍放在被调函数最后位置。ccall(x)调用C函数,I6存于R2,I7存于R6,返回地址-1存于堆栈,跳转到x位置的函数。reads(x)在I6X位置读堆栈,当用于恢复堆栈中寄存器时,X为负。34西安电子科技大学电子工程学院西安电子科技大学电子工程学院674.3 4.3 4.3 4.3 链接描述文件链接描述文
43、件链接描述文件链接描述文件西安电子科技大学电子工程学院西安电子科技大学电子工程学院68SECTION在链接时的作用35西安电子科技大学电子工程学院西安电子科技大学电子工程学院69链接器概述?链接器使用的段:链接器使用的段:输入段(Input Sections)输出段(Output Sections)存储器段?链接过程是链接过程是 轮流查看各个段西安电子科技大学电子工程学院西安电子科技大学电子工程学院70链接器的输入段(Input Sections)?有名段可以出现在多个文件中通常在输出时连接?为了实现特点的处理,定义一个行有名节,在LDF中指定它的处理方式指定它的绝对地址在多处理器系统中指定一
44、个处理器数据指定到 DM 或者 PM 由默认的LDF处理?段也有类型通常是隐含的PROGBITS重新定位,加载到存储器中NOBITS数据区,定义然而不加载.DEBUG debug信息,不加载到目标中段名由源程序指定compilerassembler段生成每个链接输入文件链接器的输入段通过有名段组织默认段名用户定义的段名36西安电子科技大学电子工程学院西安电子科技大学电子工程学院71链接器的输出段(Output Sections)?输出段的名字并不重要对于各种工具可见debugger 利用它们查找调试信息程序加载时基于段的类型和位置?多个输入段可能会被组合成一个输出段段名由LDF指定链接器输出文
45、件链接器的输出文件通过有名段组织输入西安电子科技大学电子工程学院西安电子科技大学电子工程学院72链接器的存储器段?物理地址借助有名段描述起始地址宽度类型结束地址起始地址宽度类型结束地址起始地址宽度类型结束地址段名由LDF命名和定义定义包括用于存储器定义和安排的物理描述的段名 在LDF中可以使用长度表达式 在LDF之外不可见37西安电子科技大学电子工程学院西安电子科技大学电子工程学院73链接描述文件(LDF)的功能控制链接器的操作?指定一般的配置 目标系统结构 库及其查找路径 需要链接的特殊目标文件?指定每个处理器的物理属性 存储器的物理结构 把它们分配到可以接收程序的逻辑单元 输入段如何映射到
46、输出段和存储器?支持重叠、存储器共享和多处理器西安电子科技大学电子工程学院西安电子科技大学电子工程学院74LDF文件的关键字LDF文件的关键字ABSOLUTEADDRALGORITHMALIGNARCHITECTUREALL_FITBEST_FITBOOTDEFINEDDMELIMINATEELIMINATE_SECTIONSENDFALSEFILLFIRST_FITINCLUDEINPUT_SECTION_ALIGNINPUT_SECTIONSKEEPLENGTHLINK_AGAINSTMAPMEMORYMEMORY_ SIZEOFMPMEMORYNUMBER_OF_OVERLAYSOUTP
47、UTOVERLAY_IDOVERLAY_INPUTOVERLAY_GROUPOVERLAY_OUTPUTPACKING1PLITPLIT_DATA_OVERLAY_IDSPLIT_SYMBOL_ADDRESS38西安电子科技大学电子工程学院西安电子科技大学电子工程学院75LDF文件的关键字(续)LDF文件的关键字(续)PLIT_SYMBOL_OVERLAYIDPMPROCESSORRAMRESOLVESECTIONSHARED_MEMORYSHT_NOBITSSIZESIZEOFSTARTTYPEVERBOSEWIDTHXREF西安电子科技大学电子工程学院西安电子科技大学电子工程学院76如何获
48、得LDF?改写已有的LDF 在VisualDSP+的IDDE环境中查找合适的LDF 利用已有的LDF,根据目标系统需要改写?利用专家链接器(Expert Linker)VisualDSP+V3.0以上支持专家链接器 专家链接器可以自动产生LDF 用户只需按照操作步骤,选取所需属性 VisualDSP+V2.0不支持专家链接器 目前广泛使用的是VisualDSP+V3.0以上的版本39西安电子科技大学电子工程学院西安电子科技大学电子工程学院77链接描述文件举例ARCHITECTURE(ADSP-21062)SEARCH_DIR($ADI_DSP21klib)$OBJECT1=main.doj,$
49、COMMAND_LINE_OBJECTS;MEMORY mem_isrTYPE(PM RAM)START(0 x00008000)END(0 x000080ff)WIDTH(48)mem_pmcoTYPE(PM RAM)START(0 x00008100)END(0 x000087ff)WIDTH(48)mem_pmdaTYPE(PM RAM)START(0 x00009000)END(0 x00009fff)WIDTH(32)mem_dmdaTYPE(DM RAM)START(0 x0000c000)END(0 x0000dfff)WIDTH(32)PROCESSOR p0OUTPUT($C
50、OMMAND_LINE_OUTPUT_FILE)SECTIONSdxe_isr INPUT_SECTIONS($OBJECT1(isr_tbl)mem_isrdxe_pmco INPUT_SECTIONS($OBJECT1(seg_pmco)mem_pmcodxe_pmda INPUT_SECTIONS(main.doj(seg_pmda)mem_pmdadxe_dmda INPUT_SECTIONS(main.doj(seg_dmda)mem_dmda/*End sections command for processor po*/*End processor command处理器类型搜索路