版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章DSP软件开发与C语言编程 4.1 DSP开发工具与软件开发流程开发工具与软件开发流程1. DSP开发工具开发工具硬件硬件TI XDS510 (Extended Development System)硬件仿真器。硬件仿真器。DSK(DSP Starter Kit)初学者开发套件。初学者开发套件。瑞泰瑞泰 ICETEK-5100PP/USB DSP开发系统。开发系统。评估板。评估板。DSP教学实验系统教学实验系统 。 开发工具包括硬件、软件两部分。硬件部分主要是仿真器开发工具包括硬件、软件两部分。硬件部分主要是仿真器(Emulator),软件主要是集成开发环境软件主要是集成开发环境CCS
2、(Code Composer Studio)。 DSP开发系统开发系统(仿真器仿真器)有有PCI插卡式、并口式、插卡式、并口式、USB接口式,接口式,目前多用目前多用USB接口式,即接口式,即DSP开发系统通过开发系统通过USB接口与接口与PC机相连,机相连,开发系统通过开发系统通过JTAG(基于扫描的仿真)接口与用户目标板相连,(基于扫描的仿真)接口与用户目标板相连,实现实现DSP软硬件调试与程序烧写。软硬件调试与程序烧写。 2 DSP评估板评估板(也称为也称为EVM板、目标板、板、目标板、 DEMO板、实验板板、实验板等等),包括基本的,包括基本的DSP芯片及必要的电源、时钟、复位电路外,
3、芯片及必要的电源、时钟、复位电路外,还经常包括用于程序调试的片外扩展存储器、扩展的还经常包括用于程序调试的片外扩展存储器、扩展的A/D、D/A转换器、键盘显示电路、转换器、键盘显示电路、EEPROM、RS232串行接口、串行接口、SPI接口、接口、CAN接口驱动电路、简单应用电路等。接口驱动电路、简单应用电路等。 32407DSP 评估板原理框图评估板原理框图42407 EVM板的主要性能指标如下:板的主要性能指标如下:1) TMS320LF2407A,运行速度,运行速度40MIPS。2) 片内。片内。3) 扩展扩展RAM 64KW。4) 片内片内16路路10位位A/D转换器,采样时间转换器,
4、采样时间375ns。5) 扩展的扩展的4路路12位位D/A转换器转换器DAC7617。6) UART串行接口,符合串行接口,符合RS-232C标准。标准。7) 16路路PWM输出。输出。8) CAN总线接口。总线接口。9) 用户开关与指示灯。用户开关与指示灯。10) 片内片内32KW Flash存储器。存储器。11) JTAG接口,用于仿真调试与接口,用于仿真调试与Flash程序烧写。程序烧写。12) +5V电源输入电源输入, 板上电源管理。板上电源管理。562. 软件开发流程软件开发流程软件开发流程框图软件开发流程框图 7 软件开发流程软件开发流程 1)编辑:生成源程序()编辑:生成源程序(
5、*.asm, *.c)、头文件)、头文件(*.h)与命令文件与命令文件(* d)。2)编译与汇编:生成目标文件)编译与汇编:生成目标文件(*.obj ,公共目标文件,公共目标文件COFF格格式式)及列表文件及列表文件(*.lst)。3)连接:生成可执行代码文件)连接:生成可执行代码文件(*.out)及映射文件及映射文件(*.map)。4)调试:通过)调试:通过JTAG接口下载到目标系统接口下载到目标系统EVM。5) 通过通过JTAG接口将程序固化烧写到接口将程序固化烧写到Flash 存储器存储器 。8 软件开发工具主要有软件开发工具主要有 源程序编辑器源程序编辑器(Editor) 编译器编译器
6、(Compiler) 汇编器汇编器(Assembler) 链接器链接器(Linker) 归档器归档器(Archiver) 运行时支持库运行时支持库(Run-Time-Support Library) 库建立程序库建立程序(Library-build Utility) HEX转换程序转换程序(Hex Conversion Utility)3. 软件工具软件工具9 绝对列表器绝对列表器(Absolute Lister)和交叉引用列表器和交叉引用列表器(Cross-Reference Lister) 调试工具调试工具(Debugging tools) C+名称复原程序名称复原程序(C+ Name D
7、emangling Utility) GEL语言语言 (General Extension Language,通用扩展语言,通用扩展语言) DSP/BIOS等。等。101. CCS软件安装与设置软件安装与设置CCS2.0 C202X 讲义讲义驱动程序设置。驱动程序设置。Simulator: PC模拟软件仿真。模拟软件仿真。Emulator: 实时实时DSP硬件仿真。硬件仿真。 4.2 集成开发环境集成开发环境CCS11CCS运行主窗口运行主窗口 12CCS主要工具主要工具 源程序编辑器源程序编辑器(Editor)。 C编译器(编译器(C Compiler)。)。汇编器(汇编器(Assemble
8、r)。)。 连接器(连接器(Linker)。)。 调试工具调试工具(Debug)。 十六进制转换公用程序十六进制转换公用程序(Hex Conversion Utility)。132. CCS主要菜单与功能主要菜单与功能 典型的典型的CCS运行界面如图所示。运行界面如图所示。CCS的功能可以通过菜单或工的功能可以通过菜单或工具条按钮实现。主要的菜单项有具条按钮实现。主要的菜单项有File、Edit、View、Project、Debug等。这些菜单的使用与常用的集成开发软件等。这些菜单的使用与常用的集成开发软件Visual C+等使用方法等使用方法基本一样。基本一样。 14典型典型CCS运行界面运
9、行界面15Code Composer Studio ComponentsRobust, Easy-to-Use Development Environment16 Allows you to halt in non-critical code for debug while time-critical interrupts continue to be serviced. Access memory and registers without stopping the processor. Implemented in silicon, not by a debug monitor: Easy
10、-to-use, no application resources requiredInterrupt void ISR_1() Main() function() Halt and single step non-time critical codeTime-critical interrupts are still serviced.In Control, If The Processor Stops, The System Can Go Out Of Control17File菜单菜单18Project菜单菜单19View菜单20Debug菜单菜单213. 采用采用CCS开发应用程序的步
11、骤开发应用程序的步骤创建一个新工程创建一个新工程(project)。编辑源程序编辑源程序(*.asm, *.c)与连接命令文件与连接命令文件(* d) 。将文件添加到该工程中将文件添加到该工程中(*.asm, *.c, *.h, * d)。编译汇编连接。编译汇编连接。装载程序。装载程序。调试程序。调试程序。程序固化。程序固化。22调试程序调试程序 连续运行与单步运行。连续运行与单步运行。 设置断点。设置断点。 查看与修改存储单元。查看与修改存储单元。查看与修改寄存器内容。查看与修改寄存器内容。 观察和编辑变量。观察和编辑变量。程序程序Animate运行和数据图形显示。运行和数据图形显示。23C
12、工程工程(Project)几种基本文件几种基本文件CCS工程文件工程文件(扩展名为扩展名为.pjt)。由。由CCS自动生成。在自动生成。在CC(Code Composer)软件环境中,扩展名为软件环境中,扩展名为.mak。 源程序源程序: 汇编语言文件汇编语言文件(*.asm), C文件文件(*.c)。头文件头文件(*.h): 定义寄存器映射地址,用户自定义的常量等。例如定义寄存器映射地址,用户自定义的常量等。例如用于用于C程序的片内外设寄存器地址定义头文件,用于汇编语言程程序的片内外设寄存器地址定义头文件,用于汇编语言程序的片内外设寄存器定义头文件等。序的片内外设寄存器定义头文件等。链接命令
13、文件(链接命令文件(* d)。)。库文件(库文件(*.lib)。)。 C24x运行时支持库为。运行时支持库为。目标文件目标文件(*.obj):COFF公共目标文件格式。公共目标文件格式。列表文件列表文件(*.lst):汇编生成的文件。:汇编生成的文件。映射文件映射文件(*.map): 存储器分配。存储器分配。可执行代码文件可执行代码文件(*.out)。4.3 DSP 的的C工程文件工程文件244.3.1 公共目标文件格式公共目标文件格式COFF 编译、汇编与链接程序建立的目标文件采用共用目标文件格编译、汇编与链接程序建立的目标文件采用共用目标文件格式(式(Common Object File
14、Format, COFF),便于模块化编程、),便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址。管理代码段和存储器,即不必为程序代码或变量指定目标地址。 汇编器根据命令用适当的段将各部分程序代码和数据连在一起,汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存储器中。储器中。 段段(section,也称为块,也称为块)是目标文件的最小单位,是在存储器中占据是目标文件的最小单位,是在存储器中占据连续空间的代码和数据块,各段相互独立。连续空间的代码和
15、数据块,各段相互独立。 25目标文件中段与目标存储器之间的关系目标文件中段与目标存储器之间的关系 汇编器的汇编器的COFF文件格式包括三个默认的段:文件格式包括三个默认的段:.text段,即程序段段,即程序段,该段通常包含可执行代码即程序。该段通常包含可执行代码即程序。.data段,即数据段段,即数据段,该段通常包含已初始化的数据。该段通常包含已初始化的数据。.bss段,即保留数据空间段段,即保留数据空间段,该段通常为未初始化的数据保留空间。该段通常为未初始化的数据保留空间。26 汇编器和链接器允许用户建立和链接自定义的段。所有汇编器和链接器允许用户建立和链接自定义的段。所有段可以分为初始化段
16、和未初始化段两类。初始化段包含程序段可以分为初始化段和未初始化段两类。初始化段包含程序代码和数据。未初始化段则为未初始化的数据保留存储空间。代码和数据。未初始化段则为未初始化的数据保留存储空间。汇编命令汇编命令.sect和和.usect可以分别用来创建自定义的初始化段和可以分别用来创建自定义的初始化段和未初始化段。未初始化段。 C编译器对编译器对C程序编译后也产生初始化段和未初始化段两类,程序编译后也产生初始化段和未初始化段两类,具体的段名稍有不同,除了不使用具体的段名稍有不同,除了不使用.data段之外,还产生一些新的段之外,还产生一些新的段。段。 27 编译器对编译器对C语言编译后除了生成
17、语言编译后除了生成2个基本段,即个基本段,即.text、.bss外外,还生成其他还生成其他一些段。一些段。 可分为初始化段和未初始化段。可分为初始化段和未初始化段。 初始化段包含可执行代码或常数表。初始化段包含可执行代码或常数表。C编译器产生的初始化段编译器产生的初始化段有有 .pint、.const、.text、.cinit、.switch 。.text段,包含可执行代码和常量段,包含可执行代码和常量(constant)。.cinit段和段和.pint段,包含初始化变量和常量。段,包含初始化变量和常量。.const段,包含串常量,全局变量、静态变量的声明和初始化。段,包含串常量,全局变量、静
18、态变量的声明和初始化。.switch段,包含段,包含switch语句表。语句表。28未初始化段用于保留存储器未初始化段用于保留存储器(通常为通常为RAM)空间。空间。C编译器产生的为初始编译器产生的为初始化段有化段有.bss、.stack、.sysmem段。段。.bss段,为全局和静态变量保留空间。段,为全局和静态变量保留空间。.stack段,为段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。调用函数时传递参数。.sysmem段段,为动态存储器分配保留空间为动态存储器分配保留空间, malloc函数使用。函数使用。29
19、初始化段链接初始化段链接 段名称段名称描述描述限制限制.text可执行代码和常量可执行代码和常量程序程序.cint已初始化的全局与静态变量的已初始化的全局与静态变量的C初始初始化记录化记录64K数据数据.pint全局构造器全局构造器(C+ constructor)表表程序程序.switch实现实现switch语句表语句表程序程序/64K数据数据.const已初始化的全局与静态已初始化的全局与静态const修饰变量,修饰变量,串常量串常量64K数据数据30未初始化段链接未初始化段链接 段名称段名称内容内容限制限制.bss全局与静态变量全局与静态变量64K数据数据.stack堆栈空间堆栈空间64K
20、数据数据.sysmemmalloc函数存储区函数存储区64K数据数据31存储器映射表存储器映射表 段段(Section)存储器类型存储器类型(Type of Memory)页面页面(Page).textROM 或或RAM0.cintROM 或或RAM0.pintROM 或或RAM0.switchROM 或或RAM0,1.constROM 或或RAM1.bssRAM1.stackRAM1.sysmemRAM1324.3.2 链接命令文件链接命令文件 CCS的链接器可以有很多选项,如的链接器可以有很多选项,如-l(包含库文件包含库文件)、-stack(定定义堆栈义堆栈)、-o(定义输出文件定义输出
21、文件)等,并且将用户软件定义的段与目标系等,并且将用户软件定义的段与目标系统存储器物理地址对应关系定义清楚。统存储器物理地址对应关系定义清楚。 链接器选项的实现通常采用工程选项菜单或链接器命令文件链接器选项的实现通常采用工程选项菜单或链接器命令文件( d)两种方法。两种方法。 编写一个链接器命令文件,将所有链接器选项写在文件中,并将此编写一个链接器命令文件,将所有链接器选项写在文件中,并将此文件加入到工程,这样文件加入到工程,这样CCS在进行编译链接时,会自动按照链接器命令在进行编译链接时,会自动按照链接器命令文件中的选项进行。文件中的选项进行。 有两条链接器命令有两条链接器命令MEMORY和
22、和SECTIONS可以实现对程可以实现对程序存储器和数据存储器空间的分配。序存储器和数据存储器空间的分配。MEMORY命令定义目标命令定义目标存储器的配置,存储器的配置,SECTIONS命令定义编程段与目标存储器的关命令定义编程段与目标存储器的关系。系。 33MEMORY命令命令 MEMORY命令定义目标系统中可以使用的存储器范围,每个存储命令定义目标系统中可以使用的存储器范围,每个存储器范围具有名字、起始地址和长度。一般形式为器范围具有名字、起始地址和长度。一般形式为MEMORYPAGE 0: name: origin=constant, length=constant;PAGE n: na
23、me: origin=constant, length=constant; PAGE n:定义存储器空间。:定义存储器空间。n=0254. 通常通常PAGE 0定义程序存储器,定义程序存储器,PAGE 1定义数据存储器。定义数据存储器。name:存储器范围名字。可以是:存储器范围名字。可以是18个字符。个字符。origin或简写为或简写为o:存储器范围的起始地址。:存储器范围的起始地址。length或简写为或简写为l:存储器范围的长度。:存储器范围的长度。34SECTIONS命令命令 SECTIONS命令用于将输出各段定位到所定义的存储器。一般形命令用于将输出各段定位到所定义的存储器。一般形式
24、为式为SECTIONSname: property, property, name: property, property, 在段名之后是是特性列表,定义段的内容以及是怎样分配的。段的在段名之后是是特性列表,定义段的内容以及是怎样分配的。段的特性特性(property)是装载位置、运行位置、输入段、段类型等。通常的特性是装载位置、运行位置、输入段、段类型等。通常的特性符号符号“”表示输出段装载位置。表示输出段装载位置。 354.4 DSP C语言程序设计基础语言程序设计基础4.4.1 数据类型数据类型4.4.2 C语言运算符与基本语句语言运算符与基本语句4.4.3 函数函数4.4.4 指针指针
25、4.4.5 编译预处理命令编译预处理命令4.4.6 C语言与汇编语言混合编程语言与汇编语言混合编程4.4.7 C28x DSP编译器的关键字编译器的关键字36C语言程序设计优缺点语言程序设计优缺点汇编语言程序设计汇编语言程序设计: 执行速度快。执行速度快。 开发周期长、移植性和可读性差开发周期长、移植性和可读性差 。 C语言程序设计语言程序设计:开发周期短、移植性和可读性好。开发周期短、移植性和可读性好。执行速度可以满足要求。执行速度可以满足要求。37 C28x DSP C28x DSP具有优化的具有优化的C C编译器,它支持编译器,它支持ANSI C ANSI C 标准。标准。还具有一些不同
26、于标准还具有一些不同于标准C C的特征。的特征。 DSP的基本数据类型如表所示,还具有数组、结构、的基本数据类型如表所示,还具有数组、结构、联合等构造类型数据。联合等构造类型数据。4.4.1 数据类型数据类型38TMS320C24x C的数据类型的数据类型 类型类型长度长度(位位)表示方法表示方法数值范围数值范围最小值最小值最大值最大值字符型字符型char, signed charunsigned char1616ASCIIASCII-3276803276765535整型整型shortunsigned shortint, signed intunsigned intlong, signed l
27、ongunsigned long161616163232补码补码二进制二进制补码补码二进制二进制补码补码二进制二进制-327680-327680-214748364803276765535327676553521474836474294967295实型实型floatdoublelong double32IEEE 32-bit 1.19209290E-38 3.4028235E+38枚举枚举enum16补码补码-3276832767指针指针pointer16二进制二进制00 xFFFF394.4.2 C语言运算符与基本语句语言运算符与基本语句 1. C语言运算符语言运算符2. C语言基本语句语言
28、基本语句 C语言运算符有算术运算符、关系运算符、逻辑运算符、位语言运算符有算术运算符、关系运算符、逻辑运算符、位操作运算符等。不同的运算符可以有不同的优先级、运算对象个操作运算符等。不同的运算符可以有不同的优先级、运算对象个数与结合方向。数与结合方向。 C语句有控制语句、表达式语句、函数调用语句、空语句有控制语句、表达式语句、函数调用语句、空语句和复合语句五类。控制语句有语句和复合语句五类。控制语句有9种。种。40 与普通的与普通的C语言程序类似,语言程序类似,DSP C程序是由若干模块程序是由若干模块化的函数构成。函数是化的函数构成。函数是C程序的基本模块,子程序就是由程序的基本模块,子程序
29、就是由函数来实现的。函数来实现的。 用户可以根据需要定义自己的功能函数,也可以调用用户可以根据需要定义自己的功能函数,也可以调用C编编译器提供的标准函数(库函数)来完成某种特定的功能。译器提供的标准函数(库函数)来完成某种特定的功能。 注意函数调用的规则。注意函数调用的规则。4.4.3 函数函数 41 C函数的一般格式为函数的一般格式为类型函数名(形式参数及其类型表)类型函数名(形式参数及其类型表)变量声明部分;变量声明部分;执行语句部分;执行语句部分; 一个函数在程序中可以三种形态出现:函数定义一个函数在程序中可以三种形态出现:函数定义(Definition)、函数调用和函数声明()、函数调
30、用和函数声明(Declaration)。函数定)。函数定义相当于汇编语言中的一般子程序。函数调用相当于调用子程义相当于汇编语言中的一般子程序。函数调用相当于调用子程序。函数定义和函数调用不分先后,但若调用在定义之前,那序。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数声明。函数声明是一个没有函数体么在调用前必须先进行函数声明。函数声明是一个没有函数体的函数定义,而函数调用则要求有函数名和实际参数表。的函数定义,而函数调用则要求有函数名和实际参数表。 42 可以用指针的方法访问变量,用指针访问数组、结构、联可以用指针的方法访问变量,用指针访问数组、结构、联合变量非常方
31、便。合变量非常方便。4.4.4 指针指针 C语言中访问片内外数据存储器或外设寄存器语言中访问片内外数据存储器或外设寄存器, 可以用指针的方可以用指针的方法实现。例如,一种方法定义法实现。例如,一种方法定义volatile unsigned int *IMR= (volatile unsigned int *)0 x0004这时,这时,IMR为指针,则给寄存器为指针,则给寄存器IMR赋值可以用以下语句赋值可以用以下语句*IMR=0 x0010 或者,另一种方法定义或者,另一种方法定义define IMR *(volatile unsigned int *)0 x0004这时,这时,IMR为宏名,
32、则给寄存器为宏名,则给寄存器IMR赋值可以用以下语句赋值可以用以下语句IMR=0 x0010 43C语言用指针访问数据存储器(或片内外设寄存器)语言用指针访问数据存储器(或片内外设寄存器) 可以用指针方法实现。可以用指针方法实现。 一般将这些定义放到一个头文件,使用一般将这些定义放到一个头文件,使用时,用编译预处理命令时,用编译预处理命令 include包含该头文件即可。包含该头文件即可。44例,将例,将DSP的数据存储器的数据存储器300H开始的开始的16个单元复制到个单元复制到200H开始的单元。开始的单元。main( )int i;unsigned int *p1, *p2, *p3;
33、/定义定义3个指向无符号整型的指针个指向无符号整型的指针p1=(unsigned int *)0 x300;/用指针方式访问存储单元用指针方式访问存储单元p2=(unsigned int *)0 x200;for ( i=0, p3=p1; i16; i+, p3+ )*p3=i;/0 x3000 x30F单元分别赋值单元分别赋值015for ( i=0, p3=p2; i16;i+,p3+ ) *p3=0 x1234; /0 x2000 x20F单元均赋值单元均赋值0 x1234for ( i=0; i16; i+, p1+, p2+ )*p2=*p1; /将将300H开始的开始的16个单元
34、复制到个单元复制到200H开始的单元开始的单元while(1) ; 45宏定义宏定义 #define#define Uint16 unsigned int (typedef unsigned int Uint16; )#define EINT asm(“ clrc INTM”)EINT;#define IMR *(volatile unsigned int *)0 x0004 /定义一个宏代表定义一个宏代表中断屏蔽寄存器中断屏蔽寄存器IMR 4.4.5 编译预处理编译预处理 文件包含文件包含#include#include ”1. 宏定义、文件包含与条件编译宏定义、文件包含与条件编译46条件编
35、译条件编译 #ifdef 标识符标识符程序段程序段1#else程序段程序段2#endif47 pragma是一类编译预处理命令(是一类编译预处理命令(directive),通知编译预),通知编译预处理器如何处理函数。处理器如何处理函数。C24x C/C+ 支持如下支持如下pragma命令,命令,CODE_SECTION(func, “section name”)DATA_SECTION(symbol, “section name”)INTERRUPT(func)FUNC_EXT_CALLED(func)FAST_CALL(func)2. pragma 命令命令48 CODE_SECTION 代
36、码段代码段 它为函数它为函数func在一个名为在一个名为section name 的段的段(section)中指定空间。中指定空间。将一个代码对象连接到一个不同于将一个代码对象连接到一个不同于.text段的空间时,该语法非常有用。段的空间时,该语法非常有用。例如例如char bufferA80;#pragma CODE_SECTION(funA, “codeA”)char funA(int i);void main( ) char c; c=funA(1);char funA(int i) return bufferAi;49 DATA_SECTION 数据段数据段 它为符号它为符号symbo
37、l在一个名为在一个名为section name 的段中指的段中指定空间。将一个数据对象连接到一个不同于定空间。将一个数据对象连接到一个不同于.bss段的空段的空间时,该语法非常有用。例如间时,该语法非常有用。例如#pragma DATA_SECTION(bufferB, “my_sect”)char bufferB(512); 数据块数据块bufferB被定位于被定位于my_sect段中,段中, my_sect段在段在 d文件中规定物理地址。文件中规定物理地址。504.4.6 C语言与汇编语言混合编程语言与汇编语言混合编程 在在C程序中直接嵌入汇编语句。程序中直接嵌入汇编语句。 独立的独立的C
38、模块和汇编模块接口。模块和汇编模块接口。 独立编写独立编写C程序与汇编程序,分别编译、汇编生程序与汇编程序,分别编译、汇编生成目标代码模块,然后用连接器连接起来。成目标代码模块,然后用连接器连接起来。 从从C程序中访问汇编程序变量。程序中访问汇编程序变量。511. 在在C程序中直接嵌入汇编语句程序中直接嵌入汇编语句C程序嵌入汇编语句是一种直接的程序嵌入汇编语句是一种直接的C模块和汇编模块接口方法。模块和汇编模块接口方法。可以在可以在C程序中实现用程序中实现用C语言难以实现的一些硬件控制功能。语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在另一方面,也可以用这种方法在C程序中的关键部
39、分用汇编语程序中的关键部分用汇编语句代替句代替C语句以优化程序。语句以优化程序。这种方法的一个缺点是它比较容易破坏这种方法的一个缺点是它比较容易破坏C环境,因为环境,因为C编译编译器在编译嵌入了汇编语句的器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入程序时并不检查或分析所嵌入的汇编语句。的汇编语句。 直接在直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加加上双引号和小括号,前面加asm标识符号标识符号,双引号内第一个字符应双引号内第一个字符应是空格。即,是空格。即, asm (“ 汇编语句汇编语句”) 例如例如
40、 asm asm (“ NOP”NOP”); ; #define EINT asm (“ CLRC INTM”) / #define EINT asm (“ CLRC INTM”) /开放中断开放中断 EINT;EINT;522. 独立的独立的C模块和汇编模块接口模块和汇编模块接口在编写独立的汇编程序时,必须注意以下几点:在编写独立的汇编程序时,必须注意以下几点:(1)不论是用)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。)必须保护函数要用到的几个特定寄存
41、器。 (3)中断程序必须保护所有用到的寄存器。)中断程序必须保护所有用到的寄存器。(4)从汇编程序调用)从汇编程序调用C函数时,第一个参数(最左边)必须放入累函数时,第一个参数(最左边)必须放入累加器加器A中,剩下的参数按自右向左的顺序压入堆栈。中,剩下的参数按自右向左的顺序压入堆栈。(5)调用)调用C函数时,注意函数时,注意C函数只保护了几个特定的寄存器,而其他寄存函数只保护了几个特定的寄存器,而其他寄存器可以自由使用。器可以自由使用。(6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。高位字在低地址。53 (7)如
42、果函数有返回值,返回值存放在累加器中。)如果函数有返回值,返回值存放在累加器中。 (8)汇编语言模块不能改变由)汇编语言模块不能改变由C模块产生的模块产生的.cinit段,如果改变其内容将会段,如果改变其内容将会引起不可预测的后果。引起不可预测的后果。(9)编译器在所有标识符(函数名、变量名等)前加下划线)编译器在所有标识符(函数名、变量名等)前加下划线“_”。 (10)任何在汇编程序中定义的对象或函数,如果需要在)任何在汇编程序中定义的对象或函数,如果需要在C程序程序中访问或调用,则必须用汇编指令中访问或调用,则必须用汇编指令.global定义。定义。543. 从从C程序中访问汇编程序变量程
43、序中访问汇编程序变量 从从C程序中访问在汇编程序中定义的变量或常数,可以分为程序中访问在汇编程序中定义的变量或常数,可以分为以下以下3种情况:种情况:(1)访问在)访问在.bss段中定义的变量。段中定义的变量。(2)访问不在)访问不在.bss段中定义的变量。段中定义的变量。 (3)对于在汇编程序中用)对于在汇编程序中用.set和和.global伪指令定义的全局常数,伪指令定义的全局常数,也可以使用特殊的操作从也可以使用特殊的操作从C程序中访问它们。程序中访问它们。55例例4-5,在,在C程序中访问在程序中访问在.bss段中定义的变量。段中定义的变量。汇编程序:汇编程序:.bss _var,1;
44、定义变量定义变量.global _var;声明为外部变量声明为外部变量C程序:程序:extern int var/声明为外部变量声明为外部变量var=1/访问变量访问变量 56例例4-6,在,在C程序中访问不在程序中访问不在.bss段中定义的变量。段中定义的变量。汇编程序:汇编程序:.global _sine;声明为外部变量声明为外部变量.sect “sine_tab”;建立一个独立的段建立一个独立的段_sine:;常数表起始地址常数表起始地址C程序:程序:extern float sine/声明为外部变量声明为外部变量float *sine_p=sine;/声明一个指针指向该变量声明一个指针
45、指向该变量f=sine_p4; /作为普通数组访问作为普通数组访问sine数组数组574.4.6 C24x DSP编译器的关键字编译器的关键字 C28x DSP C/C+编译器,支持标准的编译器,支持标准的const、register、volatile等关等关键字键字, 还扩展了还扩展了cregister 、interrupt等关键字。等关键字。关键字关键字const 该关键字可以优化存储器的分配。加该关键字可以优化存储器的分配。加const 到任何变量的定到任何变量的定义可以确保其内的值不变。义可以确保其内的值不变。58关键字关键字volatile 该关键字所定义的变量是可变的,可以被其他硬
46、件修改,该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由而不仅仅只能由C程序修改。优化器会尽量减少存储器的访问,程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。例子所以有时必须禁止优化,特别是循环控制变量。例子 volatile unsigned int *ctrl; while(*ctrl != 0 xff) ; /循环等待,直到循环等待,直到 ctrl 地址的内容为地址的内容为0 xff59关键字关键字cregster 该扩展关键字允许高级语言读该扩展关键字允许高级语言读/写控制寄存器。写控制寄存器。 在在C24x C中,中,cregist
47、er仅限于中断使能寄存器仅限于中断使能寄存器IER和中和中断标志寄存器断标志寄存器IFR,程序中应有如下声明,程序中应有如下声明 extern cregister volatile unsigned int IER; extern cregister volatile unsigned int IFR; 可以用可以用|(位或)和(位或)和&(位与位与)进行操作,例如进行操作,例如 IFR|=0 x100; IFR&=0 x100;60关键字关键字interrupt 该扩展关键字用来说明函数是一个中断函数。该扩展关键字用来说明函数是一个中断函数。 中断函数被定义成返回中断函数被定
48、义成返回void类型,而且无参数调用,例如,类型,而且无参数调用,例如,interrupt void int_handler( )unsigned int flags;61关于中断函数关于中断函数中断的使能和屏蔽必须由程序员自己设置。中断的使能和屏蔽必须由程序员自己设置。 中断程序没有参数传递,既使说明,也会被忽略。中断程序没有参数传递,既使说明,也会被忽略。中断处理程序不能被正常的中断处理程序不能被正常的C程序调用。程序调用。为了使中断程序与中断一致,在相应的中断矢量中必须放置一为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令汇编伪指令建立一个简单的跳转指令表来完成此
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 恒大城项目变电站照明系统施工方案
- 高支模监测专项施工方案
- 2026年医保知识考试题库及答案
- 金地中心项目BIM异形结构施工方案-技术交底
- 高铁项目防机械伤害安全专项施工方案
- 人力资源管理师考试题及答案
- 车站静态爆破施工方案
- 2026年中级经济师实务考试(农业经济)新版真题(含答案)
- 公司车辆安全生产管理制度模板
- 第三单元测试卷-2025-2026学年语文五年级上册统编版
- 基于E6、SO(10)理论的U(1)暗物质同位旋破坏模型解析与探究
- 智慧方案智慧矿山建设的发展与实践
- 2025全国青少年模拟飞行考核理论知识题库50题及答案
- 耳尖放血疗法课件
- 儿童安全用电培训课件
- 研发物料管理办法
- GB/T 8243.6-2025内燃机全流式机油滤清器试验方法第6部分:静压耐破度试验
- 施工企业竞聘管理办法
- 菠菜的种植教学课件
- 医疗口腔开业活动方案
- 大米加工应急管理制度
评论
0/150
提交评论