DSP2833X-C语言+程序烧写.ppt

上传人:m**** 文档编号:570126878 上传时间:2024-08-02 格式:PPT 页数:99 大小:2.60MB
返回 下载 相关 举报
DSP2833X-C语言+程序烧写.ppt_第1页
第1页 / 共99页
DSP2833X-C语言+程序烧写.ppt_第2页
第2页 / 共99页
DSP2833X-C语言+程序烧写.ppt_第3页
第3页 / 共99页
DSP2833X-C语言+程序烧写.ppt_第4页
第4页 / 共99页
DSP2833X-C语言+程序烧写.ppt_第5页
第5页 / 共99页
点击查看更多>>
资源描述

《DSP2833X-C语言+程序烧写.ppt》由会员分享,可在线阅读,更多相关《DSP2833X-C语言+程序烧写.ppt(99页珍藏版)》请在金锄头文库上搜索。

1、DSP原理与应用原理与应用The Technology & Applications of DSPs北京交通大学北京交通大学 电气工程学院电气工程学院夏明超夏明超 郝瑞祥郝瑞祥 万庆祝万庆祝DSP原理与应用原理与应用2024年年8月月2日日2第二章第二章:DSP系统开发系统开发l第第2.1节节 概述概述l第第2.2节节 DSP汇编语言概述及汇编程序设计汇编语言概述及汇编程序设计l第第2.3节节 DSP C语言程序设计语言程序设计l第第2.4节节 DSP C与汇编混合编程与汇编混合编程l第第2.5节节 DSP程序烧写程序烧写l习题习题DSP原理与应用原理与应用2024年年8月月2日日3第第2.1

2、节节 概述概述l汇编语言汇编语言: 开发的效率高,程序执行速度快,而且可以合理利用开发的效率高,程序执行速度快,而且可以合理利用芯片的硬件资源芯片的硬件资源开发难度较大,开发周期长,可读性和可移植性差。开发难度较大,开发周期长,可读性和可移植性差。lC语言开发语言开发:具有兼容性和可移植的优点,有利于缩短开发周期和具有兼容性和可移植的优点,有利于缩短开发周期和减少开发难度减少开发难度在运算量较大的情况下,在运算量较大的情况下,C代码的效率还是无法和手工代码的效率还是无法和手工编写的汇编代码的效率相比,比如编写的汇编代码的效率相比,比如FFT运算,运算,lC和汇编的混合编程则可以充分利用前两者的

3、优和汇编的混合编程则可以充分利用前两者的优点,以达到最佳利用点,以达到最佳利用DSP资源的目的。资源的目的。lC和汇编语言混合编程必须遵循相关函数调用规和汇编语言混合编程必须遵循相关函数调用规则和寄存器调用规则则和寄存器调用规则,否则会带来意想不到的问题。否则会带来意想不到的问题。DSP原理与应用原理与应用2024年年8月月2日日4第第2.1节节 概述概述lCCS开发实例演示开发实例演示DSP原理与应用原理与应用2024年年8月月2日日5第二章第二章:DSP系统开发系统开发l第第2.1节节 概述概述l第第2.2节节 DSP汇编语言概述及汇编程序设计汇编语言概述及汇编程序设计l第第2.3节节 D

4、SP C语言程序设计语言程序设计l第第2.4节节 DSP C与汇编混合编程与汇编混合编程l第第2.5节节 DSP程序烧写程序烧写l习题习题DSP原理与应用原理与应用2024年年8月月2日日6第第2.2节节 DSP汇编语言概述及汇编程序设计汇编语言概述及汇编程序设计l汇编语言汇编语言: 累加累加,算术计算和逻辑运算算术计算和逻辑运算辅助寄存器和数据页操作辅助寄存器和数据页操作TREG,PREG和乘法指令和乘法指令直接内存访问指令直接内存访问指令(DMA)和和IO操作指令操作指令程序空间访问指令程序空间访问指令跳转指令、寄存器操作指令跳转指令、寄存器操作指令l浮点运算指令浮点运算指令l汇编程序设计

5、汇编程序设计: 生成可执行代码过程生成可执行代码过程示例文件示例文件DSP原理与应用原理与应用2024年年8月月2日日7第第2.2.1累加累加,算术计算和逻辑运算算术计算和逻辑运算DSP原理与应用原理与应用2024年年8月月2日日8第第2.2.1累加累加,算术计算和逻辑运算算术计算和逻辑运算DSP原理与应用原理与应用2024年年8月月2日日9第第2.2.1累加累加,算术计算和逻辑运算算术计算和逻辑运算DSP原理与应用原理与应用2024年年8月月2日日10第第2.2.1累加累加,算术计算和逻辑运算算术计算和逻辑运算DSP原理与应用原理与应用2024年年8月月2日日11第第2.2.2辅助寄存器和数

6、据页操作辅助寄存器和数据页操作DSP原理与应用原理与应用2024年年8月月2日日12第第2.2.2辅助寄存器和数据页操作辅助寄存器和数据页操作DSP原理与应用原理与应用2024年年8月月2日日13第第2.2.3 TREG,PREG和乘法指令和乘法指令DSP原理与应用原理与应用2024年年8月月2日日14第第2.2.3 TREG,PREG和乘法指令和乘法指令DSP原理与应用原理与应用2024年年8月月2日日15第第2.2.3 TREG,PREG和乘法指令和乘法指令DSP原理与应用原理与应用2024年年8月月2日日16第第2.2.4直接内存访问直接内存访问(DMA)和和IO操作指令操作指令DSP原

