最新第七章 DSP软件设计PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

▪ 混合编程函数调用规则(续)
编程实例
以32 bit乘法运算为例。虽然用C/C++语言表达32 bit乘法运算较为 方便和明了,但由于C/C++语言无法很好利用DSP汇编语言为实 现各种乘法运算而提供的指令,使得C/C++程序效率低下。所以 这里用汇编语言完成32 bit乘法运算,再用C/C++程序调用它。
▪ 混合编程函数调用规则(续)
✓ 参数传递规则
函数调用前

将参数置于参数 表中,调用函数
被调用者分配局 部帧和参数表
SP 调用者的
参数块
返回地址
参数2 …… 参数n
SP
参数1 在A中
参数数据 局部数据 返回地址
参数2 …… 参数n
SP 被调用的
参数1 在A中
调用者的
局部变量 高
(a)
调用者的 局部变量
(b)
调用者的 局部变量
(c)
▪ 混合编程函数调用规则(续)
✓汇编器对被调用函数局部帧的分配
局部帧包括局部变量块和局部参数块两部分,其中局部参数块 是局部帧中用来传递参数到其他函数的部分。如果被调用函数 没有局部变量并且不再调用其他函数或需要调用的函数没有参 数,则不分配局部帧。
对于混合编程而言,若被调用函数是手工编写的汇编程序, 则局部帧由编程者自己完成分配,也不需要在堆栈中进行, 而编译器分配局部帧。
局部变量块的大小+局部参数块的大小+padding padding值是为了保证SP对准偶数边界而可能要求补充的一 个字。之所以SP要对准偶数边界,是因为5000系列DSP指令可一 次读写存储器的32 bit,例如DLD,DADD等。这样,编译器必 须保证所有32 bit的目标都驻留在偶数边界。
▪ 混合编程函数调用规则(续)
.global _gScale .global _inner_product
➢ 混合编程
✓ 寄存器使用规则
(1)辅助寄存器AR1、AR6、AR7由被调用函数保护,即可 以在函数执行过程中修改,但在函数返回时必须恢复。在 TMS320C54X中,编译器将AR1和AR6用作寄存器变量。其 中,AR1被用作第一个寄存器变量,AR6被用作第二个寄存 器变量,其顺序不能改变。
✓被调用函数如何响应(续)
③被调用函数为调用函数执行代码。 ④若函数返回一个值,则被调用函数将该值放在累加器A中; 若函数返回一个结构,则被 调用函数将该结构复制到累加 器A指到的存储器块;若调用者不返回函数值,则A被置0。 ⑤被调用函数给SP上加上第二步计算的常数,释放为局部变 量和局部参数分配的存储空间。对混合编程而言,如果编程 者没有在堆栈中分配局部帧,则本步骤省略。 ⑥被调用函数恢复所有保存的寄存器。 ⑦被调用函数执行返回。
编程实例(续)-汇编程序
.mmregs .bss x1, 1
//为局部帧分配内存空间
.bss x0, 1
.bss y1, 1
.bss y0, 1
.bss w3, 1
.bss w2, 1
.bss w1, 1
.bss w0, 1
.text .global _MPY32
//声明函数名为全局变量
_MPY32:
结果返回
函数调用结束后,将返回值置于累加器A中。整数和指针在 累加器A的低16位中返回, 浮点数和长整型数在累加器A 的 32位中返回。
▪ 混合编程函数调用规则(续)
✓被调用函数如何响应
如果被调用函数是C/C++函数,则下面步骤都是由汇编器自动完 成。如果是混合编程,则如下步骤都是由编程者在被调用的汇 编函数中完成的。 ①若被调用函数修改AR1,AR2或AR7,则将他们压入堆栈。 ②被调用函数通过从SP减去一个常数,为局部变量块和局部参 数块分配存储器。该常数按以下公式计算,即:
AR0、AR2、AR3、AR4、AR5可以自由使用,即在函数执 行过程中可以修改,而且不必恢复。
(2)堆栈指针SP在函数调用时必须予以保护,但其是自动 保护的,即在返回时,压入椎栈的内容都将被全部弹出。
➢ 混合编程
✓ 寄存器使用规则(续)
(3)ARP在函数进入和返回时,必须为0,即当前辅助寄 存器为AR0。函数执行时可以是其它值。
第七章 DSP软件设计
主要内容
➢ 混合编程 ➢ XDAIS ➢ DSP/BIOS ➢ 通用算法 ➢ 小结
➢ DSP基于C语言编程特点
✓ 全C编程优点:
易用的C/C++集成开发环境CCS 优化ANSI C/C++编译器(四级优化) 提高软件开发速度和可读性,方便软件修改和移植
✓ 全C编程缺点: 代码效率相比于汇编代码较低 某些硬件控制不如汇编方便,有些甚至无法 用C/C++语言实现。
▪ 混合编程函数调用规则(续)
编程实例(续)-汇编程序
STM #x1, AR2
//AR2指向第一个参数存放单元
STM #y1, AR3
//AR3指向第二个参数存放单元
STM #w0, AR4
//AR4指向乘法结果存放单元
STH A, *AR2+
//传递第一个参数
STL A, *AR2
LD *SP(1), A
函数返回地址 3333h 4444h
SP 1111h 2222h 累加器A
函数MPY32的第一参数存放在A累加器中,第二个参数在堆 栈中,高16位在堆栈中的低地址,低16位在堆栈中的高地址。 由于MPY32是汇编语言函数,所以编译器不为其分配局部 帧,局部帧的分配在汇编程序中进行。
▪ 混合编程函数调用规则(续)
0 CMPT
-
CPL
- FRCT
-
OVA
0 OVB
缺省值 O 1 0 -
名称 OVM SXM SMUL SST
TC
缺省值 0 0 0 -
➢ 混合编程
✓函数调用规则-参数传递
函数调用前,将参数以逆序压入运行堆栈,即最右边的 参数最先入栈,然后自右向左将参数依次入栈。
在TMS320C54xx函数调用时,第一个参数(最左边)放 入累加器A中进行传递。若参数是长整型和浮点数时, 则低位字先压栈,高位字后压栈。若参数中有结构形式, 则调用函数给结构分配空间,其地址通过累加器A传递 给被调用函数。
✓ 在C语言中保持“自然”的命名,而在汇编语言 中
该名字需加一个下划线作为前缀。
➢ 混合编程
▪ 变量和函数命名规则(续)
在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及 函数的接口问题。
在C程序中定义的变量,编译为.asm文件后,都被归到.bss区, 变量名前面都带一个下划线。在C程序中定义的函数,编译后 在函数名前也带了一个下划线。例如:
MACSU *AR3-, *AR2, A //A+=x1*uy0
▪ 混合编程函数调用规则(续)
编程实例(续)-汇编程序
STL A, *AR4LD A, -16,A MAC *AR2, *AR3,A STL A, *AR4STH A, *AR4 LD #w3,A RET
//w1=A
//A=A>>16
复位时,初始化环境 使程序从c_int00开始 执行
;cvectors.asm .ref _c_int00
.sect “vectors” rsv: B _c_int00
➢ 混合编程
▪ 变量和函数命名规则 ✓ 无论是变量还是函数,在C语言和汇编中均需要 说明为全局的。在C语言中需要有准确的函数原 型说明。
extern int num变成
.bss _num, 1
extern float nums[5]变成
.bss _nums, 5
extern void func ( )变成
_func
注意:为了让汇编语言能访问到C语言中定义的变量和函数, 必须声明为外部变量,即加extern 前缀。
➢ 混合编程
例: C语言部分: extern int inner_product(int *x, int *y); extern int gScale; 汇编部分:
#include <stdio.h>
#include <stdlib.h>
int main()
{
extern int *MPY32(long X32, long Y32); //定义函数原型,返回指针值
int W[4];
//定义存放相乘结果的数组
int *P;
int i;
P=MPY32(0x11112222, 0x33334444); //函数调用
✓ C语言中变量及函数空间分配(续)
段名
.text: .cinit: .bss: .stack: vectors .const .switch .sysmem
使用范围
code global inits variables for SP vectors const int x=25; for case stmts heap, dynamic mem
• 源文件 源文件中包含所有的数据处理的代码和数据分配
• 使用include伪指令来包含相应的头文件
➢ XDAIS(TI算法标准)
▪ 提出eXpressDSP软件结构
基于庞大的软件工程;市场的压力要求新产品的开发周 期越来越短;团队合作开发;要求软件的结构化,可移 植性,可重用性;工程代码的可维护、多人协同工作的 规范、成熟算法的有效利用等非DSP技术细节的软件工程 规范问题,标准的核心思想是代码独立于具体芯片并可 重复利用。
//A+=x1*y1 //w2赋值 //w3赋值 //w3单元地址作为返回值,传递到A
x1
AR2
在汇编程序中至少要为局部帧分配8个
x0
单元,其中4个单元用来存放参数值,4 y1
AR3
个单元用来存放运算结果。如图所示。 y0
w3
w2
w1
w0
AR4
▪ 混合编程的文件同构
✓ 汇编程序和C语言程序保持相同的文件结构 • 头文件 头文件中包括所有函数标号说明和全局数据标号说明
算法简介
由于16 bit定点DSP中没有32 bit乘法指令,要用几种16 bit乘法指 令结合一定算法来进行32 bit乘法运算。关键指令有:
MACSU Xmem, Ymem, src //无符号与有符号相乘并累加
MPYU Smem,dst
//无符号相乘
▪ 混合编程函数调用规则(续)
编程实例(续)-C语言主程序
//传递第二个参数
STL A, *AR3+
LD *SP(2), A
STL A, *AR3
SUB A
LD *AR2, T
//T=x0
MPYU *AR3- , A //A=ux0*uy0
STL A, *AR4-
//w0=ux0*uy0
LD A, -16, A
//A=A>>16
MACSU *AR2-, *AR3+,A //A+=y1*பைடு நூலகம்x0
eXpressDSP包括:集成开发环境(Code Composer Studio);eXpressDSP软件(DSP/BIOS,TMS320 DSP Algorithm Standard,Reference Framework);And The TI DSP Third Party Network。
背景:DSP软件开发滞后于硬件芯片
➢ XDAIS
DSP芯片本身面向实际应用,各种应用必然面临需求分析、 总体设计、框架设定等实时系统体系结构的问题。为此, TI公司针对不同的应用级别提出了相应的参考框架 (Reference Framework),支持eXpressDSP算法标准,包括 成熟的RF1、RF3、RF5,以及下阶段即将推出的RF6。
//该指针指向数据存储器中,存放相乘结果单元的首地址
for(i=0; i<4; i++)
{
W[i]=*P++; //将相乘结果存到数组中 printf (“% x\n” , W[i]); //以十六进制方式输出该数组值
}
}
▪ 混合编程函数调用规则(续)
编程实例(续)-参数传递 在主程序中进行MPY32函数调用时,函数传递情形如下所示。
(4)在缺省的情况下,编译器总是认为OVM为0。因此, 若在汇编程序中将OVM置为1,则在返回C环境时,必须 将其恢复为0。
(5)其它状态位和寄存器在子程序中可以任意使用,不 必恢复。
➢ 混合编程
✓函数调用规则 在C语言中,状态标志的缺省数值如下表所示。
名称 ARP ASM BRAF
C C16
缺省值 名称
算法对系统是盲的即算法可以有效地在各个系统或框架中使用第一级对所有的dsp编程都适用可称之为通用级它规定了标准的c语言接口代码段的可重载性无固定地址等基本的编程规范第二级主要针对各类独立的算法可称之为算法级为使多种算法能同时无冲突地在同一个系统中运行它对算法接口模块组成等制定了详细的要求第三级强调对不同类型的dsp所提出的不同要求可称之为专用级它提出了对dsp资源如中断存储器寄存器等的使用规则第四级是一个应用级它简单地描述了如何集成符合xdais的软件完成最终应用的过程xdais的基本要素通用编程规范允许c语言调用等等算法模型等等c62x的规则寄存器使用等c54x的规则寄存器使用等c2xx的规则寄存器使用等电信应用回声消除等图像应用编码器等其他应用第一级第二级第三级第四级输入输出命令状态算法算法算法功能功能功能系统框架运行支持xdais抽象接口的应用应用程序标准接口算法模块测试模块测试接口调试界面调用实现抽象接口测试接口所有未定义符号必须来自c语言运行支持库dspbios或其它符合xdais的模块
存储器类型
Program ROM Program ROM Data RAM Data RAM Program ROM (0xFF80) Data ROM Program ROM Data RAM
✓ 初始化C环境
Boot.c in rts.lib _c_int00:
Initialize global and static variables Initialize C environment variables Setup stack (SP) Call _main
相关文档
最新文档