TMS320C6000 DSP的混合编程研究

TMS320C6xxx公共指令集:
       读取/存储类指令、算术运算类指令、逻辑与位运算类指令、搬移、跳转(程序转移)及空操作类指令等6种。
       由于C6000汇编语言的每一条指令只能在一定的功能单元执行,因此就形成了指令和功能单元之间的映射关系。一般而言,与乘法相关的指令在.M单元执行;需要产生数据存储器地址的指令在.D功能单元;算术逻辑运算大多在.S与.L单元执行。
       在书写汇编程序时可以以方括号对条件操作进行描述,方括号内是条件寄存器的名称,对C62xx/C67xx可以使用A1、A2、B0、B1和B2,而对于C64xx还可以增加使用A0寄存器作为条件寄存器。
       对C62xx/C67xx,双字节型数据的地址必须从偶数开始,即其地址最低位为0,4字节数据地址最低2位必须为0,分别称为半字、字边界。
       Little-Endian指数据的存储方式,即数据的高有效位存放在地址高位字节,低有效位存放在地址低有效位。数据存放的终结方式(EN)由芯片的相应管脚LENDIAN的电平决定,并反映在CSR寄存器的EN位。LENDIAN=1为小终端,LENDIAN=0为大终端。如0x0A48FE01
Table-1 Little-Endian
地址 内容
0x00000000 01
0x00000001 FE
0x00000002 48
0x00000003 0A

       如果运算结果超出了目的操作数字长所能表示数的范围,造成运算结果的高位丢失,使保存的运算结果不正确,称为溢出。
1、 寻址方式及Load/Store类指令
LDB/LD、LDBU/LDHU、STB/STH/STW,主要负责通用寄存器组与片内数据存储器之间交换数据。
2、 算术运算类指令
ADD/SUB、ADD2/SUB2、ADDU/SSUB、ADDK
3、 乘法运算类指令
SMPY/SMPYLH/SMPYHL
4、 逻辑和位域操作指令
AND/OR/XOR、NEG(求补码)、SHR/SHL(移位)、CMPEQ/CMPGT/CMPLT(比较)、
5、 搬移指令
搬移指令共有三个,MV/MVC/MVK,MV指令用于在通用寄存器之间传递数据,MVC指令用于在通用寄存器和控制寄存器之间传递数据,此条指令只能使用.S2功能单元,MVK指令用于把16位常数送入通用寄存器。在C6000指令集内,只能往寄存器送16位常数,可选择MVKH/MVKL指令向寄存器的高16位送数。
6、 程序转移指令
B .S1 LOOP
【资源对公共指令集底限制】表现在:指令在执行过程中会占用一定底资源,并行执行的指令所需资源不能冲突,在同一周期内不能有2条指令对同一寄存器执行写操作,具体编写汇编程序时要考虑到DSP的8个功能单元、2个读取数据通道(LD1、LD2)、2个通用寄存器组(A、B)、2个数据存储通路(ST1、ST2)、2个寄存器交叉通路(1X、2X)、2个数据寻址通路(DA1、DA2)相互之间的制约关系。
 
TMS320C6000流水线概述:
       对于微处理器来说,每隔一周期即可进入1条新指令,这样在同一时间内,就有多条指令交替地在不同部件内处理,这种工作方式称为“流水线”(pipeline)工作方式。即取指、译指、执行同时进行。
 