7、理与应用原理与应用2024年年8月月2日日17第第2.2.5程序空间访问指令程序空间访问指令DSP原理与应用原理与应用2024年年8月月2日日18第第2.2.6 跳转指令跳转指令DSP原理与应用原理与应用2024年年8月月2日日19第第2.2.7 寄存器操作指令寄存器操作指令DSP原理与应用原理与应用2024年年8月月2日日20第第2.2.7 寄存器操作指令寄存器操作指令DSP原理与应用原理与应用2024年年8月月2日日21第第2.2.7 寄存器操作指令寄存器操作指令DSP原理与应用原理与应用2024年年8月月2日日22第第2.2.8 浮点运算指令浮点运算指令l浮点数简介浮点数简介(IEEE7

8、54)单精度浮点数:单精度浮点数:1位符号位位符号位,8位指数位指数,23位有效数位有效数IEEE754-IEEE Standard 754 for Binary Floating Point Arithmetic单精度浮点数范围:单精度浮点数范围:3.4028235*1038在此范围内也无法精确表述所有浮点数在此范围内也无法精确表述所有浮点数精度:精度:1.19209290 * 10-38可精确表述的数必须可以用可精确表述的数必须可以用2的指数幂次组合描述的指数幂次组合描述DSP原理与应用原理与应用2024年年8月月2日日23第第2.2.8 浮点运算指令浮点运算指令l浮点数简介浮点数简介(I

9、EEE754)单精度浮点数:单精度浮点数:1位符号位位符号位,8位指数位指数,23位有效数位有效数IEEE754-IEEE Standard 754 for Binary Floating Point Arithmetic例:例:00111111 01100110 01100110 0110011016进制为:进制为:0X3F666666整形数为整形数为1063675494单精度下:符号位单精度下:符号位0(+) 指数位指数位E(01111110) 2=126,e=-1 尾数尾数1100110 01100110011001102 1.799999952316284179687510 实际值实际

10、值0.89999997615814208984375 DSP原理与应用原理与应用2024年年8月月2日日24第第2.2.8 浮点运算指令浮点运算指令l浮点数简介浮点数简介(IEEE754)单精度浮点数:单精度浮点数:1位符号位位符号位,8位指数位指数,23位有效数位有效数IEEE754-IEEE Standard 754 for Binary Floating Point Arithmetic单精度运算精度:加、减、乘、除、平方根、余数、单精度运算精度:加、减、乘、除、平方根、余数、将浮点格式的数舍入为整数值、在不同浮点格式之将浮点格式的数舍入为整数值、在不同浮点格式之间转换、在浮点和整数格式

11、之间转换以及比较。间转换、在浮点和整数格式之间转换以及比较。四种舍入方向四种舍入方向:向最近数方向向最近数方向,向负无穷大向负无穷大,向正无穷向正无穷大以及向大以及向0。五种类型的浮点异常是:无效运算、被零除、上溢、五种类型的浮点异常是:无效运算、被零除、上溢、下溢和不精确。下溢和不精确。*常犯错误常犯错误: f=0,应该为,应该为-ef FLASHA PAGE = 0 .pinit : FLASHA, PAGE = 0 .text : FLASHA PAGE = 0 codestart : BEGIN PAGE = 0 ramfuncs : LOAD = FLASHD, RUN = RAML

12、0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0 csmpasswds : CSM_PWL PAGE = 0 csm_rsvd : CSM_RSVD PAGE = 0 /* Allocate uninitalized data sections: */ .stack : RAMM1 PAGE = 1 .ebss : RAML4 PAGE = 1 .esysmem : RAMM1 PAGE = 1DSP原理与应用原理与应用2024年年8月月2日

13、日33第第2.2.9 汇编程序设计汇编程序设计-示例文件示例文件l.h文件文件:标号标号,地址地址,中断向量等定义中断向量等定义; File name: 280x.hIMR.set 0004h ; Interrupt Mask RegisterIFR.set 0006h ; Interrupt Flag Register; System configuration and interrupt registersSCSR1.set 7018h ; System Control & Status register. 1SCSR2.set 7019h ; System Control & Statu

14、s register. 2DINR.set 701Ch ; Device Identification Number register.PIVR.set 701Eh ; Peripheral Interrupt Vector register.PIRQR0.set 7010h ; Peripheral Interrupt Request register 0PIRQR1.set 7011h ; Peripheral Interrupt Request register 1PIRQR2.set 7012h ; Peripheral Interrupt Request register 2PIAC

15、KR0.set 7014h ; Peripheral Interrupt Acknowledge register 0PIACKR1.set 7015h ; Peripheral Interrupt Acknowledge register 1PIACKR2.set 7016h ; Peripheral Interrupt Acknowledge register 2; File name: vector.h.sectvectorsRSVECT B START ; Reset VectorINT1B GISR1 ; Interrupt Level 1INT2B GISR2 ; Interrup

16、t Level 2INT3B GISR3 ; Interrupt Level 3INT4B GISR4 ; Interrupt Level 4INT5B GISR5 ; Interrupt Level 5INT6B GISR6 ; Interrupt Level 6RESERVED B PHANTOM ; ReservedSW_INT8 B PHANTOM ; Software InterruptSW_INT9 B PHANTOM ; Software InterruptSW_INT10 B PHANTOM ; Software InterruptSW_INT11 B PHANTOM ; So

17、ftware InterruptSW_INT12 B PHANTOM ; Software InterruptSW_INT13 B PHANTOM ; Software InterruptSW_INT14 B PHANTOM ; Software InterruptSW_INT15 B PHANTOM ; Software InterruptSW_INT16 B PHANTOM ; Software InterruptTRAP B PHANTOM ; Trap vectorNMI B NMI ; Nonmaskable InterruptEMU_TRAP B PHANTOM ; Emulato

18、r TrapSW_INT20 B PHANTOM ; Software InterruptSW_INT21 B PHANTOM ; Software InterruptSW_INT22 B PHANTOM ; Software InterruptSW_INT23 B PHANTOM ; Software InterruptSW_INT24 B PHANTOM ; Software InterruptDSP原理与应用原理与应用2024年年8月月2日日34第第2.2.9 汇编程序设计汇编程序设计-示例文件示例文件l.asm文件文件: 程序文件程序文件* File Name: SPI.asm.inc

19、lude 280xA.h.include vector.h.bss GPR0,1 ;General purpose registers.bss GPR3,1KICK_DOG .macro ;Watchdog reset macroLDP #00E0hSPLK #05555h, WDKEYSPLK #0AAAAh, WDKEYLDP #0h.endm; M A I N C O D E starts here.textSTART: LDP #0SETC INTMSPLK #0h,GPR3OUT GPR3,WSGRCLRC SXM CLRC OVMCLRC CNFLDP #WDCR7SPLK #00

