80
实时数字信号处理技术 实时数字信号处理技术 C6000 C6000 软件开发( 软件开发( 3 3 代码产生工具和 代码产生工具和 C6000 C6000 程序结构 程序结构 北京理工大学电子工程系 北京理工大学电子工程系 李云杰 李云杰 O O 010 010 - - 68940716 68940716 [email protected] [email protected]

实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

  • Upload
    others

  • View
    30

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

实时数字信号处理技术实时数字信号处理技术C6000 C6000 软件开发(软件开发(33))

代码产生工具和代码产生工具和C6000C6000程序结构程序结构

北京理工大学电子工程系北京理工大学电子工程系 李云杰李云杰

((OO))[email protected]@bit.edu.cn

Page 2: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

学习目标学习目标

软件开发流程和开发工具软件开发流程和开发工具

C6000C6000程序基本结构程序基本结构

Page 3: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

代码产生工具代码产生工具

代码产生工具代码产生工具 ( Code Generation Tools )( Code Generation Tools )CC编译器编译器

汇编优化器汇编优化器

汇编器汇编器

连接器连接器

其它一些工具其它一些工具

Page 4: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC编译器编译器

CC编译器对符合编译器对符合ANSIANSI标准的标准的CC代码进行编译,代码进行编译,

产生产生C6000C6000汇编代码汇编代码, , 分为分为::

1.1. 语法分析器语法分析器

2.2. CC优化器优化器

3.3. 代码产生器代码产生器

Page 5: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

语法分析器(语法分析器(acp6x.exeacp6x.exe))

对对CC代码作预处理,语法检查代码作预处理,语法检查

对宏、文件包含、条件编译等进行处理对宏、文件包含、条件编译等进行处理

Page 6: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC优化器(优化器(opt6x.exeopt6x.exe))

包括针对包括针对CC代码的一般优化和针对代码的一般优化和针对C6000C6000的优化:的优化:

重新安排语句和表达式重新安排语句和表达式

把变量分配给寄存器把变量分配给寄存器

打开循环打开循环……CC优化器 重要的优化处理-优化器 重要的优化处理-软件流水软件流水

具有四个优化级别具有四个优化级别

优化选项优化选项 作用作用 优化级别优化级别

--o0o0 优化寄存器的使用优化寄存器的使用

--o1o1 本地优化本地优化

--o2o2或或--oo 全局优化全局优化

--o3o3 文件级优化文件级优化

低低

高高

Page 7: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC优化器和代码产生器(优化器和代码产生器(cg6x.execg6x.exe))

CC代码产生器也可以完成一些优化工作代码产生器也可以完成一些优化工作

--pmpm默认情况:对每个默认情况:对每个CC文件进行优化文件进行优化

把一个程序所有的把一个程序所有的CC文件合成一个模块进文件合成一个模块进行优化处理行优化处理

效率可达汇编语言代码的效率可达汇编语言代码的 70%~80%70%~80%

Page 8: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编优化器汇编优化器

对线性汇编代码(对线性汇编代码(..sasa文件)进行优化文件)进行优化

输入:用户编写的线性汇编代码输入:用户编写的线性汇编代码

输出:标准汇编代码输出:标准汇编代码..asmasm文件文件

性能分析工具的应用(性能分析工具的应用(profilerprofiler))特点:不需考虑特点:不需考虑

并行指令安排并行指令安排

指令延迟指令延迟

寄存器使用寄存器使用

效率可达汇编语言代码的效率可达汇编语言代码的 95%~100%95%~100%

Page 9: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编器汇编器

产生可重新分配地址的机器语言目标文件产生可重新分配地址的机器语言目标文件

输入:输入:

CC编译器产生的汇编文件编译器产生的汇编文件

汇编优化器输出的汇编文件汇编优化器输出的汇编文件

文档管理器管理的宏库内的宏文档管理器管理的宏库内的宏

输出:输出:

目标代码是目标代码是TITI的的COFFCOFF格式格式

汇编代码内除机器指令外,还有汇编伪指令汇编代码内除机器指令外,还有汇编伪指令

((assemble directiveassemble directive))

Page 10: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

连接器连接器

根据用户说明的程序和数据存放地址,根据用户说明的程序和数据存放地址,把汇编器产生的浮动地址代码和数据映把汇编器产生的浮动地址代码和数据映射到用户系统的实际地址空间射到用户系统的实际地址空间..

输入:可重新分配地址的目标文件输入:可重新分配地址的目标文件( .( .objobj ))输出:可执行的目标文件输出:可执行的目标文件( .out )( .out )

连接命令文件连接命令文件 ((CMDCMD))

Page 11: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

其它工具以及其它工具以及CC运行库运行库

文档管理器文档管理器 ((ArchiverArchiver))建库工具建库工具 ((LibraryLibrary--build Utilitybuild Utility))十六进制转换工具十六进制转换工具 ((Hex Conversion UtilityHex Conversion Utility))交叉引用列表工具交叉引用列表工具 ((CrossCross--reference Listerreference Lister))CC运行支持库运行支持库 ((RunRun--time Support Librarytime Support Library))

CC头文件(头文件(.h.h)和库文件)和库文件rtsxxx.librtsxxx.lib支持浮点函数、汇编指令函数支持浮点函数、汇编指令函数((intrinsicsintrinsics) ) 支持访问主机操作系统的支持访问主机操作系统的C I/OC I/O函数函数

Page 12: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC编译器编译器

汇编器汇编器

连接器连接器

汇编优化器汇编优化器

Page 13: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

文档管理器文档管理器

建库工具建库工具

1616进制转换工具进制转换工具

交叉引用列表工具交叉引用列表工具

Page 14: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

DSPsDSPs程序的仿真模式程序的仿真模式

仿真模式仿真模式 优点优点 缺点缺点

软件仿真软件仿真

simulatorsimulator

主机上的仿真软主机上的仿真软件进行模拟,无需件进行模拟,无需目标板目标板

速度慢;速度慢;

无法仿真某无法仿真某些外设的功能些外设的功能

硬件仿真硬件仿真

emulatoremulator

速度快速度快

仿真结果与系统实仿真结果与系统实际一致际一致

仿真程序下仿真程序下载到载到DSPDSP芯片芯片内运行,需要内运行,需要目标板目标板

Page 15: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C6000C6000程序基本结构程序基本结构

CC程序的基本结构程序的基本结构

汇编代码结构汇编代码结构

线性汇编语言结构线性汇编语言结构

CC程序和汇编代码的接口实现程序和汇编代码的接口实现

Page 16: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序的基本结构程序的基本结构

1.1. 主程序主程序 main.cmain.c2.2. 连接命令文件连接命令文件..cmdcmd

\\c6000c6000\\cgtoolscgtools\\liblib\\lnk.cmdlnk.cmd

3.3. CC运行库文件运行库文件rtsxxxx.librtsxxxx.lib\\c6000c6000\\cgtoolscgtools\\liblib

Page 17: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序的基本结构程序的基本结构

若从若从EPROMEPROM中加载要运行的程序中加载要运行的程序还需要还需要Vectors.asmVectors.asm

ISTIST(中断服务表)(中断服务表)

被连接分配到被连接分配到00地址地址

CC运行环境入口点:运行环境入口点:_c_int00_c_int00rtsxxx.librtsxxx.lib

Page 18: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序的基本结构程序的基本结构

CCSCCS带有一个函数库带有一个函数库 dev6x.libdev6x.lib其中包含有中断向量表,其中包含有中断向量表,

无需程序员写无需程序员写vectors.asmvectors.asm中断中断 ““挂挂”” 接也很方便接也很方便

针对针对C6000C6000的外设预定义了大量的外设的外设预定义了大量的外设地址和宏定义地址和宏定义

regs.hregs.h 中有中有GET_BIT() GET_BIT() ,, SET_BIT()SET_BIT(),,GET_FIELD()GET_FIELD()可以方便的对寄存器进行位可以方便的对寄存器进行位操作操作..几乎所有外设寄存器的地址都已经定义几乎所有外设寄存器的地址都已经定义

Page 19: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序的基本结构程序的基本结构

使用使用devlibdevlib实现中断实现中断““挂挂””接接PreprocesserPreprocesser 中头文件搜索路径设置为中头文件搜索路径设置为::....\\c6000c6000\\evm6xevm6x\\dspdsp\\includeinclude将将dev6x.libdev6x.lib文件加入项目文件加入项目

....\\c6000c6000\\evm6xevm6x\\dspdsp\\liblib在在..cmdcmd文件中,将文件中,将..vecvec段分配在段分配在00地址地址

在主程序中使用在主程序中使用#include <#include <intr.hintr.h>>包含头文件包含头文件

在在main()main()中调用中调用intr_resetintr_reset()()函数函数

调用调用intr_hookintr_hook()()等函数等函数

Page 20: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

#include <intr.h>interrupt void func_int4( );

void main ( ){ intr_reset( ); /* 初始化中断向量表 */ intr_hook( func_int4, CPU_INT4 ); /* “挂 ”中断 */ INTR_ENABLE( CPU_INT_NMI ); /* 使能 NMI中断 */ INTR_GLOBAL_ENABLE( ); /* 使能全局中断 */ .....}

interrupt void func_int4 ( ) /* 中断服务程序 */{ ....}

Page 21: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C6000C6000编译器的编译器的CC环境实现环境实现

定义定义: : C runC run--time environmenttime environment

The run time parameters in which your The run time parameters in which your program must function. program must function. These parameters are defined by These parameters are defined by 1.1. 存储器规范存储器规范

2.2. 寄存器规范寄存器规范

3.3. 堆栈规范堆栈规范

4.4. 函数调用规范函数调用规范

5.5. 系统初始化系统初始化

Page 22: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

存储器模型存储器模型

C6000C6000编译器把整个存储区当作单个线编译器把整个存储区当作单个线性存储块,并将它分为代码区和数据区性存储块,并将它分为代码区和数据区

编译器假定目标存储器的全部编译器假定目标存储器的全部3232--bitbit地地址空间是可用的。址空间是可用的。

定义存储器映象并将代码和数据分配到定义存储器映象并将代码和数据分配到目标存储器的是目标存储器的是连接器连接器,而非编译器。,而非编译器。

CmdCmd文件是文件是linkerlinker使用的。使用的。

Page 23: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C6000C6000的存储器映射的存储器映射

程序和数据的存放不是随意的程序和数据的存放不是随意的

C6000C6000存储器地址映射存储器地址映射

( Memory Map )( Memory Map )

决定着各种资源的访问地址决定着各种资源的访问地址

Page 24: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 25: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

MAP MAP 文件文件

--mm选项选项 连接器输出存储器映象文件连接器输出存储器映象文件(.map)(.map)详细说明存储器的使用情况详细说明存储器的使用情况

主要包括三个部分:主要包括三个部分:1.1. 存储器配置存储器配置

2.2. 段分配图段分配图

3.3. 全局符号(全局变量、函数和段名)绝对地址全局符号(全局变量、函数和段名)绝对地址

Page 26: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 27: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

COFFCOFF文件格式文件格式

模块化的目标文件模块化的目标文件 ---- COFFCOFF格式格式

基本组成形式基本组成形式 ---- 段段((sectionssections))编译器生成的可重定位的代码和数据块编译器生成的可重定位的代码和数据块

初始化的段和未初始化段:初始化的段和未初始化段:

已初始化段--包含数据和可执行代码已初始化段--包含数据和可执行代码

未初始化段--存储器(一般指未初始化段--存储器(一般指RAMRAM))中中的保留空间的保留空间, , 程序在运行时用它来创建和存程序在运行时用它来创建和存储变量储变量..

Page 28: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

已初始化段已初始化段

1.1. ..cinitcinit段:段:

包括变量初始值和常量值包括变量初始值和常量值..

2.2. ..constconst段:段:

包括字符串文字(包括字符串文字(string literalsstring literals),),浮点常浮点常量和在量和在C/C++C/C++中被声明为中被声明为constconst的数据(如果的数据(如果常量没有同时被声明为常量没有同时被声明为volatilevolatile))..

3.3. .switch.switch段:段:

包含大的包含大的switchswitch语句的跳转表(语句的跳转表(jump tablejump table))

4.4. .text.text段:段:

包含所有的可执行代码包含所有的可执行代码..

Page 29: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

未初始化段未初始化段

1.1. ..bssbss段:段:

为全局变量和静态变量保留。如果为连为全局变量和静态变量保留。如果为连接器设定接器设定--cc选项,则在程序的开始,选项,则在程序的开始,CC引引导程序会将导程序会将..cinitcinit段的数据(可在段的数据(可在ROMROM中中)复制到)复制到..bssbss段。段。

2.2. ..farfar段:段:为声明为为声明为farfar的全局变量和静态变量保留。的全局变量和静态变量保留。

3.3. ..stackstack段:段:用于传递函数的参数和为局部变量分配存用于传递函数的参数和为局部变量分配存储器空间。储器空间。

4.4. ..sysmemsysmem段:段:提请动态存储空间分配要求的有提请动态存储空间分配要求的有mallocmalloc,,calloccalloc和和reallocrealloc等函数。等函数。

Page 30: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC编译器产生的代码段和数据段编译器产生的代码段和数据段

段类型段类型 段名段名 说明说明.text.text 代码代码..cinitcinit 变量初值表变量初值表.const.const 常量和字符串常量和字符串

.switch.switch 用于大型用于大型switchswitch语句的跳转表语句的跳转表..bssbss 全局变量和静态变量全局变量和静态变量

..sysmemsysmem 全局堆全局堆((用于存储器分配函数用于存储器分配函数)).stack.stack 堆栈堆栈.far.far 以以farfar声明的全局声明的全局//静态变量静态变量..ciocio 用于用于stdiostdio函数函数

非初始化段非初始化段

初始化段初始化段

CC编译器产生的默认代码段和数据编译器产生的默认代码段和数据

Page 31: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC编译器产生的代码段和数据段编译器产生的代码段和数据段

几点补充几点补充

汇编器产生默认的汇编器产生默认的..texttext,,.bss.bss和和..datadata段。允许用段。允许用

##pragmapragma CODE_SECTIONCODE_SECTION和和DATA_SECTIONDATA_SECTION 来来说明其它用户自定义的代码段和数据段说明其它用户自定义的代码段和数据段

##pragmapragma DATA_SECTION(GlobalBufDATA_SECTION(GlobalBuf, , ““sect_sbsect_sb””))##pragmapragma CODE_SECTION(Func1, CODE_SECTION(Func1, ““sect_sbsect_sb””))

除了除了..texttext段,各个初始化段和非初始化段均不能段,各个初始化段和非初始化段均不能分配到内部程序存储器。分配到内部程序存储器。

Page 32: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

系统堆栈系统堆栈

编译器将堆栈用于:编译器将堆栈用于:

(1)(1)保存函数调用后的返回地址;保存函数调用后的返回地址;

(2)(2)给局部变量分配存储空间给局部变量分配存储空间

(3)(3)传递函数参数传递函数参数

(4)(4)保存临时结果保存临时结果

运行时堆栈增长方向是从高向低,编译运行时堆栈增长方向是从高向低,编译器用器用B15B15寄存器来管理堆栈,即将它作寄存器来管理堆栈,即将它作为堆栈指针(为堆栈指针(SPSP),),指向堆栈中下一个指向堆栈中下一个空闲的存储器位置。空闲的存储器位置。

Page 33: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

初始化变量初始化变量

C/C++C/C++编译器生成的代码可固化到编译器生成的代码可固化到ROMROM中,中,..cinitcinit段的初始化表也是贮存在段的初始化表也是贮存在ROMROM中。在系统初始化的时候,中。在系统初始化的时候,C/C++C/C++引导程序将表中的数据(引导程序将表中的数据(ROMROM中)拷中)拷贝给贝给..bssbss段中对应的变量(段中对应的变量(RAMRAM中)中)

运行时初始化运行时初始化

加载时初始化加载时初始化

Page 34: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

初始化变量初始化变量 -运行时初始化-运行时初始化

RunRun--time time AutoinitializationAutoinitialization

--cc选项选项

CC初始化函数初始化函数c_int00( )c_int00( )会读取会读取..cinitcinit段中的每一个记录信息,分别初始化段中的每一个记录信息,分别初始化..bssbss段中的全局段中的全局//静态变量。静态变量。

Page 35: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

初始化变量初始化变量 -加载时初始化-加载时初始化

LoadLoad--time Initializationtime Initialization

--crcr 选项选项

全局全局//静态变量的初始化工作由静态变量的初始化工作由loaderloader程序完成程序完成,,在加载程序后,在加载程序后,loaderloader自己自己读取读取..cinitcinit段的内容,初始化段的内容,初始化..bssbss段中段中数据数据

Page 36: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

存储器模式存储器模式 ( Memory Model )( Memory Model )

小存储器模式和大存储器模式。区别在小存储器模式和大存储器模式。区别在于为于为..bssbss段分配存储空间方式。段分配存储空间方式。

小存储器模式小存储器模式::

.bss 32KByte.bss 32KByte,,使用使用DP(B14)DP(B14)访问全局数据访问全局数据

直接寻址直接寻址

大存储器模式大存储器模式::

不限制不限制..bssbss段的大小段的大小

寄存器间接寻址寄存器间接寻址

访问访问数据使用数据使用MVKL & MVKHMVKL & MVKH

MVKL _x, A0MVKL _x, A0MVKH _x, A0MVKH _x, A0LDW *A0, B0LDW *A0, B0

LDW *+DP(0x7),B5LDW *+DP(0x7),B5

Page 37: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

存储器模式存储器模式

如果定义的全局如果定义的全局//静态变量超过了静态变量超过了32KB,32KB,仍然仍然希望使用小模式获得较快的访问速度,怎么希望使用小模式获得较快的访问速度,怎么办?办?

方法方法11:使用:使用farfar关键字关键字

方法方法22:使用:使用--ml0ml0编译选项编译选项

Page 38: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

far far 关键字关键字

针对大的数组定义针对大的数组定义

分配到分配到.far.far段,而非段,而非..bssbss段段访问方式特殊访问方式特殊(DMA/(DMA/软件流水软件流水))

Page 39: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

使用编译选项使用编译选项

使用使用--ml0ml0编译选项,编译器会自动对集编译选项,编译器会自动对集合数据类型使用间接寻址方式合数据类型使用间接寻址方式

\\ Project Project \\ Options Options \\ Compiler Compiler \\ AdvancedAdvanced

--ml / ml / --ml0 ml0 集合数据类型是集合数据类型是farfar存取存取

--ml1 ml1 函数调用是函数调用是farfar调用调用

--ml2 ml2 函数调用是函数调用是farfar调用调用,,集合数据类型是集合数据类型是farfar存取存取

--ml3 ml3 函数调用是函数调用是farfar调用调用,,所有数据是所有数据是farfar存存取取

Page 40: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

Volatile Volatile 关键字关键字

编译器会尽量避免对存储器的访问编译器会尽量避免对存储器的访问

**ctrlctrl表明看来不变化,所以表明看来不变化,所以looploop会被优会被优化为单次存储器访问化为单次存储器访问

VVolatileolatile关键字定义的变量,不会因为关键字定义的变量,不会因为优化简化对该变量的任何访问优化简化对该变量的任何访问

Page 41: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

VolatileVolatile关键字关键字

编程中常用编程中常用VolatileVolatile声明一些全局变量声明一些全局变量

原则:原则:

凡是凡是22个线程共享的全局变量需要使用;个线程共享的全局变量需要使用;

凡是某个内存地址的内容随时可能被外部凡是某个内存地址的内容随时可能被外部

硬件改变,例如硬件改变,例如C6000C6000芯片内部的外设寄芯片内部的外设寄

存器或某个随时可能改变的外部硬件中的存器或某个随时可能改变的外部硬件中的

寄存器。寄存器。

Page 42: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

寄存器使用规范寄存器使用规范

在在C/C++C/C++环境下,一些具体的操作要使环境下,一些具体的操作要使用哪些的寄存器来完成,是有严格的规用哪些的寄存器来完成,是有严格的规范的。范的。

寄存器使用规范规定了编译器使用寄存寄存器使用规范规定了编译器使用寄存器的方法以及函数调用过程中数值保存器的方法以及函数调用过程中数值保存的方法。的方法。

要在要在C/C++C/C++程序中嵌入汇编语言,必须程序中嵌入汇编语言,必须理解并遵循寄存器使用规范。理解并遵循寄存器使用规范。

Page 43: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 44: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

函数调用约定函数调用约定

函数(父函数)在调用另一个函数(子函数)函数(父函数)在调用另一个函数(子函数)的时候执行下列操作的时候执行下列操作

1.1. 将传递到子函数的参数放入寄存器或堆栈将传递到子函数的参数放入寄存器或堆栈..

2.2. 如果需要如果需要,,保存寄存器保存寄存器(A0(A0~~A9/B0 A9/B0 ~~B9)B9)到堆栈到堆栈..

for C6400for C6400,还包括,还包括A16 A16 ~~ A31 /B16 A31 /B16 ~~ B31B31

1.1. 调用者调用者((父函数父函数))调用函数调用函数((子函数子函数). ).

2.2. ((对非对非C/C++C/C++代码代码))当返回时当返回时,,调用者收回调用者收回(reclaim)(reclaim)被调用者使用的堆栈空间被调用者使用的堆栈空间..

Page 45: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

函数调用(子函数)函数调用(子函数)

1.1. 被调函数(子函数)为所有的局部的变量、被调函数(子函数)为所有的局部的变量、临时存储区和它调用的函数的参数分配足够临时存储区和它调用的函数的参数分配足够的堆栈空间。的堆栈空间。

2.2. 如果被调函数还继续调用其他的函数,返回如果被调函数还继续调用其他的函数,返回地址必须保存在堆栈中。地址必须保存在堆栈中。

3.3. 如果被调函数修改寄存器如果被调函数修改寄存器A10A10到到A15A15或者或者B10B10到到B15B15的值,必须将它们保存。的值,必须将它们保存。

4.4. 被调函数执行其代码。被调函数执行其代码。

5.5. 存放返回值在存放返回值在A5:A4A5:A4中。中。

6.6. 恢复恢复33中保留的寄存器值中保留的寄存器值

7.7. 释放释放11分配的堆栈分配的堆栈

8.8. 利用利用B3,B3,跳转返回父函数跳转返回父函数

Page 46: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

系统初始化系统初始化

运行一个运行一个C/C++C/C++程序之前,必须建立程序之前,必须建立C/C++C/C++运行环境。这个工作是由运行环境。这个工作是由C/C++C/C++引导程序调用引导程序调用c_int00c_int00函数完成的函数完成的。。

系统运行开始时,跳转到或调用系统运行开始时,跳转到或调用c_int00c_int00函数,但通常是函数,但通常是硬件复位中断硬件复位中断的中断服务程序调用它的。的中断服务程序调用它的。

Page 47: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

系统初始化系统初始化

1.1. 定义系统堆栈定义系统堆栈..stackstack段并初始化堆栈指段并初始化堆栈指

针针

2.2. 定义定义..bssbss并初始化并初始化DPDP指针指针

3.3. 初始化全局的变量,这是通过将初始化全局的变量,这是通过将 ..cinitcinit段中的初始化表复制给段中的初始化表复制给..bssbss段中为变量段中为变量

分配的存储空间来完成的。如果是在加分配的存储空间来完成的。如果是在加载时初始化变量(载时初始化变量(––crcr选项),加载器选项),加载器((loaderloader))在程序运行之前就完成了这在程序运行之前就完成了这

个步骤(它不是通过引导程序执行的)个步骤(它不是通过引导程序执行的)

4.4. 调用调用mainmain函数来运行函数来运行C/C++C/C++程序程序

Page 48: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C_int_00C_int_00源码源码 11extern void __interrupt c_int00()extern void __interrupt c_int00()

{{

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

/* SET UP THE STACK POINTER IN B15. /* SET UP THE STACK POINTER IN B15. */*/

/* THE STACK POINTER POINTS 1 WORD PAST THE TOP OF THE STACK,/* THE STACK POINTER POINTS 1 WORD PAST THE TOP OF THE STACK, SO SUBTRACT */SO SUBTRACT */

/* 1 WORD FROM THE SIZE. /* 1 WORD FROM THE SIZE. */*/

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

____asmasm(" (" mvklmvkl __stack,SP");__stack,SP");

____asmasm(" (" mvkhmvkh __stack,SP");__stack,SP");

____asmasm(" (" mvklmvkl __STACK_SIZE __STACK_SIZE -- 4,B0");4,B0");

____asmasm(" (" mvkhmvkh __STACK_SIZE __STACK_SIZE -- 4,B0");4,B0");

____asmasm(" add B0,SP,SP");(" add B0,SP,SP");

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

/* THE SP MUST BE ALIGNED ON AN 8/* THE SP MUST BE ALIGNED ON AN 8--BYTE BOUNDARY. */BYTE BOUNDARY. */

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

____asmasm(" and ~7,SP,SP"); (" and ~7,SP,SP");

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

/* SET UP THE GLOBAL PAGE POINTER IN B14. /* SET UP THE GLOBAL PAGE POINTER IN B14. */*/

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

____asmasm(" .global $(" .global $bssbss");");

____asmasm(" (" mvklmvkl $$bss,DPbss,DP");");

____asmasm(" (" mvkhmvkh $$bss,DPbss,DP");");

Page 49: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C_int_00C_int_00源码源码 22/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*//* /* SET UP FLOATING POINT REGISTERS FOR C70 SET UP FLOATING POINT REGISTERS FOR C70

ONLY */ONLY *//*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/

##ifdefifdef _TMS320C6700_TMS320C6700____asmasm(" (" mvkmvk 0,B3"); /* round to nearest */0,B3"); /* round to nearest */____asmasm(" (" mvcmvc B3,FADCR");B3,FADCR");____asmasm(" (" mvcmvc B3,FMCR");B3,FMCR");

##endifendif

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*//* GET THE POINTER TO THE AUTOINITIALIZATION /* GET THE POINTER TO THE AUTOINITIALIZATION

TABLES INTO THE FIRSTTABLES INTO THE FIRST */*//* ARGUMENT REGISTER (A4)/* ARGUMENT REGISTER (A4)

*/*//*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/____asmasm(" .global (" .global cinitcinit");");____asmasm(" (" mvklmvkl cinit,A4");cinit,A4");____asmasm(" (" mvkhmvkh cinit,A4");cinit,A4");

/*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*//* PASS THE CURRENT DP TO THE /* PASS THE CURRENT DP TO THE

AUTOINITIALIZATION ROUTINE. */AUTOINITIALIZATION ROUTINE. *//*/*------------------------------------------------------------------------------------------------------------------------------------------------*/*/____asmasm(" (" mvmv DP,B4");DP,B4");

/*------------------------------------------------------------------------*/

/* CALL THE AUTOINITIALIZATION ROUTINE. */

/*------------------------------------------------------------------------*/

__asm(" .global __auto_init");__asm(" mvkl $aiRL,B3");__asm(" mvkh $aiRL,B3");__asm(" mvkl __auto_init, B0");__asm(" mvkh __auto_init, B0");__asm(" b B0"); /* far call */__asm(" NOP 5");__asm("$aiRL:");

/*------------------------------------------------------------------------*/

/* CALL THE USER'S PROGRAM. */

/*------------------------------------------------------------------------*/

main();

/*------------------------------------------------------------------------*/

/* CALL EXIT. *//*-------------------------------------------------------------

-----------*/exit(1);

}

Page 50: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构

C6000C6000任意一行汇编代码可能包括任意一行汇编代码可能包括77项项::

①① 标号标号 (label)(label)②② 并行符号并行符号 (||)(||)③③ 条件条件 ([ register])([ register])④④ 指令指令 (mnemonic)(mnemonic)⑤⑤ 功能单元功能单元 (unit (unit specifierspecifier))⑥⑥ 操作数操作数 (operand list)(operand list)⑦⑦ 注释注释 (;comment)(;comment)

x .int 10MPY .M1 A1, A3, A7

|| ADD .L1x A2, B2, A5

Page 51: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构 标号标号

并行指令不能使用标号并行指令不能使用标号

要使用标号,必须放在第一列要使用标号,必须放在第一列

Page 52: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构 指令指令

指令:包括指令:包括命令助记符命令助记符和和伪指令伪指令

命令助记符:命令助记符:

有效微处理器命令,执行程序操作有效微处理器命令,执行程序操作

伪指令:伪指令:

汇编语言中控制汇编过程和定义数据结构,所有伪指汇编语言中控制汇编过程和定义数据结构,所有伪指令以圆点打头令以圆点打头

Page 53: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构 功能单元功能单元

圆点开始圆点开始

可选方式可选方式 3 3 种:种:

指定具体使用的功能单元指定具体使用的功能单元

((.D1.D1))可指定功能单元类型,汇编器安排具体单元可指定功能单元类型,汇编器安排具体单元

(.M) (.M) (.M2)(.M2)不指出功能单元,汇编器根据助记符安排不指出功能单元,汇编器根据助记符安排

Page 54: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构 操作数操作数

操作数直接用逗号隔开操作数直接用逗号隔开

操作数类型操作数类型 3 3 种种寄存器操作数寄存器操作数

常数操作数常数操作数

指针操作数指针操作数((只有数据加载和保存指令会用到指针操作数只有数据加载和保存指令会用到指针操作数))

Page 55: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

汇编代码结构汇编代码结构 注释注释

使用分号(使用分号(;;)时)时, , 注释可以在任何一列开始注释可以在任何一列开始

使用星号(使用星号(**)时)时, , 注释必须从第一列开始注释必须从第一列开始

不是必须,但是建议使用不是必须,但是建议使用

Page 56: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

一个汇编程序结构举例一个汇编程序结构举例

程序程序 == 数据结构数据结构 ++ 算法算法

数据结构

算法

C程序的数据结构和算法实现

Page 57: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

一个汇编程序结构举例一个汇编程序结构举例

用汇编语言声明数据结构

Page 58: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

一个汇编程序结构举例一个汇编程序结构举例

用汇编语言编写算法

Page 59: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

一个汇编程序结构举例一个汇编程序结构举例

.sect “myData”m .int 5x .int 10b .int 2y .int 0

.sect “myCode”start LD .D1 *A0,A1

.

.

.ST .D1 A7,*A6

end B endNOP 5

Page 60: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

100%100% HighHighASMASM Hand Hand OptimisedOptimised

编程方法比较编程方法比较

源文件源文件 效率效率** 工作量工作量

80 80 -- 100%100%CCC ++C ++ LowLowOptimisingOptimising

CompilerCompiler

95 95 -- 100%100%LinearLinearASMASM MedMedAssembly Assembly

OptimiserOptimiser

Page 61: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

线性汇编程序线性汇编程序

类似与手工汇编类似与手工汇编,,但不是一种编程语言但不是一种编程语言

它的特点它的特点::不需要使用不需要使用NOPsNOPs填充延迟间隙填充延迟间隙..不需指定功能单元不需指定功能单元..代码并行自动完成代码并行自动完成..允许标识符代替寄存器允许标识符代替寄存器..

ZEROZERO sumsumlooploop LDHLDH *p_to_a, a*p_to_a, a

LDHLDH *p_to_b, b*p_to_b, bMPYMPY a, b, proda, b, prodADDADD sum, prod, sumsum, prod, sumSUBSUB B0, 1, B0B0, 1, B0B B looploop

Page 62: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

编写线性汇编代码编写线性汇编代码

在编写线性汇编代码前,需要知道的:在编写线性汇编代码前,需要知道的:汇编优化器伪指令汇编优化器伪指令(Assembly optimizer directives)(Assembly optimizer directives)影响汇编优化器动作的选项影响汇编优化器动作的选项

TMS320C6000TMS320C6000指令指令

线性汇编源码的代码语法(线性汇编源码的代码语法(statement syntax)statement syntax)指定功能单元指定功能单元

程序注释(程序注释(commentscomments))

Page 63: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 64: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

编写线性汇编代码编写线性汇编代码

文件扩展名文件扩展名::““..sasa””..

编写过程--用到汇编伪指令编写过程--用到汇编伪指令

__sa_Functionsa_Function ..cproccproc

ZEROZERO sumsum

looploop LDHLDH *pm++, m*pm++, mLDHLDH **pnpn++, n++, nMPYMPY m, n, prodm, n, prodADDADD sum, prod, sumsum, prod, sum

[count][count] SUBSUB count, 1, countcount, 1, countB B looploop

.return sum.return sum

..endprocendproc

..cproccproc 表示代码开始表示代码开始

.return .return 给出返回值给出返回值

NO NO NOPsNOPs requiredrequiredNO parallel instructions requiredNO parallel instructions requiredNO functional units specifiedNO functional units specifiedNO registers requiredNO registers required

..endprocendproc 表示代码结束表示代码结束

Page 65: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

函数调用的参数传递和返回函数调用的参数传递和返回

““pmpm”” and and ““pnpn”” 是是CC代码中定义的两个指针代码中定义的两个指针,可用来完成对线性汇编代码的调用,可用来完成对线性汇编代码的调用..CC代码中调用线性汇编编写的点积程序代码中调用线性汇编编写的点积程序::

intint yy = = dotpdotp (short* (short* aa, short* , short* xx, , intint countcount))

线性汇编代码利用线性汇编代码利用 ..cproccproc来接收传来参数来接收传来参数::

__dotpdotp ..cproccproc pmpm, , pnpn, , countcount.......return .return yy..endprocendproc

Page 66: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

变量声明变量声明

除了传入的参数,其它的变量可以如下进除了传入的参数,其它的变量可以如下进行声明行声明::

..regreg pm, pm, pnpn, m, n, prod, sum, m, n, prod, sum

汇编优化器完成将这些值分配给寄存器的汇编优化器完成将这些值分配给寄存器的工作工作..

Page 67: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

一个完整的线性汇编代码举例一个完整的线性汇编代码举例

线性汇编代码会自动返回,不需要跳转指令线性汇编代码会自动返回,不需要跳转指令

__dotpdotp ..cproccproc pm, pm, pnpn, count, count..regreg m, n, prod, summ, n, prod, sum

ZEROZERO sumsum

looploop LDHLDH *pm++, m*pm++, mLDHLDH **pnpn++, n++, nMPYMPY m, n, prodm, n, prodADDADD sum, prod, sumsum, prod, sum

[count][count] SUBSUB count, 1, countcount, 1, countB B looploop

.return sum.return sum

..endprocendproc

Page 68: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序和汇编语言接口程序和汇编语言接口

使用独立的汇编代码模块,并将其与编使用独立的汇编代码模块,并将其与编译完的译完的C/C++C/C++模块连接在一起模块连接在一起

在在C/C++C/C++源程序中内联函数源程序中内联函数((intrinsicsintrinsics),),直接地调用汇编语句直接地调用汇编语句

使用内联(使用内联(inlineinline)) 汇编语言直接嵌入汇编语言直接嵌入C/C++C/C++源程序源程序

在在C/C++C/C++源程序中使用汇编程序变量和源程序中使用汇编程序变量和常量常量

Page 69: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC代码中调用汇编函数代码中调用汇编函数

C and assembly functions C and assembly functions 使用同样的资源使用同样的资源 (e.g. (e.g. registers).registers).

C and assembly functions C and assembly functions 可以交换数据可以交换数据..

所以,关于数据和控制信息的交换及寄存器的共享有所以,关于数据和控制信息的交换及寄存器的共享有着相应的规则着相应的规则..

main ()main ()

{{

y = y = asmFunctionasmFunction (a, b);(a, b);

}}

__asmFunctionasmFunction

bb b3b3

Page 70: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC代码中调用汇编函数代码中调用汇编函数

汇编代码中使用汇编代码中使用““__”” 来标识在来标识在CC中声中声明的变量和函数明的变量和函数..

Labels Labels 需要声明为需要声明为global.global.

main_c.cmain_c.c

intint asm_Functionasm_Function (short, short);(short, short);

short x = 0x4000, y = 0x2000;short x = 0x4000, y = 0x2000;intint z;z;

void main (void)void main (void){{

z = z = asm_Functionasm_Function (x, y);(x, y);}}

asm_Function.casm_Function.c

intint asm_Functionasm_Function (short a, short b)(short a, short b){{

intint y;y;y = (a * b) << 1;y = (a * b) << 1;return y;return y;

}}

asm_Function.asmasm_Function.asm

.global _.global _asm_Functionasm_Function

Page 71: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序和汇编程序中的参数传递程序和汇编程序中的参数传递

CC程序中调用汇编程序中调用汇编函数需要用到这些函数需要用到这些寄存器以传递参数寄存器以传递参数和返回结果和返回结果..

AA BB

arg1/arg1/r_valr_val

arg3arg3

arg5arg5

arg7arg7

arg9arg9

ret addrret addrarg2arg2

arg4arg4

arg6arg6

arg8arg8

arg10arg10

112233445566778899101011111212131314141515

00

Page 72: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序和汇编程序中的参数传递程序和汇编程序中的参数传递

问题问题::C C 程序会用到部分或者全部寄存器程序会用到部分或者全部寄存器..汇编函数也可能用到部分或者全部寄存器汇编函数也可能用到部分或者全部寄存器..如果调用过程中不作相应处理,如果调用过程中不作相应处理,CC程序中程序中的一些数据会在汇编函数调用中被破坏的一些数据会在汇编函数调用中被破坏..

Page 73: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

CC程序和汇编程序中的参数传递程序和汇编程序中的参数传递

解决办法解决办法::无论无论CC还是汇编程还是汇编程序,都需要对它序,都需要对它们用到的寄存器们用到的寄存器原值进行保存原值进行保存..

112233445566778899101011111212131314141515

00AA BB

C code C code automatically automatically

saves these saves these registersregisters

Assembly Assembly code must code must save these save these registers registers --

responsibility responsibility of the of the

programmerprogrammer

Page 74: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 75: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

内联函数(内联函数(intrinsicsintrinsics))

C6000C6000编译器可以识别若干内联函数。编译器可以识别若干内联函数。

内联函数直接调用某些汇编语句,这些内联函数直接调用某些汇编语句,这些汇编语句在汇编语句在C/C++C/C++中实现起来是很繁复中实现起来是很繁复

或难以表达的。或难以表达的。

Page 76: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

内联(内联(inlineinline))汇编语言汇编语言

要很小心不要破坏要很小心不要破坏C/C++C/C++环境。对插入环境。对插入的汇编指令,编译器不做任何检查或者的汇编指令,编译器不做任何检查或者分析。分析。

Page 77: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

C/C++C/C++源程序使用汇编程序变量和常量源程序使用汇编程序变量和常量

访问汇编语言中的全局变量访问汇编语言中的全局变量

访问汇编语言中的常量访问汇编语言中的常量

Page 78: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

访问汇编语言中的全局变量访问汇编语言中的全局变量

利用利用..bssbss或者或者..usectusect伪指令定义变量伪指令定义变量

..usectusect段中定义的变量,在段中定义的变量,在CC中需要声明中需要声明为为farfar利用利用.def.def或者或者.global.global伪指令使得变量可伪指令使得变量可被外部访问被外部访问

汇编语言中的变量前要加下划线汇编语言中的变量前要加下划线

C/C++C/C++中相应变量要声明为中相应变量要声明为externextern,即,即可进行访问可进行访问

Page 79: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)
Page 80: 实时数字信号处理技术 C6000 软件开发(3read.pudn.com/downloads119/ebook/507231/soft3_代码... · 2008-06-01 · 实时数字信号处理技术 C6000 软件开发(3)

访问汇编语言中的常量访问汇编语言中的常量

利用伪指令利用伪指令.set, .def .set, .def 和和.global.global在汇编语言在汇编语言中定义一个常量中定义一个常量

正常变量在符号表中包含有其正常变量在符号表中包含有其地址地址

汇编常量在符号表中包含的是其汇编常量在符号表中包含的是其数值数值

编译器不能区分那些是地址,那些是数值编译器不能区分那些是地址,那些是数值

解决办法:解决办法:

& & 操作符操作符