short pa[10] = {0}, pb[10] = {0};
void main()
{
       int i = 0,sum = 0;
 
       for(i=0; i< 10; i++)
       {
              sum +=pa[i]*pb[i];
       }
}
SP表示基址
80001BA0 07BD09C2                    SUB.D2        SP,0x8,SP                    指针入栈
80001BA4 01800040           MVK.D1        0,A3                            0送入通用寄存器A3
80001BA8 01BC22F5          STW.D2T1      A3,*+SP[0x1] 将A3内容送入[SP+4]=0(i = 0)
80001BAC 0200002A ||        MVK.S2        0x0000,B4             0送入通用寄存器B4
80001BB0 023C42F6           STW.D2T2      B4,*+SP[0x2] 将B4的内容送入[SP+8]=0(sum = 0)
80001BB4 00002000            NOP           2     二周期空操作
80001BB8 02000042            MVK.D2       0,B4        0送入B4
80001BBC 001148DA           CMPGT.L2     10,B4,B0 比较10和B4的大小,结果送入B0
80001BC0 30178120     [!B0]  BNOP.S1       L2,4        若B0为0,跳转到L2执行
80001BC4 023C22F6            STW.D2T2     B4,*+SP[0x1]       将B4送入内存[SP+4]=0
80001BC8          L1:
80001BC8 019018F1            OR.D1X        0,B4,A3   //B4与0“或”结果送入A3
80001BCC 0280CC2B ||        MVK.S2        0x0198,B5       //B5=0x0198
80001BD0 0200D828 ||         MVK.S1        0x01b0,A4       //A4=0x01b0
80001BD4 02389AB1            ADD.D1X       A4,DP,A4
80001BD8 02B8A842 ||         ADD.D2        DP,B5,B5
80001BDC 01906A45            LDH.D1T1      *+A4[A3],A3 //A3=pb[A3]
80001BE0 02148AC6 ||         LDH.D2T2      *+B5[B4],B4 //B4=pa[B4]
80001BE4 00002000             NOP           2
80001BE8 02BC42E6            LDW.D2T2      *+SP[0x2],B5 //去sum放入B5
80001BEC 00000000             NOP          
80001BF0 01907C80             MPY.M1X      A3,B4,A3 //
80001BF4 00002000             NOP           2
80001BF8 020CBAB2           ADD.D2X       B5,A3,B4 //sum = pa[i]*pb[is]
80001BFC 023C42F6            STW.D2T2      B4,*+SP[0x2] //结果sum存入[SP+8]
80001C00 00002000             NOP           2
80001C04 023C22E6            LDW.D2T2      *+SP[0x1],B4 //令B4 = i
80001C08 00006000             NOP           4
80001C0C 02102942            ADD.D2        B4,0x1,B4 //完成i++功能
80001C10 001148DA            CMPGT.L2     10,B4,B0//比较10和B4,大小结果放入B0
80001C14 2FF28120     [ B0]  BNOP.S1       L1,4 //若10>i继续循环L1
80001C18 023C22F6            STW.D2T2      B4,*+SP[0x1] //且i值存入[SP+4]
80001C1C          L2:
80001C1C 008C8362            BNOP.S2        B3,4
80001C20 07BD0942            ADD.D2        SP,0x8,SP //SP指针出栈
80001C24 00000000            NOP              
80001C28 00000000            NOP          
80001C2C 00000000            NOP          
80001C30 00000000            NOP          
80001C34 00000000            NOP          
80001C38 00000000            NOP          
80001C3C 00000000            NOP          
 
中断向量表设置:
用C语言编写的中断服务程序主要由以下四步组成:
(1)选择中断源并编写中断服务程序(interrupt service routine);
(2)创建并初始化中断向量表(interrupt vectortable);
(3)通过设置相关中断控制寄存器来使能中断;
(4)通过编写连接器命令文件(linker commandfile)来完成程序各个段的连接。
 
C程序的基本结构:
1. 主程序main.c C程序的入口点
2. 链接命令文件.cmd  
这个文件包含了DSP和目标板的存储器空间的定义,以及数据段,代码段是如何分配到这些空间的。
3. C运行库文件rst6000.lib
如果用户程序是准备写进EPROM并在上电后运行,则还要包括.asm文件,该文件的代码将作为IST(中断服务表),并且必须被.cmd文件分配在地址0。DSP在复位后首先跳转到0地址,执行复位中断,而该复位中断对应的代码要跳转到_c_int00函数,来完成诸如堆栈的初始化,全局变量等操作,接着执行用户main()函数。
       全局变量和静态变量被分配在.bss段中,并且在小模式下,.bss段要小于32k,也就是说程序成定义的全局变量和静态变量所占用的空间不能超过32k。对变量采用直接寻址,而在大模式下没有限制,对变量的访问采用间接寻址,速度较慢。
      
C程序与线性汇编的混合编程:
       在后缀名为.sa的文件中书写线性汇编程序如下:
              .global _add2             ;申明全局函数add2