20、6Fh,WDCRKICK_DOGLDP #SCSR17SPLK #0020h,SCSR1DSP原理与应用原理与应用2024年年8月月2日日35第二章第二章:DSP程序设计程序设计l第第2.1节节 概述概述l第第2.2节节 DSP汇编语言概述及汇编程序设计汇编语言概述及汇编程序设计l第第2.3节节 DSP C语言程序设计语言程序设计l第第2.4节节 DSP C与汇编混合编程与汇编混合编程l第第2.5节节 DSP程序烧写程序烧写l习题习题DSP原理与应用原理与应用2024年年8月月2日日36第第2.3节节 DSP C语言程序设计语言程序设计l支持支持ANSI C: 提供相应的编译器和优化工具提供相

21、应的编译器和优化工具对对ANSI C进行了限定和扩展进行了限定和扩展l运行库运行库: 字符串操作字符串操作动态地址分配动态地址分配数据转换数据转换DSP原理与应用原理与应用2024年年8月月2日日37第第2.3节节 DSP C语言程序设计语言程序设计l变量和标识变量和标识: 变量和标识符长度变量和标识符长度100个字符,区分大小写个字符,区分大小写变量和标识符的符号集为变量和标识符的符号集为ASCII,不支持多字节符号,不支持多字节符号(如汉字)。(如汉字)。字符或字符串常量中的字符或字符串常量中的16进制进制ESC码码(特殊字符,如特殊字符,如0X07)可能会有可能会有32位的值。位的值。多

22、字符的字符变量最后一个有效,如多字符的字符变量最后一个有效,如abc是是cl数据类型数据类型: Size_t(sizeof的结果的结果)定义为定义为unsigned intPtrdiff_t(指针加减结果指针加减结果)定义为定义为int所有的整数类型所有的整数类型(char, short, int, 以及这些类型的无以及这些类型的无符号型符号型)都是相同类型都是相同类型,并代表并代表16位的二进制值位的二进制值.Long和和unsigned long代表代表32位二进制值位二进制值.DSP原理与应用原理与应用2024年年8月月2日日38第第2.3节节 DSP C语言程序设计语言程序设计l数据类

23、型数据类型: 有符号数是用二进制补码表示有符号数是用二进制补码表示.数据单元的基础是字数据单元的基础是字(16位位),BYTE和和WORD一样一样char是有符号类型是有符号类型,等同于等同于int枚举型枚举型(enum)用用16位值表示位值表示,等同于等同于int浮点类型浮点类型(float,double)是相同的是相同的,遵循遵循TMS320C2x/C2xx/C5x的的32位浮点类型位浮点类型.Long 和和float的数据存储格式为低有效字存储在的数据存储格式为低有效字存储在低地址的方式低地址的方式.Long long 和和long double是是64位的位的.DSP原理与应用原理与应

24、用2024年年8月月2日日39第第2.3节节 DSP C语言程序设计语言程序设计l数据类型数据类型: DSP原理与应用原理与应用2024年年8月月2日日40第第2.3节节 DSP C语言程序设计语言程序设计l类型转换类型转换: 浮点数转为整数为取整截断浮点数转为整数为取整截断指针类型指针类型(pointer)和和int可以自由转换可以自由转换far pointer 为为22位有效位位有效位l表达式表达式: 有符号整数相除有符号整数相除,商符号由两个数共同决定商符号由两个数共同决定,余数余数符号同被除数符号同被除数l10/-3=-3,余余1; -10/3=-3余余-1有符号数右移为算术右移有符号

