《DSPC语言编程基础.pptx》由会员分享,可在线阅读,更多相关《DSPC语言编程基础.pptx(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 为为了了提提高高程程序序开开发发的的效效率率,同同时时使使程程序序能能与与高高级级语语言言接接轨轨,目目前前所所有有生生产产DSP芯芯片片的的公公司司都都提提供供了了C语语言言编编译译器器。这这样样,除除了了对对于于一一些些运运算算量量较较大大或或对对运运算算时时间间要要求求很很严严格格的的程程序序代代码码外外,一一般般性性的的代代码码都都可可采采用用C语语言言编编程程,从从而而缩缩短短程程序序的的开开发发周周期期。C编编译译器器还还同同时时提提供供了了汇汇编编语语言言接接口口,可可使使汇汇编编模块方便地被模块方便地被C语言调用。语言调用。第1页/共53页(1)C编译器编译器(2)C代码优化
2、代码优化(3)C代码链接代码链接(4)C语言语言(5)C运行环境和库函数运行环境和库函数 以以上上5部部分分不不再再关关注注C语语言言本本身身的的语语法法,而而是是关关注注如如何何在在CCS集集成成环环境境中中对对拥拥护护已已经经编编写写好好的的C代代码码有有效效地地进进行行编编译译、汇汇编编和和链链接接,以以生生成成可可执执行行代码这样的工程问题。代码这样的工程问题。第2页/共53页8.1 C编译器和C优化代码8.1.1 C编译器特性 C编编译译器器的的主主要要功功能能是是将将用用户户编编写写的的C语语言言代代码码翻翻译译为为汇汇编编语语言言程程序序。(1)支持)支持ANSI标准标准C。(2
3、)支持)支持ANSI标准实时运行库。标准实时运行库。(3)汇编程序输出。)汇编程序输出。(4)生成)生成COFF目标文件。目标文件。(5)编译器的)编译器的Shell程序。程序。(6)灵活的汇编语言接口。)灵活的汇编语言接口。(7)完整的预处理程序。)完整的预处理程序。(8)最优化。)最优化。(9)初始化数据到)初始化数据到ROM存储器中。存储器中。(10)原程序交互列表功能。)原程序交互列表功能。(11)库构造工具。)库构造工具。第3页/共53页 CCS开开发发环环境境可可以以看看成成是是一一个个大大的的软软件件包包,里里面面包包含含了了源源代代码码编编辑辑器器,以以及及工工程程文文件件组组
4、织织、编编译译和和调调试试等等一一切切功功能能模模块块。该该软软件件包包里里,shell程程序序可可以以完完成成3个个功功能能:编编译译、汇汇编编和和链链接接。shell程程序序缺缺省省在在C盘盘安安装装时时,被被安安装装在在C:tic2400cgtool子子目目录录下下,对对应应的的文件名为文件名为dspcl.exe。(1)编编辑辑器器:包包括括分分析析器器、优优化化器器、代代码码产产生生器器。把把C语语言言程程序序编编译成汇编语言程序。译成汇编语言程序。(2)汇汇编编器器:把把汇汇编编语语言言源源代代码码或或C语语言言已已经经编编译译成成汇汇编编语语言言代代码码进行汇编,以产生进行汇编,以
5、产生COFF目标文件。目标文件。(3)链接器:将文件链接,产生可执行的目标文件。)链接器:将文件链接,产生可执行的目标文件。8.1.2 Shell程序第4页/共53页8.1.3 C代码优化 C编编译译器器中中含含有有一一个个C优优化化程程序序。启启用用C优优化化程程序序可可以以提提高高程程序序执执行行速速度度,减减少少C程程序序代代码码长长度度。对对于于C语语言言,可可以以采采用用简简化化循循环环,使使用用软软件件流流水水线线,重新安排、语句和表达式以及将变量分配到寄存器等方法实施优化。重新安排、语句和表达式以及将变量分配到寄存器等方法实施优化。在在CCS中中,选选择择菜菜单单Project/
6、Build Options选选项项,可可以以直直接接在在弹弹出出的的对话框中对优先级别进行设置。对话框中对优先级别进行设置。第5页/共53页8.2 C程序代码链接 C编译器和汇编语言工具为用户链接程序提供了以下两种方法。编译器和汇编语言工具为用户链接程序提供了以下两种方法。(1)先编译各个模块,最后将他们链接在一起。)先编译各个模块,最后将他们链接在一起。(2)一次执行)一次执行Shell程序的程序的dspcl命令,直接完成各个模块的编译、汇编和链接。命令,直接完成各个模块的编译、汇编和链接。在在CCS集集成成环环境境下下,还还有有少少量量设设置置CCS环环境境和和工工程程文文件件组组织织工工
7、作作需需要要人人工干预。为链接工干预。为链接C程序,需要程序,需要DSP开发人员做以下工作:开发人员做以下工作:(1)把运行支持库包含到工程文件中;)把运行支持库包含到工程文件中;(2)指定程序运行时的初始化类型;)指定程序运行时的初始化类型;(3)确确定定如如何何将将由由C语语言言程程序序编编译译、汇汇编编和和链链接接产产生生出出的的可可执执行行代代码码分分配配到到物物理存储器中。理存储器中。第6页/共53页8.2.1 把运行支持库包含到工程文件中 所所有有C程程序序都都必必须须与与运运行行支支持持库库链链接接。因因为为运运行行支支持持库库包包含含了了标标准准C函函数,如数,如sin()函数
8、,以及编译器用来创建和管理函数,以及编译器用来创建和管理CCS中中C语言运行环境的函数。语言运行环境的函数。运运行行支支持持库库中中包包含含了了一一个个boot.obj目目标标模模块块,C程程序序链链接接时时必必须须与与它它链链接接。当当C程程序序开开始始运运行行时时,首首先先执执行行boot.obj。链链接接时时,链链接接器器会会自自动动提提取取boot.obj并链接它。并链接它。第7页/共53页boot.obj包包含含了了用用于于初初始始化化运运行行环环境境的的代代码码和和数数据据。该该模模块块执执行行以以下下任任务:务:(1)建立堆栈;)建立堆栈;(2)处理运行时,初始化表和自动初始化全
9、局变量;)处理运行时,初始化表和自动初始化全局变量;(3)调用)调用C语言主程序语言主程序main();(4)当)当C语言主程序语言主程序main()结束时,调用结束时,调用exit()。boot.obj中中有有一一个个重重要要的的汇汇编编语语言言函函数数_c_int0。它它是是boot.obj中中的的起起点点。链链接接时时,_c_int0被被自自动动定定义义为为程程序序的的入入口口点点。如如果果程程序序从从复复位位开开始始运运行行,则应将复位向量转移到则应将复位向量转移到_c_int0,以便,以便DSP首先执行首先执行_c_int0。第8页/共53页8.2.2 指定初始化类型 用用C语语言言
10、编编程程时时,会会根根据据需需要要定定义义全全局局变变量量和和静静态态变变量量。有有些些全全局局变变量量和和静静态态变变量量具具有有初初始始值值,有有些些全全局局变变量量和和静静态态变变量量没没有有初初始始值值。C编编译译器器对对C程程序序编编译译后后,为为具具有有初初始始值值的的全全局局变变量量和和静静态态变变量量建建立立了了一一个个专专门门的的数数据据块块.cinit。该该块块在在程程序序运运行行后后调调入入到到RAM的的.bss中中。.cinit调调入入到到RAM中中有有两种方法:两种方法:(1)在运行时,自动初始化全局变量和静态变量;)在运行时,自动初始化全局变量和静态变量;(2)在加
11、载时,自动初始化全局变量和静态变量。)在加载时,自动初始化全局变量和静态变量。当创建新工程时,第一种是缺省状态。当创建新工程时,第一种是缺省状态。第9页/共53页8.2.3 把块分配到物理存储器中 把块分配到物理存储器中就是把程序和数据分配到物理存储器中。把块分配到物理存储器中就是把程序和数据分配到物理存储器中。当当使使用用C编编译译器器对对C程程序序编编译译后后,可可产产生生数数据据块块和和代代码码块块。这这些些块块根根据据各各种种不不同同的的应应用用系系统统硬硬件件配配置置和和扩扩展展情情况况,可可以以使使用用不不用用的的方方法法将将这这些些块块分分配到物理存储器中。配到物理存储器中。第1
12、0页/共53页8.3 创建C语言软件8.3.1 创建C语言寄存器头文件 与汇编语言相同,与汇编语言相同,C语言编程也需要相应的头文件。语言编程也需要相应的头文件。2407控控制制寄寄存存器器数数量量较较多多,为为了了方方便便编编程程,可可以以将将这这些些寄寄存存器器地地址址定定义义在在一一个个头头文文件件(*.h)中中。这这样样,在在编编程程时时只只要要将将该该文文件件包包含含其其中中,直直接接引引用寄存器在用寄存器在*.h中定义的英文缩写名,而不必记它的地址。中定义的英文缩写名,而不必记它的地址。在该头文件中,寄存器是以指针方式进行寻址。在该头文件中,寄存器是以指针方式进行寻址。第11页/共
13、53页8.3.2 创建main()函数 在在C语语言言应应用用软软件件中中,用用户户必必须须定定义义一一个个main()函函数数作作为为自自己己应应用用程程序序的的开开始始。因因为为系系统统完完成成C语语言言环环境境设设置置后后,boot.obj会会自自动动调调用用main()函函数数作作为为程程序序的的开开始始。因因此此,程程序序员员在在程程序序中中编编写写main()函函数数是是一一种种预预定定,也也是一种强制。是一种强制。第12页/共53页void main(void)sys_ini();for(;)delay();/*xf管脚置低*/asm(clrc xf);delay();/*xf管
14、脚置高*/asm(setc xf);第13页/共53页8.3.3 创建2407芯片初始化函数 初始化内容包括:初始化内容包括:(1)2407芯片初始化;芯片初始化;(2)工程应用中所甬道的片内外设初始化;)工程应用中所甬道的片内外设初始化;(3)片内外存储器初始化;)片内外存储器初始化;(4)应用系统硬件接口初始化。)应用系统硬件接口初始化。第14页/共53页#include exp4_2407.hvoid sys_ini()/系统初始化子程序/*关总中断*/asm(setc INTM);/*抑制符号位扩展*/asm(clrc SXM);/*累加器中结果正常溢出*/asm(clrc OVM);
15、/*禁止看门狗*/*WDCR=0 x00E8;/*CLKIN=10M,CLKOUT=40M*/*SCSR1=0 x0000;第15页/共53页8.3.4 创建假中断处理函数(1)2407工作时,如果意外引发了内核级中断,但是却没有低层外设中断工作时,如果意外引发了内核级中断,但是却没有低层外设中断向量装入外设中断寄存器中时,假中断向量向量装入外设中断寄存器中时,假中断向量0000h装入装入PIVR;(2)CPU执行一个软件中断指令执行一个软件中断指令INTR时,使用了参数时,使用了参数16,企图用软件中,企图用软件中断去服务于外设中断断去服务于外设中断INT1INT6。这显然是一个错误,这时,
16、假中断向量装。这显然是一个错误,这时,假中断向量装入入PIVR;(3)中断请求线发生故障,外设发出中断请求,而其)中断请求线发生故障,外设发出中断请求,而其INTn标志却在标志却在CPU应应答请求之前被软件清答请求之前被软件清0,此时,外设中断的请求可能还没有被中断控制器确,此时,外设中断的请求可能还没有被中断控制器确认,中断控制器也不知道哪个外设中断向量应装认,中断控制器也不知道哪个外设中断向量应装PIVR,这时,假中断向量装这时,假中断向量装入入PIVR.第16页/共53页interrupt void nothing()/假中断子程序 return;第17页/共53页8.3.5 _c_in
17、t0函数 在运行在运行C程序之前,用户必须首先建立起程序之前,用户必须首先建立起C语言运行环境。语言运行环境。建建立立C语语言言运运行行环环境境的的函函数数在在库库rts2xx.lib中中。把把_c_int0函函数数作作为为硬硬件件复位后的中断矢量入口来运行复位后的中断矢量入口来运行_c_int0函数。函数。rsvect B _c_int0 这这样样,当当系系统统复复位位后后,通通过过执执行行一一条条无无条条件件转转移移指指令令来来调调用用_c_int0函函数,以建立数,以建立C语言运行环境。语言运行环境。_c_int0函数初始化函数初始化C环境时执行了如下任务:环境时执行了如下任务:(1)为
18、系统堆栈定义一个名为)为系统堆栈定义一个名为.stack的块,并建立初始化堆栈和帧指针;的块,并建立初始化堆栈和帧指针;(2)将将.cinit块块的的初初始始化化数数据据表表中中的的数数据据复复制制到到.bss块块,对对全全局局变变量量和和静静态态变量进行初始化;变量进行初始化;(3)调用)调用main函数,开始运行函数,开始运行C程序。程序。第18页/共53页8.4 TMS320C240 x C语言8.4.1 数据类型 TMS320 x 的的C语言数据类型具有如下特征:语言数据类型具有如下特征:(1)所有的整形类型,包括)所有的整形类型,包括char、short和和int及其它们对应的无符号
19、类型,及其它们对应的无符号类型,是是16位二进制数,相互间是等价的。位二进制数,相互间是等价的。(2)长整型和无符号长整型类型是)长整型和无符号长整型类型是32位二进制数。位二进制数。(3)带符号类型以)带符号类型以2进制补码表示。进制补码表示。(4)char类型等同于类型等同于int类型,为带符号类型。类型,为带符号类型。(5)enum类型的对象以类型的对象以16位值表示,在表达式中位值表示,在表达式中enum类型和类型和int类型等同。类型等同。(6)所有浮点类型()所有浮点类型(float、double和和long double)是等价的类型,都以)是等价的类型,都以32位浮点格式表示。
20、位浮点格式表示。(7)长整型和浮点数保存在存储器中,低位数值保存在低地址。)长整型和浮点数保存在存储器中,低位数值保存在低地址。第19页/共53页8.4.2 C语言标准库函数的使用 TI公公司司的的C编编译译器器提提供供了了C语语言言标标准准库库函函数数。它它与与boot.asm等等一一起起封封装装在在rts2xx.lib中。中。在在使使用用标标准准库库函函数数时时,首首先先要要声声明明这这一一函函数数。TI公公司司的的所所有有标标准准库库函函数数以以分分类类的的形形式式在在不不同同的的头头文文件件中中声声明明,全全部部声声明明库库函函数数的的头头文文件件为为assert.h、limits.h
21、、stddef.h、ctype.h、math.h、stdlib.h、setjmp.h、string.h、stdarg.h、time.h、和、和ioports.h。为为了了使使用用一一个个库库函函数数,用用户户必必须须首首先先使使用用#include来来包包含含声声明明函函数数的的头文件。头文件。第20页/共53页8.5 TMS320C24x C语言程序开发 TMS320C24x C语语言言具具有有特特定定的的运运行行环环境境,为为了了确确保保C语语言言程程序序正正确确运行,运行,C语言程序开发必须维护这个环境。语言程序开发必须维护这个环境。第21页/共53页8.5.1 存储器模式 TMS320
22、C24x 的的C编编译译器器将将存存储储器器分分为为程程序序存存储储器器和和数数据据存存储储器器。程程序序存存储储器器包包含含可可执执行行代代码码,数数据据存存储储器器包包含含外外部部变变量量、静静态态变变量量和和系系统堆栈。统堆栈。由由C程序生成的每一块代码或数据存放于存储空间的一个连续块中。程序生成的每一块代码或数据存放于存储空间的一个连续块中。存存储储器器映映射射及及代代码码和和数数据据存存储储空空间间的的分分配配由由链链接接器器决决定定。编编译译器器不不考考虑虑可可用用存存储储空空间间类类型型,也也不不考考虑虑存存储储空空间间是是否否可可以以被被代代码码和和数数据据使使用用或或者者存存
23、储储空空间间是是否否保保留留以以用用于于I/O或或控控制制。编编译译器器只只生生成成可可重重新新分分配配的的代代码码,链接器完成将代码和数据分配到合适的存储空间。链接器完成将代码和数据分配到合适的存储空间。第22页/共53页 C汇汇编编器器对对C语语言言程程序序编编译译生生成成7个个可可以以进进行行重重定定位位的的代代码码和和数数据据块块:.text、.cinit、.const、.switch、.bss、.stack、.sysmem。1、C编译器生成的块编译器生成的块(1).text块包含所有可执行代码和浮点常量。块包含所有可执行代码和浮点常量。(2).text块包含初始化变量和常量的表。块包
24、含初始化变量和常量的表。(3).const块块包包含含字字符符串串变变量量、明明显显初初始始化化的的全全局局和和静静态态变变量量的的定定义义和和初初始始化。化。(4).switch块包含块包含switch语句表。语句表。(5).bss块为全局和静态变量保留空间。块为全局和静态变量保留空间。(6).stack块为块为C系统堆栈。系统堆栈。(7).sysmem块为动态存储器分配保留空间。块为动态存储器分配保留空间。第23页/共53页 .text、.cinit和和.switch块块通通常常被被链链接接到到ROM或或RAM,必必须须处处于于程程序序存存储储器器中中;.const块块可可以以被被链链接接
25、到到ROM或或RAM,但但必必须须处处于于数数据据存存储储器器中中;.bss、.stack和和.sysmem块块必必须须被被链链接接到到RAM,并并必必须须处处于于数数据据存存储器中。储器中。这这些些块块根根据据不不同同的的系系统统配配置置以以不不同同的的方方式式被被放放到到存存储储器器中中。链链接接器器将将不不同同模模块块相相同同的的块块组组合合为为输输出出块块。完完整整的的程程序序由由这这些些输输出出块块组组成成,包括汇编器的包括汇编器的.data块。块。第24页/共53页2、C系统堆栈系统堆栈 C编译器使用软件堆栈实现以下功能:编译器使用软件堆栈实现以下功能:(1)分配局部变量)分配局部
26、变量(2)给函数传递参数)给函数传递参数(3)保存处理器状态)保存处理器状态(4)保存函数返回值)保存函数返回值(5)保存临时变量)保存临时变量(6)保存寄存器)保存寄存器 堆堆栈栈运运行行时时从从低低地地址址向向高高地地址址增增加加。编编译译器器使使用用2个个辅辅助助寄寄存存器器管管理理堆栈:堆栈:(1)AR1为堆栈指针(为堆栈指针(SP)。指向当前堆栈顶部。)。指向当前堆栈顶部。(2)AR0为为帧帧指指针针(FP)。指指向向当当前前帧帧的的起起始始处处。每每个个函函数数调调用用会会在在堆堆栈顶创建一个新的帧,用于保存局部和临时变量。栈顶创建一个新的帧,用于保存局部和临时变量。第25页/共5
27、3页 局局部部帧帧是是堆堆栈栈的的一一个个区区域域,用用于于存存储储函函数数传传递递的的变变量量和和局局部部变变量量,每每一一个个函函数数调调用用时时都都要要在在堆堆栈栈顶顶部部创创建建一一个个新新的的局局部部帧帧。在在调调用用C函函数数时时,C环环境境会会自自动动管管理理这这些些寄寄存存器器,堆堆栈栈的的大大小小由由链链接接器器确确定定。全全局局符符号号_STACK_SIZE的值等于堆栈长度(缺省值为的值等于堆栈长度(缺省值为1KB)。)。第26页/共53页3、动态存储空间的分配、动态存储空间的分配 编编译译器器运运行行支支持持库库提提供供了了几几个个函函数数,可可以以在在运运行行时时为为变
28、变量量动动态态地地分分配配存储空间,如存储空间,如malloc、calloc、realloc等。等。动动态态分分配配是是由由标标准准运运行行支支持持函函数数提提供供的的。动动态态存存储储空空间间来来自自定定义义在在.sysmem块块中中的的全全局局池池(pool)或或堆堆(heap)。.sysmem块块的的大大小小可可在在 链链 接接 时时 由由 heap选选 项项 设设 定定。同同 样样,链链 接接 器器 也也 可可 创创 建建 一一 个个 名名 为为_SYSMEM_SIZE的的全全局局符符号号,并并将将.sysmem块块的的大大小小符符给给该该符符号号。对对动动态态分分配配的的目目标标一一
29、般般通通过过指指针针对对其其进进行行访访问问,并并且且他他们们的的存存储储区区被被分分配配在在一一个独立的段中。个独立的段中。第27页/共53页4、静态和全局变量的存储器分配、静态和全局变量的存储器分配 在在C程程序序中中说说明明的的每每一一个个外外部部或或静静态态变变量量都都是是被被分分配配给给一一个个唯唯一一的的连连续续空空间间的的,空空间间的的地地址址由由链链接接器器确确定定,编编译译器器保保证证这这些些变变量量的的空空间间分分配配多多个字,以便每个变量按字边界对准。个字,以便每个变量按字边界对准。5、结构的对准、结构的对准 编编译译器器为为结结构构分分配配空空间间时时,它它将将分分配配
30、足足够够的的字字以以包包含含所所有有的的结结构构成成员员。在一组结构中,每个结构开始于字边界。在一组结构中,每个结构开始于字边界。6、域的对准、域的对准 非非域域类类型型对对准准于于字字的的边边界界。对对域域分分配配足足够够多多的的位位,相相邻邻域域组组装装进进一一个个字字的的相相邻邻位位,但但不不跨跨越越两两个个字字。如如果果一一个个域域要要跨跨越越两两个个字字,则则整整个个域域将将分分配到下一个字中。配到下一个字中。第28页/共53页8.5.2 存储器规则 TMS320C2xx编编译译器器严严格格规规定定:在在C语语言言环环境境中中,特特殊殊的的寄寄存存器器和和特特殊殊的的操操作作联联系系
31、在在一一起起。如如果果要要将将汇汇编编语语言言与与C程程序序接接口口,必必须须遵遵循循对对这这些些寄存器的规定。寄存器的规定。寄存器规则定义编译器如何使用寄存器和在函数调用时如何保存值。寄存器规则定义编译器如何使用寄存器和在函数调用时如何保存值。第29页/共53页寄存器寄存器使用使用调用是否保存调用是否保存AR0帧指针帧指针是是AR1堆栈指针堆栈指针是是AR2局部变量指针局部变量指针否否AR2AR5表达式分析表达式分析否否AR6AR7寄存器变量寄存器变量是是Accumulator表达式分析表达式分析/返回值返回值否否P表达式分析表达式分析否否T表达式分析表达式分析否否 上上表表列列出出了了编编
32、译译器器如如何何使使用用寄寄存存器器,并并说说明明了了在在函函数数调调用用时时寄寄存存器器在保存值时所起的具体作用。在保存值时所起的具体作用。第30页/共53页域域名称名称预设值预设值修改修改ARP辅助寄存器指针辅助寄存器指针1是是C进位位进位位-是是DP数据页指针数据页指针-是是OV溢出位溢出位-是是OVM溢出模式溢出模式-是是PM乘积移位模式乘积移位模式0否否SXM符号扩展模式符号扩展模式-是是TC测试控制位测试控制位-是是 上上表表列列出出了了编编译译器器所所使使用用的的所所有有状状态态位位。预预设设值值是是编编译译器器在在函函数数进进入和返回时的期望值,修改栏是编译器产生的代码是否修改
33、该域。入和返回时的期望值,修改栏是编译器产生的代码是否修改该域。第31页/共53页2、堆栈指针、帧指针和局部变量指针、堆栈指针、帧指针和局部变量指针 编编译译器器创创建建和和使使用用自自己己的的软软件件堆堆栈栈以以用用于于保保存存函函数数返返回回地地址址、分分配配局局部部变变量量和和给给函函数数传传递递参参数数。当当函函数数需需要要存存储储局局部部变变量量时时,可可以以在在堆堆栈栈中中创创建建自自己己的的工工作作空空间间(局局部部帧帧)。局局部部帧帧在在函函数数入入口口时时分分配配,在在函函数数返返回回时时释放。释放。系系统统提提供供堆堆栈栈指指针针(SP)、帧帧指指针针(FP)和和局局部部变
34、变量量指指针针(LVP)3个寄存器来管理堆栈和局部帧。个寄存器来管理堆栈和局部帧。寄寄存存器器AR1用用做做堆堆栈栈指指针针。堆堆栈栈从从低低地地址址向向高高地地址址增增长长,SP指指向向堆堆栈栈中中下下一一个个可可用用的的字字。寄寄存存器器AR0用用做做帧帧指指针针。FP指指向向当当前前函函数数局局部部帧帧的的起起始始地地址址。PF直直接接指指向向局局部部帧帧的的第第一一个个字字,该该字字用用做做临临时时存存储储单单元元,可可以以用用于于实实现现寄寄存存器器到到寄寄存存器器值值的的传传递递,同同时时在在创创建建可可重重入入C函函数数时时也也必必须须使使用用该该存存储储单单元元。寄寄存存器器A
35、R2用用做做局局部部变变量量指指针针,所所有有存存储储在在局局部部帧帧的的对象包括参数都要通过对象包括参数都要通过LVP间接引用。间接引用。第32页/共53页3、寄存器变量、寄存器变量 寄寄存存器器变变量量是是指指存存储储于于寄寄存存器器而而不不是是RAM的的局局部部变变量量或或编编译译器器临临时时变变量。量。(1)不使用优化器)不使用优化器 不不使使用用优优化化器器时时,编编译译器器至至多多为为使使用用register关关键键字字的的两两个个变变量量分分配配寄寄存存器器。变变量量必必须须在在参参数数列列表表中中或或函函数数的的第第一一块块中中定定义义。编编译译器器采采用用AR6和和AR7作寄
36、存器变量寄存器。作寄存器变量寄存器。AR6保存第一个变量,保存第一个变量,AR7保存第二个变量。保存第二个变量。(2)使用优化器)使用优化器 使使用用优优化化器器时时,所所有有寄寄存存器器变变量量定定义义将将被被忽忽略略,由由优优化化器器决决定定寄寄存存器器分分配配。优优化化器器直直接接将将变变量量而而不不是是地地址址分分配配给给寄寄存存器器。优优化化器器可可以以将将AR5、AR6和和AR7用用作作寄寄存存器器变变量量。AR5在在函函数数调调用用时时不不保保存存,所所以以它它在在使使用用时时可可以以跨跨越多个函数使用。越多个函数使用。第33页/共53页4、表达式寄存器、表达式寄存器 编编译译器
37、器使使用用没没有有用用做做寄寄存存器器变变量量的的寄寄存存器器来来计计算算表表达达式式值值和和存存储储临临时时结结果果。在在函函数数调调用用时时不不保保留留表表达达式式寄寄存存器器内内容容。在在函函数数调调用用时时,用用做做临临时时存存储储的寄存器保存到局部帧,被调函数不用保存和恢复表达式寄存器。的寄存器保存到局部帧,被调函数不用保存和恢复表达式寄存器。5、返回值、返回值 如如果果函函数数返返回回值值为为标标量量类类型型(integer、pointer或或float),则则返返回回值值保保存在累加器中。当返回值为存在累加器中。当返回值为16位类型变量时,返回值在累加器中符号扩展。位类型变量时,
38、返回值在累加器中符号扩展。第34页/共53页8.5.3 函数结构和调用规则 1、函数如何进行调用、函数如何进行调用 主调函数在调用另一个函数时完成以下工作(主调函数在调用另一个函数时完成以下工作(ARP必须为必须为AR1):):(1)主调函数以逆顺序将参数压入堆栈(最右边的参数最先压入,最左边的)主调函数以逆顺序将参数压入堆栈(最右边的参数最先压入,最左边的参数最后压入)。函数调用时最左边的放在堆栈顶部。参数最后压入)。函数调用时最左边的放在堆栈顶部。(2)主调函数调用被调函数。)主调函数调用被调函数。(3)主调函数假定在函数返回时)主调函数假定在函数返回时ARP会被设定为会被设定为AR1。(
39、4)当被调函数结束,主调函数用以下命令将参数弹出堆栈。)当被调函数结束,主调函数用以下命令将参数弹出堆栈。SBRK n第35页/共53页2、被调函数响应(函数入口时、被调函数响应(函数入口时ARP应该设为应该设为AR1,AR1用作用作SP)(1)从硬件堆栈中弹出返回地址,并将其压入软件堆栈;)从硬件堆栈中弹出返回地址,并将其压入软件堆栈;(2)将帧指针)将帧指针FP压入软件堆栈;压入软件堆栈;(3)分配局部帧;)分配局部帧;(4)如果被调函数修改)如果被调函数修改AR6或或AR7,将其压入堆栈。其他被修改的寄存器可,将其压入堆栈。其他被修改的寄存器可以不保存;以不保存;(5)执行函数代码;)执
40、行函数代码;(6)如果函数返回标量值,将返回值放入累加器。如果返回值为)如果函数返回标量值,将返回值放入累加器。如果返回值为16位整型和位整型和指针,在用累加器保存返回值时进行正确的符号扩展;指针,在用累加器保存返回值时进行正确的符号扩展;(7)将)将ARP改为改为AR1;(8)如果保存了)如果保存了AR6或或AR7,则恢复,则恢复AR6或或AR7;(9)释放局部帧;)释放局部帧;(10)恢复)恢复FP;(11)将返回地址从软件堆栈中弹出并压入硬件堆栈;)将返回地址从软件堆栈中弹出并压入硬件堆栈;(12)返回。)返回。第36页/共53页;假定ARP=AR1POPD *+;将返回地址从硬件堆栈弹
41、出,压入软件堆栈SAR AR0,*+;将AR0(FP)压入堆栈SAR AR1,*;*SP=SPLAR AR0,#SIZE;FP=帧大小LAR AR0,*0+;FP=SP,SP+=SIZE分配局部帧空间SAR AR6,*+;AR6压栈SAR AR7,*+;AR7压栈;函数代码MAR *,AR1;设置ARP=SPMAR *-;指针指向AR7LAR AR7,*-;弹出AR7LAR AR6,*-;弹出AR6SBRK SIZE+1;释放局部帧LAR AR0,*-;弹出局部帧指针FPPSHD *;将返回地址从软件堆栈弹出,压入硬件堆栈RET;返回第37页/共53页8.5.4 中断处理 遵循中断原则就是在不
42、影响遵循中断原则就是在不影响C环境的情况下实现中断处理并返回环境的情况下实现中断处理并返回C代码。代码。c_int0为C程序入口点,它同时也是引导函数,用来完成C环境初始化。在初始化工作中,没有对中断进行任何处理,中断的全部控制寄存器和状态位处于缺省状态。在缺省状态下,中断没有使能。如果系统中要使用中断,用户必须作相应处理,使中断使能。这些操作很容易用asm语句实现,或调用汇编函数来实现,对C环境没有影响。调用中断程序时,首先应调用运行时支持库中的子程序I$SAVE。这个子程序保存了所有的寄存器。同样,在中断程序返回时,应调用调用运行支持库中的子程序I$RET,用于恢复被保存的寄存器。以上过程
43、都是自动的,不需要用户编程时干预。第38页/共53页 interrupt是C编译器中的中断关键字,用来声明中断函数。格式如下:interrupt void nothing()/哑中断子程序 return;第39页/共53页8.6 C语言和汇编语言混合编程 用用C语言和汇编语言的混合编程方法主要有以下四种:语言和汇编语言的混合编程方法主要有以下四种:(1)独立编写)独立编写C程序和汇编程序,分开编译或汇编形成各自的目标代码模块,程序和汇编程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将然后用链接器将C程序和汇编程序链接起来。程序和汇编程序链接起来。(2)直接在)直接在C语言程序的相应位
44、置嵌入汇编程序。语言程序的相应位置嵌入汇编程序。(3)在)在C语言程序中使用汇编程序的变量。语言程序中使用汇编程序的变量。(4)对)对C程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。修改。第40页/共53页8.6.1 独立的C和汇编程序模块接口(1)不论是用)不论是用C编写的函数还是汇编编写的函数,都必须遵守寄存器使用规则。编写的函数还是汇编编写的函数,都必须遵守寄存器使用规则。(2)必须保护)必须保护C函数要用到的几个特定寄存器。函数要用到的几个特定寄存器。(3)如果要改变状态寄存器的任何位,必须确保恢复出它们的
45、值。)如果要改变状态寄存器的任何位,必须确保恢复出它们的值。(4)中断程序必须保护所有用到的寄存器。)中断程序必须保护所有用到的寄存器。(5)从汇编程序调用)从汇编程序调用C函数时,以逆序方式将参数压入堆栈,调用之后,将参函数时,以逆序方式将参数压入堆栈,调用之后,将参数弹出。数弹出。(6)调用)调用C函数时,注意函数时,注意C函数只保护了几个特定的专用寄存器,其他寄存器函数只保护了几个特定的专用寄存器,其他寄存器C函数可以自由使用。函数可以自由使用。(7)长整型和俘点数在存储器中存放的顺序是低位字在低地址,高位字在高)长整型和俘点数在存储器中存放的顺序是低位字在低地址,高位字在高地址。地址。
46、(8)如果函数有返回值,返回值存放在累加器)如果函数有返回值,返回值存放在累加器ACC中。中。(9)汇编模块不能改变由)汇编模块不能改变由C产生的产生的.cinit块。块。(10)编译器在所有的标识符(函数名、变量名等)前加一下划线)编译器在所有的标识符(函数名、变量名等)前加一下划线“_”。因。因此,编写汇编语言程序时,必须在此,编写汇编语言程序时,必须在C程序可以访问的所有对象前加程序可以访问的所有对象前加“_”。(11)任何在汇编中定义的对象或函数,如果需要在)任何在汇编中定义的对象或函数,如果需要在C中访问或调用,则必须中访问或调用,则必须用汇编指令用汇编指令.global定义。同样,
47、如果在定义。同样,如果在C中定义的对象或函数,需要在汇编中中定义的对象或函数,需要在汇编中访问或调用,在汇编中也必须用访问或调用,在汇编中也必须用.global定义。定义。第41页/共53页(1)C主程序:主程序:/*cmian.c*/extern int asmfunc();定义外部的汇编函数;定义外部的汇编函数int gvar;定义全局变量;定义全局变量main()int i;i=asmfunc(i);调用函数;调用函数(2)汇编语言函数)汇编语言函数_asmfunc:/*asmsub.c*/.global _asmfunc.global _gvar.text_asmfunc:POPD *
48、+;将返回地址保存至;将返回地址保存至C堆栈堆栈SAR AR0,*+;保护;保护FPSAR AR1,*;保护;保护SPLAR AR0,#1;帧长度;帧长度LAR AR-,*0+,AR2;建立;建立FP和和SP第42页/共53页LDP#_gvar;指向;指向_gvarSETC SXMLACC _gvarLAR AR2,#_3;参数偏移;参数偏移MAR *0+;指向参数;指向参数ADD *,AR0;将参数加至;将参数加至gvarSACL _gvarMAR *,AR1SBRK 2LAR AR0,*-;恢复帧指针;恢复帧指针PSHD *;返回地址压入;返回地址压入C24x堆栈堆栈RET.end第43页
49、/共53页8.6.2 在C语言中直接嵌入语句 是是一一种种直直接接的的C和和汇汇编编接接口口方方法法。可可以以在在C程程序序中中实实现现用用C语语言言无无法法实实现的一些硬件控制功能。现的一些硬件控制功能。asm(“汇编语句汇编语句 ”)注意以下几点:注意以下几点:(1)防止嵌入的)防止嵌入的asm语句破坏语句破坏C环境。环境。(2)在)在C代码中插入跳转或标号可能会影响代码产生器的寄存器跟踪算法,产代码中插入跳转或标号可能会影响代码产生器的寄存器跟踪算法,产生不可预测的结果。生不可预测的结果。(3)插入影响编译环境的伪指令也可能会造成麻烦。)插入影响编译环境的伪指令也可能会造成麻烦。(4)不
50、要改变)不要改变C变量值,但可以读取变量值。变量值,但可以读取变量值。如如上上,在在程程序序中中直直接接嵌嵌入入汇汇编编语语句句的的典典型型应应用用是是控控制制芯芯片片的的一一些些硬硬件件资资源。源。第44页/共53页#include exp4_2407.hvoid sys_ini()/系统初始化子程序1000 8AA0 POPD *+1001 80A0 SAR AR0,*+1002 8180 SAR AR1,*1003 B001 LAR AR0,#1h1004 00E0 LAR AR0,*0+/*关总中断*/asm(setc INTM);1005 BE41 SETC INTM/*抑制符号位扩