_add2:     .cproc a,b                 ;.cproc与.endproc标明这之间是汇编优化器所处理的内容
              .reg sum               ;
              ADD a,b,sum          ;sum = a + b
              .return sum        ;
              .endproc               ;
C调用
int add2(int ai, int bi);
main()
{
       int c_result = add2(1,2);
       printf(“The add result = %d”, c_result);
}
 
关键字volatile的使用:
1. 汇编语言对volatile的解释
main()
{
        int nsize_t = 0;
        int nsize_l = nsize_t;
}
SUB.D2    SP,0x8,SP
MVK.D2 0,B4
STW.D2T2 B4,*+SP[0x1]
NOP        2
STW.D2T2 B4,*+SP[0x2];没有取地址操作数
NOP        2
main()
{
        volatile int nsize_t = 0;
        int nsize_l = nsize_t;
}
SUB.D2    SP,0x8,SP
MVK.D2 0,B4
STW.D2T2 B4,*+SP[0x1]
NOP        2
LDW.D2T2 *+SP[0x1],B4;取地址操作数
NOP        4
STW.D2T2 B4,*+SP[0x2]
NOP                     2 

 

1 运行环境 1. 本书以TI公司的TMS320C6000系列DSP为介绍的对象。 2. DSP开发环境CCS可以运行在Windows 2000或Windows XP系统下。 2 光盘内容介绍 1. 随书所赠光盘中每一个文件夹对应书中的一章。 光盘中的所有实例分别命名为“例M-N”的形式,其中“M”代表章号,“N”代表实例序号,例如“例3-1”表示这是第3章实例3-1的文件,“PPT-03”则表示这是第3章PowerPoint教学文件。相关芯片资料文件夹内为本书本章中所采用的芯片的Datasheet资料。 2. 读者可以通过邮件联系我们,我们会耐心解答您的问题。 3 PPT文件清单 “PPT”文件夹: PPT-01 第1章 DSP概述 PPT-022章 硬件结构、指令和中断系统 PPT-03 第3章 TMS320DM642存储器扩展 PPT-04 第4章 主机接口多通道缓冲串口 PPT-05 第5章 通用输入输出接口定时器 PPT-066TMS320DM642多媒体片内外设 PPT-07 第7章 TMS320DM642最小系统设计 PPT-08 第8章 软件开发环境及程序优化 PPT-09 第9章 视频处理开发实例 PPT-10 第10章 语音处理开发实例 PPT-11 第11章 网络通信开发实例 4 实例、习题文件清单 “程序”文件夹: 03:第3章 例3-1 SDRAM 读写程序 例3-2 FLASH芯片擦除程序 例3-3 FLASH芯片读取程序 例3-4 EDMA整块数据传输程序 例3-5 子帧提取程序 题3-1 FLASH芯片写入程序 题3-2 矩阵转置程序 04:第4章 例4-3 主机写一个字到DSP 例4-4 主机写一串字到DSP 例4-5 缓冲串口初始化及接收发送程序 题4-1 主机从DSP读取数据 05:第5章 例5-1 GPIO驱动LED发光二极管闪烁 例5-2 GPIO驱动液晶显示模块 例5-3 定时器驱动LED发光二极管闪烁 例5-4 定时器输出PWM波驱动直流电机 题5-2 GPIO接口模拟SPI总线 06:第6章 例6-1 网络发送传输图像 例6-2 图像采集 例6-3 音频接收发送 例6-4 报警声发生 08:第8章 例8-13 分数像素插值函数优化 例8-14 SAD计算的线性优化 题8-1 求均值代码优化 题8-2 矢量和代码优化 09:第9章 9-1 视频输入采集程序 9-2 视频输出显示程序 9-3 Sobel算子边缘检测程序 9-4 中值滤波程序 9-5 FFT子程序 9-6 H264编码子程序 题9-1 Prewitt 算子边缘检测 10:第10章 10-1 AIC23B 参数设置子程序 10-2 数字回声产生 10-3 语音信号FIR滤波 11:第11章 11-1 网络协议栈 11-2 TCP传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值