25、数右移为算术右移,符号位不变符号位不变DSP原理与应用原理与应用2024年年8月月2日日41第第2.3节节 DSP C语言程序设计语言程序设计C访问访问16位乘法结果的高位乘法结果的高16位位:int m1,m2;int result;result=(long)m1*(long)m2) 16;浮点数浮点数:32bits FPU+,-,比较比较(,=, PMPAGE 0.TEXT : PM PAGE 0.BSS : BLK_B2 PAGE 1.DATA : BLK_B1 PAGE 1 BufferB_sect : SARAM_D PAGE 1DSP原理与应用原理与应用2024年年8月月2日日49

26、第第2.3节节 DSP C语言程序设计语言程序设计FAST_FUNC_CALL:指明某一函数调用时采用快速函数调用指明某一函数调用时采用快速函数调用(FFC)机制,而不是机制,而不是使用普通函数调用流程:使用普通函数调用流程:FFC进栈出栈及函数返回有所不同,调用更快速。进栈出栈及函数返回有所不同,调用更快速。#pragma FAST_FUNC_CALL (func)这类函数返回时的这类函数返回时的asm代码必须是:代码必须是:LB *XAR7DSP原理与应用原理与应用2024年年8月月2日日50第第2.3节节 DSP C语言程序设计语言程序设计FUNC_EXT_CALLED:指明某一未使用的

27、函数,使其不会在指明某一未使用的函数,使其不会在C优化时被删除。优化时被删除。#pragma FUNC_EXT_CALLED (func)DSP原理与应用原理与应用2024年年8月月2日日51第第2.3节节 DSP C语言程序设计语言程序设计INTERRUPT:指明函数为中断处理函数指明函数为中断处理函数(函数返回机制使用函数返回机制使用IRP)#pragma INTERRUPT ( func );#pragma INTERRUPT;#pragma INTERRUPT (func, HPI|LPI);#pragma INTERRUPT ( HPI|LPI);)FPU有高优先级中断有高优先级中断

28、(HPI)和低优先级中断和低优先级中断(LPI)处理机制,处理机制,通过此预编译实现。通过此预编译实现。DSP原理与应用原理与应用2024年年8月月2日日52第第2.3节节 DSP C语言程序设计语言程序设计MUST_ITERATE:指明循环必须被执行的次数,以防止循环被优化掉指明循环必须被执行的次数,以防止循环被优化掉#pragma MUST_ITERATE (min,max,mult);有时通过空循环建立必须的延时,单在程序优化时会被自有时通过空循环建立必须的延时,单在程序优化时会被自动优化掉。动优化掉。例如:例如:For( i=0; i FLASH PAGE 0 /* initializ

29、ed */ /* Sections declared by the user */ vectors: VECS PAGE 0 /* initialized */ DSP原理与应用原理与应用2024年年8月月2日日60第第2.3节节 DSP C语言程序设计语言程序设计中断服务函数中断服务函数:中断服务函数类型必须是中断服务函数类型必须是void。中断服务函数要尽量短小,减少中断服务占用时中断服务函数要尽量短小,减少中断服务占用时间,以避免发生中断嵌套或丢中断。间,以避免发生中断嵌套或丢中断。 多个中断可以共用一个中断服务函数,除了多个中断可以共用一个中断服务函数,除了int00。注意注意IMR、

30、INTM等中断控制量的设置。等中断控制量的设置。中断服务函数可能和某些编译选项和优化冲突,中断服务函数可能和某些编译选项和优化冲突,需注意协调。需注意协调。DSP原理与应用原理与应用2024年年8月月2日日61第第2.3节节 DSP C语言程序设计语言程序设计中断服务函数中断服务函数:中断服务函数可以像其他函数一样访问全局变量、分配局中断服务函数可以像其他函数一样访问全局变量、分配局部变量和调用其它函数。部变量和调用其它函数。进入中断服务函数,编译器自动保护与运行上下文相关的进入中断服务函数,编译器自动保护与运行上下文相关的寄存器,并在中断服务函数结束时恢复运行环境。但并不寄存器,并在中断服务

31、函数结束时恢复运行环境。但并不保存所有寄存器保存所有寄存器中断服务程序可以任意修改不被保护的寄存器,如外设控中断服务程序可以任意修改不被保护的寄存器,如外设控制寄存器。制寄存器。中断服务函数也可以被其他中断服务函数也可以被其他c程序调用,但效率较差。程序调用,但效率较差。c_int00是系统保留的复位中断函数,不会被调用,也不是系统保留的复位中断函数,不会被调用,也不需要保护任何寄存器。需要保护任何寄存器。中断服务函数入口地址放在相应的中断向量处。中断服务函数入口地址放在相应的中断向量处。DSP原理与应用原理与应用2024年年8月月2日日62第第2.3节节 DSP C语言程序设计语言程序设计D

32、SP原理与应用原理与应用2024年年8月月2日日63第二章第二章:DSP程序设计程序设计l第第2.1节节 概述概述l第第2.2节节 DSP汇编语言概述及汇编程序设计汇编语言概述及汇编程序设计l第第2.3节节 DSP C语言程序设计语言程序设计l第第2.4节节 DSP C与汇编混合编程与汇编混合编程l第第2.5节节 DSP程序烧写程序烧写l习题习题DSP原理与应用原理与应用2024年年8月月2日日64第第2.4节节 DSP C与汇编混合编程与汇编混合编程lC语言和汇编语言混合编程的四种方法语言和汇编语言混合编程的四种方法(1) 独立编写汇编程序和独立编写汇编程序和C程序,分开编译或汇编成各自的目

33、标代程序,分开编译或汇编成各自的目标代码模块,再用链接器将二者链接起来。这种方法比较灵活,但是码模块,再用链接器将二者链接起来。这种方法比较灵活,但是设计者必须自己维护各汇编模块的入口和出口代码,自己计算传设计者必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量较大,但是能做到对程序的递的参数在堆栈中的偏移量,工作量较大,但是能做到对程序的绝对控制。绝对控制。(2) 在在C程序中使用汇编程序中定义的变量和常数。程序中使用汇编程序中定义的变量和常数。(3) 在在C程序中内嵌汇编语句。这种方法可以实现程序中内嵌汇编语句。这种方法可以实现C语言无法实现语言无法实现的一

34、些硬件控制功能,如修改中断控制寄存器。的一些硬件控制功能,如修改中断控制寄存器。(4) 将将C语言编译生成相应的汇编代码,手工修改和优化语言编译生成相应的汇编代码,手工修改和优化C编译器编译器生成的汇编代码。采用这种方法可以控制生成的汇编代码。采用这种方法可以控制C编译器,从而产生具有编译器,从而产生具有交叉列表的汇编程序,而设计者可以对其中的汇编语句进行修改,交叉列表的汇编程序,而设计者可以对其中的汇编语句进行修改,然后对汇编程序进行编译,产生目标文件。然后对汇编程序进行编译,产生目标文件。l后后3种方法由于在种方法由于在C中直接嵌入了汇编语言中直接嵌入了汇编语言,易造成程序混易造成程序混乱

35、,破坏乱,破坏C环境,甚至导致程序崩溃,而开发者又很难对环境,甚至导致程序崩溃,而开发者又很难对不良结果进行预期和有效控制。而如果采用第一种方法,不良结果进行预期和有效控制。而如果采用第一种方法,只要遵循有关只要遵循有关C语言函数调用规则和寄存器规则,就能预语言函数调用规则和寄存器规则,就能预见到程序运行的结果,保证程序正确。见到程序运行的结果,保证程序正确。DSP原理与应用原理与应用2024年年8月月2日日65第第2.4节节 DSP C与汇编混合编程与汇编混合编程DSP C编译器将存储空间分为两个线性空间:编译器将存储空间分为两个线性空间:n程序存储空间,存储可执行码程序存储空间,存储可执行

36、码n数据存储空间,存储程序执行过程中的数据和堆数据存储空间,存储程序执行过程中的数据和堆栈栈编译器将存储空间以分段编译器将存储空间以分段(section)的方式分配和管的方式分配和管理。用户以不同的方式分配存储器,可以形成不理。用户以不同的方式分配存储器,可以形成不同的系统配置,连接器将各个段连接在一起形成同的系统配置,连接器将各个段连接在一起形成最终完整的存储器结构。最终完整的存储器结构。*注意:是由连接器决定存储器影射而不是由编译器。注意:是由连接器决定存储器影射而不是由编译器。DSP原理与应用原理与应用2024年年8月月2日日66第第2.4节节 DSP C与汇编混合编程与汇编混合编程已初

37、始化的段:已初始化的段:.text包含所有可执行代码和浮点型常量PAGE 0.pinit包含初始化时的程序代码PAGE 0.cinit包含初始化变量和常量表PAGE 0.const包含字符串常量,以及以const修饰的全局或静态变量的声明和初始化PAGE 1.econst 扩展常量PAGE 1.switch包含switch语句的分支跳转地址表PAGE 0DSP原理与应用原理与应用2024年年8月月2日日67第第2.4节节 DSP C与汇编混合编程与汇编混合编程未初始化的段:未初始化的段:.bss为全局和静态变量保留空间PAGE 1.ebss扩展变量空间PAGE1.stack为系统软件堆栈分配空

38、间PAGE 1.sysmem为动态分配的内存保留空间,可以被calloc、malloc、realloc函数使用PAGE 1.esysmem 扩展动态内存空间PAGE1汇编自动生成汇编自动生成.text,.bss和和.data段。段。C编译器不使用编译器不使用.data段。段。DSP原理与应用原理与应用2024年年8月月2日日68第第2.4节节 DSP C与汇编混合编程与汇编混合编程用户定义的段:用户定义的段:用户使用用户使用CODE_SECTION,DATA_SECTION定义的定义的段,如上面的段,如上面的 my_sect, BufferB_sectDSP原理与应用原理与应用2024年年8月

39、月2日日69第第2.4节节 DSP C与汇编混合编程与汇编混合编程l/*/l/ Linker command file link.cmdl/*/l-c /* ROM autoinitialization model */l-m example.map /* Create a map file */l-o example.out /* Output file name */lmain.obj /* First C module */lsub.obj /* Second C module */lasm.obj /* Assembly language module */ll rts25.lib /

40、* Runtimesupport library */ll matrix.lib /* Object library */lMEMORYllPAGE 0 : PROG: origin = 30h, length = 0EFD0hlPAGE 1 : DATA: origin = 800h length 0E800hllSECTIONSll.text PROG PAGE 0l.cinit PROG PAGE 0l.switch PROG PAGE 0l.bss DATA PAGE 1l.const DATA PAGE 1l.sysmem DATA PAGE 1l.stack DATA PAGE 1

41、lDSP原理与应用原理与应用2024年年8月月2日日70第第2.4节节 DSP C与汇编混合编程与汇编混合编程系统堆栈系统堆栈:DSP 硬堆栈硬堆栈:8级,用于保存函数调用、中断服务函级,用于保存函数调用、中断服务函数等的返回地址,也可以用数等的返回地址,也可以用PUSH等保存其他变量等保存其他变量C编译器可以生成一定大小的软堆栈:编译器可以生成一定大小的软堆栈:分配局部变量分配局部变量传递函数参数传递函数参数保存处理器状态保存处理器状态保存函数返回地址保存函数返回地址保存临时结果保存临时结果保存寄存器内容保存寄存器内容DSP原理与应用原理与应用2024年年8月月2日日71第第2.4节节 DS

42、P C与汇编混合编程与汇编混合编程系统堆栈系统堆栈:编译器利用两个辅助寄存器来管理堆栈:编译器利用两个辅助寄存器来管理堆栈:SP堆栈指针堆栈指针(Stack Pointer),指向当前堆栈顶。,指向当前堆栈顶。XAR2帧指针帧指针(FP, Frame Pointer),指向当前帧的起始点,指向当前帧的起始点,每个函数都会在堆栈顶部建立一个新的帧,用来保存局部每个函数都会在堆栈顶部建立一个新的帧,用来保存局部或临时变量。或临时变量。C语言环境自动操作这两个寄存器。如果编写用到堆栈的汇语言环境自动操作这两个寄存器。如果编写用到堆栈的汇编语言程序,一定要注意正确使用这两个寄存器。编语言程序,一定要注

43、意正确使用这两个寄存器。默认堆栈大小是默认堆栈大小是1k。用。用-stack连接选项可以指定软件堆栈的大连接选项可以指定软件堆栈的大小,用小,用C编写编写DSP程序一定注意保留足够的堆栈空间!程序一定注意保留足够的堆栈空间!注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏DSP运行环境,导致程序失败。编写运行环境,导致程序失败。编写DSP程序和配置程序和配置DSP存储器资源要注意防止堆栈溢出的发生。存储器资源要注意防止堆栈溢出的发生。DSP原理与应用原理与应用2024年年8月月2日日72第第2.4节节 DSP C与汇编混合编程与汇编混合编程动态内

44、存分配动态内存分配:TMS320C2x/C2xx/C5x C语言可调用语言可调用malloc、calloc或或realloc函数动态申请内存,申请的内存将分配在函数动态申请内存,申请的内存将分配在.sysmem块。块。动态分配的内存只能通过指针进行访问,动态分配使用后可动态分配的内存只能通过指针进行访问,动态分配使用后可以释放,这样可以用于其它目的。将大数组通过这种方式以释放,这样可以用于其它目的。将大数组通过这种方式来分配可以节省来分配可以节省.bss块的空间。块的空间。通过连接器的通过连接器的-heap选项可以定义选项可以定义.sysmem块。块。unsigned int data100;

45、unsigned int *data;data =(unsigned int *) malloc (100 * sizeof (unsigned int);DSP原理与应用原理与应用2024年年8月月2日日73第第2.4节节 DSP C与汇编混合编程与汇编混合编程寄存器使用规则寄存器使用规则:TMS320C2x/C2xx/C5x运行环境对寄存器的使用有严格的运行环境对寄存器的使用有严格的要求,编写涉及到寄存器的汇编程序,必须严格遵守这些要求,编写涉及到寄存器的汇编程序,必须严格遵守这些规则,否则可能造成系统工作异常。寄存器规则规定了编规则,否则可能造成系统工作异常。寄存器规则规定了编译器如何使

46、用寄存器,和寄存器在函数调用的过程中如何译器如何使用寄存器,和寄存器在函数调用的过程中如何进行保护。进行保护。寄存器按照保护方式分为两种:寄存器按照保护方式分为两种:调用保存(调用保存(save on call),调用其它函数的函数负责保存),调用其它函数的函数负责保存这些寄存器的内容。这些寄存器的内容。入口保存(入口保存(save on entry),被调用的函数负责保存这些),被调用的函数负责保存这些寄存器的内容。寄存器的内容。注:无论是否使用优化编译,都必须遵守这些寄存器规则。注:无论是否使用优化编译,都必须遵守这些寄存器规则。DSP原理与应用原理与应用2024年年8月月2日日74第第2

47、.4节节 DSP C与汇编混合编程与汇编混合编程寄存器使用规则寄存器使用规则:DSP原理与应用原理与应用2024年年8月月2日日75第第2.4节节 DSP C与汇编混合编程与汇编混合编程寄存器使用规则寄存器使用规则:DSP原理与应用原理与应用2024年年8月月2日日76第第2.4节节 DSP C与汇编混合编程与汇编混合编程状态寄存器使用状态寄存器使用:单元名称假定值 修改ARP辅助寄存器指针1YesC进位标志-YesDP数据页-YesOV溢出标志-YesOVM溢出模式0NoPM乘积移位模式0NoSXM符号扩展模式-YesTC测试模式-YesDSP原理与应用原理与应用2024年年8月月2日日77

48、第第2.4节节 DSP C与汇编混合编程与汇编混合编程函数调用规则函数调用规则:TMS320C2x/C2xx/C5x运行环境对函数调用有严格运行环境对函数调用有严格的要求,要调用的要求,要调用C函数或要被函数或要被C程序调用的汇编语程序调用的汇编语言程序必须遵守这些规则,否则可能破坏言程序必须遵守这些规则,否则可能破坏C运行环运行环境,造成程序失败。境,造成程序失败。当进行函数调用时,调用者要将传递参数压入系统堆栈传当进行函数调用时,调用者要将传递参数压入系统堆栈传给被调用的函数,并将函数返回地址压栈。给被调用的函数,并将函数返回地址压栈。被调用的函数要在函数运行结束时将返回值放在累加器里被调

49、用的函数要在函数运行结束时将返回值放在累加器里返回给调用者函数。返回给调用者函数。函数参数及返回地址等都是通过堆栈传递的,要编函数参数及返回地址等都是通过堆栈传递的,要编写汇编函数,必须明确函数调用的过程中堆栈的写汇编函数,必须明确函数调用的过程中堆栈的变化和应该进行的处理变化和应该进行的处理DSP原理与应用原理与应用2024年年8月月2日日78函数调用过程中堆栈情况:函数调用过程中堆栈情况:DSP原理与应用原理与应用2024年年8月月2日日79第第2.4节节 DSP C与汇编混合编程与汇编混合编程C语言调用函数时的工作:语言调用函数时的工作:1.将参数反向压入堆栈(最右端的参数最先压栈,将参

50、数反向压入堆栈(最右端的参数最先压栈,最左端的参数最后压栈),这样,当函数被调用最左端的参数最后压栈),这样,当函数被调用时,最左端的参数会在堆栈的最顶部。时,最左端的参数会在堆栈的最顶部。2.使用被调用函数。使用被调用函数。3.被调用函数返回前处理各寄存器。被调用函数返回前处理各寄存器。4.当被调用函数运行结束时,调用者函数要将压入当被调用函数运行结束时,调用者函数要将压入堆栈的参数弹出以恢复堆栈状态。堆栈的参数弹出以恢复堆栈状态。注:如果用注:如果用C程序调用汇编语言程序,程序调用汇编语言程序,C编译器会自编译器会自动产生代码完成这些工作。动产生代码完成这些工作。DSP原理与应用原理与应用

51、2024年年8月月2日日80第第2.4节节 DSP C与汇编混合编程与汇编混合编程C语言函数被调用时的工作:语言函数被调用时的工作:1.将返回地址从硬件堆栈弹出,压入软件堆栈。将返回地址从硬件堆栈弹出,压入软件堆栈。2.将将FP(SP)压入软件堆栈。压入软件堆栈。3.分配局部帧分配局部帧(Frame)。4.如果函数中要修改如果函数中要修改AR6、AR7,将它们压入堆栈,其它寄存器不用进,将它们压入堆栈,其它寄存器不用进行保护就可以进行修改。行保护就可以进行修改。5.实现函数功能。实现函数功能。6.如果函数返回标量数据,将它放入累加器。如果函数返回标量数据,将它放入累加器。7.如果保护了如果保护

52、了AR6、AR7,恢复这两个寄存器。,恢复这两个寄存器。8.删除局部帧。删除局部帧。9.恢复恢复FP(SP)。10.将返回地址从软件堆栈中弹出,压入硬件堆栈。将返回地址从软件堆栈中弹出,压入硬件堆栈。11.返回。返回。DSP原理与应用原理与应用2024年年8月月2日日81第第2.4节节 DSP C与汇编混合编程与汇编混合编程POPD *+; 返回地址从硬堆栈中弹出,压入软堆栈返回地址从硬堆栈中弹出,压入软堆栈(由由AR1指示指示)SAR AR0,*+; AR0(FP)入软堆栈入软堆栈SAR AR1,*; AR1(SP)入软堆栈入软堆栈LARK AR0,SIZE ; FP=局部帧大小局部帧大小L

53、AR AR0,*0+ ; FP = SP, SP += SIZE: 分配局部帧分配局部帧SAR AR6,*+ ; 保存保存AR6SAR AR7,*+ ; 保存保存AR7.; 函数功能部分函数功能部分MAR *,AR1 ; 设置当前设置当前AR为为AR1MAR *-; LAR AR7,*-; 恢复恢复AR7LAR AR6,*-; 恢复恢复AR6SBRK SIZE+1 ; 释放局部帧释放局部帧(恢复恢复AR1(SP)LAR AR0,*-; 恢复恢复AR0(FP)PSHD *; 返回地址压入硬堆栈返回地址压入硬堆栈RET; 返回返回DSP原理与应用原理与应用2024年年8月月2日日82第第2.4节节

54、 DSP C与汇编混合编程与汇编混合编程一些特殊的情况:一些特殊的情况:返回一个结构:当函数的返回值为一个结构时,调用者负责返回一个结构:当函数的返回值为一个结构时,调用者负责分配存储空间,并将存储空间地址作为最后一个输入参数分配存储空间,并将存储空间地址作为最后一个输入参数传递给被调用函数。被调用函数将要返回的结构拷贝到这传递给被调用函数。被调用函数将要返回的结构拷贝到这个参数所指向的内存空间。个参数所指向的内存空间。不将返回地址移动到软件堆栈:当被调用函数不再调用其它不将返回地址移动到软件堆栈:当被调用函数不再调用其它函数,或者确定调用深度不会超过函数,或者确定调用深度不会超过8级,可以不

55、用将返回级,可以不用将返回地址移动到软件堆栈。地址移动到软件堆栈。不分配局部帧:如果函数没有输入参数,不使用局部变量,不分配局部帧:如果函数没有输入参数,不使用局部变量,就不需要修改就不需要修改XAR2(FP),因此也不需要对其进行保护。),因此也不需要对其进行保护。DSP原理与应用原理与应用2024年年8月月2日日83第第2.4节节 DSP C与汇编混合编程与汇编混合编程C与汇编混合:与汇编混合:C C程序调用汇编函数必须要满足前面介绍的调用规则程序调用汇编函数必须要满足前面介绍的调用规则和寄存器规则,和寄存器规则,C C程序可以访问汇编语言定义的变程序可以访问汇编语言定义的变量或调用汇编语

56、言函数,同样汇编语言也可以访量或调用汇编语言函数,同样汇编语言也可以访问问C C程序定义的变量或调用程序定义的变量或调用C C函数。用函数。用C C程序调用汇程序调用汇编函数有以下注意事项:编函数有以下注意事项:1.1.所有的函数(不论用所有的函数(不论用C C编写还是用汇编语言编写)都必须编写还是用汇编语言编写)都必须满足前面介绍的寄存器规则。满足前面介绍的寄存器规则。2.2.对于一些寄存器,如果函数要修改其内容,则必须事先对对于一些寄存器,如果函数要修改其内容,则必须事先对其进行保护。这些寄存器包括:其进行保护。这些寄存器包括:XAR2(FP)XAR2(FP),SPSP,AR6AR6,AR

57、7AR7。其它的寄存器可以不用保护自由使用。其它的寄存器可以不用保护自由使用。DSP原理与应用原理与应用2024年年8月月2日日84第第2.4节节 DSP C与汇编混合编程与汇编混合编程注意事项:注意事项:3.3.如果函数改变了状态寄存器某些有假定值的位,则必须在函数结束前如果函数改变了状态寄存器某些有假定值的位,则必须在函数结束前恢复其原有值。尤其要注意恢复其原有值。尤其要注意ARPARP必须为必须为AR1AR1。4.4.中断服务程序必须保护所有其用到的寄存器。中断服务程序必须保护所有其用到的寄存器。5.5.longlong型和型和floatfloat型变量在存储器中的存储方式为低有效位在低

58、端地址。型变量在存储器中的存储方式为低有效位在低端地址。6.6.函数返回值要通过累加器进行传递。函数返回值要通过累加器进行传递。7.7.编译器会在所有对象的名称前面加下横线编译器会在所有对象的名称前面加下横线“_ _”,因此汇编语言模块,因此汇编语言模块定义对象名称时也要以下横线为前缀,才能使定义的对象可以被定义对象名称时也要以下横线为前缀,才能使定义的对象可以被C C代代码访问。例如码访问。例如C C语言对象语言对象x x在汇编语言中就是在汇编语言中就是_x_x。汇编语言可以使用任。汇编语言可以使用任何不带下横线前缀的变量而不会和何不带下横线前缀的变量而不会和C C语言对象冲突。语言对象冲突

59、。8.8.任何汇编语言定义的对象,如果要被任何汇编语言定义的对象,如果要被C C程序访问,则必须用程序访问,则必须用.global.global修修饰。同样任何饰。同样任何C C语言定义的对象,如果要被汇编语言访问,也必须以语言定义的对象,如果要被汇编语言访问,也必须以.global.global修饰。修饰。9.9.C C和汇编互相调用函数时,需保证参数压栈和出栈的一致性。和汇编互相调用函数时,需保证参数压栈和出栈的一致性。DSP原理与应用原理与应用2024年年8月月2日日85第第2.4节节 DSP C与汇编混合编程与汇编混合编程DSP原理与应用原理与应用2024年年8月月2日日86第第2.4

60、节节 DSP C与汇编混合编程与汇编混合编程C C中访问汇编变量:通常有两种方式。中访问汇编变量:通常有两种方式。1.1.访问访问.bss.bss块中的变量:块中的变量:1)1)将要访问的变量定义在将要访问的变量定义在.bss.bss块中。块中。2)2)用用.golbal.golbal修饰要访问的变量。修饰要访问的变量。3)3)在汇编语言中以下横线在汇编语言中以下横线“_ _”为前缀声明要访问的变量。为前缀声明要访问的变量。4)4)在在C C语言中将变量声明为外部变量(语言中将变量声明为外部变量(externextern),就可以进),就可以进行正常访问。行正常访问。C:C:extern in

61、t var;extern int var; var = 1;var = 1;asm:asm:.bss _var,a1,a2.bss _var,a1,a2.global _var.global _varDSP原理与应用原理与应用2024年年8月月2日日87第第2.4节节 DSP C与汇编混合编程与汇编混合编程2.2.访问非访问非.bss.bss块中的变量:一般使用指针查表获得块中的变量:一般使用指针查表获得1)1)首先定义变量,而且最好放在独立的初始化块中。首先定义变量,而且最好放在独立的初始化块中。2)2)定义一个全局的标识指向对象的起始点,这样对象可定义一个全局的标识指向对象的起始点,这样对

62、象可以分配在存储器空间的任何位置。以分配在存储器空间的任何位置。3)3)在在C C程序中将这个对象定义为外部对象程序中将这个对象定义为外部对象(extern)(extern),并且,并且对象名称不带下横线对象名称不带下横线“_ _”前缀,就可以对其进行正常前缀,就可以对其进行正常访问。访问。C:C:extern float sine;extern float sine;f=sine2;f=sine2;asm:asm:.global _sine.global _sine_sine:_sine: .float 0.0.float 0.0.float 0.015987.float 0.015987.

63、float 0.022145.float 0.022145DSP原理与应用原理与应用2024年年8月月2日日88第第2.4节节 DSP C与汇编混合编程与汇编混合编程修改修改C C编译器输出的汇编程序编译器输出的汇编程序程序设计者可以检查和修改程序设计者可以检查和修改C C编译器输出的汇编语言编译器输出的汇编语言程序,然后再对其进行汇编编译和连接。程序,然后再对其进行汇编编译和连接。在在C C语言可以使用内嵌汇编语句在编译输出结果中添语言可以使用内嵌汇编语句在编译输出结果中添加注释,以改善编译器输出汇编程序的可读性。加注释,以改善编译器输出汇编程序的可读性。asm(asm(“;this wil

64、l start ADC;this will start ADC”););DSP原理与应用原理与应用2024年年8月月2日日89第第2.4节节 DSP C与汇编混合编程与汇编混合编程系统初始化系统初始化C C程序开始运行时,必须首先初始化程序开始运行时,必须首先初始化C C运行环境,这是通过运行环境,这是通过c_int00c_int00函数完成的,这个函数在运行支持库(函数完成的,这个函数在运行支持库(rts,rts,runtime-support libraryruntime-support library)中。连接器会将这个函数的入)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其

65、可以在初始化时被调用。口地址放置在复位中断向量处,使其可以在初始化时被调用。c_int00c_int00函数进行以下工作以建立函数进行以下工作以建立C C运行环境:运行环境: 为系统堆栈产生为系统堆栈产生.stack.stack块,并初始化堆栈指针。块,并初始化堆栈指针。 从从.cinit.cinit块将初始化数据拷贝到块将初始化数据拷贝到.bss.bss块中相应的变量。块中相应的变量。 调用调用mainmain函数,开始运行函数,开始运行C C程序。程序。用户可以对用户可以对c_int00c_int00函数进行修改,但修改后的函数必须完成函数进行修改,但修改后的函数必须完成以上任务。以上任务

66、。DSP原理与应用原理与应用2024年年8月月2日日90第第2.4节节 DSP C与汇编混合编程与汇编混合编程An Easy Way of Creating a C-callable An Easy Way of Creating a C-callable Assembly Function for the TMS320C28x Assembly Function for the TMS320C28x DSP(spra806)DSP(spra806)DSP原理与应用原理与应用2024年年8月月2日日91第二章第二章:DSP程序设计程序设计l第第2.1节节 概述概述l第第2.2节节 DSP汇编语

67、言概述及汇编程序设计汇编语言概述及汇编程序设计l第第2.3节节 DSP C语言程序设计语言程序设计l第第2.4节节 DSP C与汇编混合编程与汇编混合编程l第第2.5节节 DSP程序烧写程序烧写l习题习题DSP原理与应用原理与应用2024年年8月月2日日92第第2.5节节 DSP程序烧写程序烧写TMS320 FTMS320 F系列系列DSPDSP程序编写完成,调试无误后,程序编写完成,调试无误后,就可以将程序烧写到就可以将程序烧写到DSPDSP的的FLASHFLASH中,使中,使DSPDSP可以脱离仿真器独立运行。烧写可以脱离仿真器独立运行。烧写DSPDSP程序也程序也要通过仿真器来进行,仿真

68、器制造者会提要通过仿真器来进行,仿真器制造者会提供相应的烧写程序。要注意不同型号的供相应的烧写程序。要注意不同型号的DSPDSP往往使用不同的烧写程序,不同类型的仿往往使用不同的烧写程序,不同类型的仿真器对烧写环境也会有不同的要求,使用真器对烧写环境也会有不同的要求,使用前要详细阅读相应说明(前要详细阅读相应说明(readmereadme)。)。DSP原理与应用原理与应用2024年年8月月2日日93第第2.5节节 DSP程序烧写程序烧写DSP原理与应用原理与应用2024年年8月月2日日94第第2.5节节 DSP程序烧写程序烧写DSP原理与应用原理与应用2024年年8月月2日日95第第2.5节节

69、 DSP程序烧写程序烧写DSP原理与应用原理与应用2024年年8月月2日日96第第2.5节节 DSP程序烧写程序烧写DSP原理与应用原理与应用2024年年8月月2日日97第第2.5节节 DSP程序烧写程序烧写注意事项注意事项: :电路元件初始化同步问题:由于外部器件初始化可能较慢,电路元件初始化同步问题:由于外部器件初始化可能较慢,DSPDSP初始初始化完成后要等一会儿再访问外部慢速器件。化完成后要等一会儿再访问外部慢速器件。用仿真器执行速度比较慢,循环时间比较长,而烧写到用仿真器执行速度比较慢,循环时间比较长,而烧写到DSPDSP中可能时中可能时间比较短,要对决定循环时间的循环次数重新考虑。

70、间比较短,要对决定循环时间的循环次数重新考虑。用仿真器调试的时候,用仿真器调试的时候,DSPDSP运行的一些资源(如堆栈等)用的是仿真运行的一些资源(如堆栈等)用的是仿真器中的资源,烧写到器中的资源,烧写到DSPDSP中执行必须利用中执行必须利用DSPDSP本身的资源,烧写前必本身的资源,烧写前必须对须对.cmd.cmd文件中定义的各种资源进行详细考虑。文件中定义的各种资源进行详细考虑。连接仿真器的时候和不连接仿真器的时候电路板上负载状态不同,连接仿真器的时候和不连接仿真器的时候电路板上负载状态不同,可能改变板上某些信号的抖动情况,若有某部分功能模块工作不正可能改变板上某些信号的抖动情况,若有

71、某部分功能模块工作不正常,可能是由上述原因引起的干扰造成的。常,可能是由上述原因引起的干扰造成的。浮点数运算的问题:考虑用全局变量,因为局部变量都是在堆栈里浮点数运算的问题:考虑用全局变量,因为局部变量都是在堆栈里生成的,对堆栈要求太多。生成的,对堆栈要求太多。DSP原理与应用原理与应用2024年年8月月2日日98习题习题l1编写完整的程序,包括链接命令文件,实现从编写完整的程序,包括链接命令文件,实现从x1,x2,x3,x4中找出最大值。中找出最大值。l2编写完整的程序,包括链接命令文件,实现编写完整的程序,包括链接命令文件,实现y=a1*x1+a2*x2+a3*x3+a4*x4l3.编写完整的程序,驱动编写完整的程序,驱动IO端口端口A,循环输出,循环输出0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80DSP原理与应用原理与应用第二章第二章:DSP程序设计程序设计北京交通大学电气工程学院北京交通大学电气工程学院 夏明超夏明超

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号