DSPC语言调用汇编

合集下载

DSP汇编语言编程基础

DSP汇编语言编程基础

实验二 DSP汇编语言编程基础一、 实验目的1、了解DSP的寻址方式;2、了解DSP的汇编语言与C语言混合编程。

二、 实验器材1、安装有CCS的PC机一台;三、 实验内容1、建立一个工程;2、用汇编语言编程实现一个可被C程序调用的例程。

四、 实验步骤1、汇编语言和C语言混合编程:(1) 运行CCS,建立一个工程,取名exp2a,并保存到c:\ti\myprojects\xxx\Experiment2\目录下。

(2) 编辑如下C文件,取名exp2a.c并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

/* Assembly routine */extern int sum(int *);/* define x[] as global array */int x[2]={0x1234,0x4321};/* define result s as global variable */int s;void main(){s = sum (x); /* return sum product */}(3) 编辑如下汇编文件,取名exp2_sum.asm并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** exp2_sum.asm SUM subroutine* called by exp2a.c* Input: Array pointer* Output: Return sum result in T0* * * * * * * * * * * * * * * * * * * * * * * * * * * * *.global _sum_summov *AR0+,AC0 ; AC0 = x[1]add *AR0+,AC0 ; AC0 = x[1]+x[2]mov AC0,T0ret ; Return T0.end(4) 编辑如下链接命令文件,取名link.cmd并保存到c:\ti\myprojects\xxx\Experiment2\exp2a\目录。

第五章 DSP的汇编指令..

第五章 DSP的汇编指令..

第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等

ADI_DSP程序间调用例程及说明

ADI_DSP程序间调用例程及说明

ADI_DSP程序间调用例程及说明下面的程序间的调用是基于TigerSharc101处理器,在VisualDSP++3.0上调试通过验证。

VDSP上编程可使用标准C语言,也可使用汇编语言。

故程序间的调用共分4种:(1)C语言调用C语言子程序;(2)C语言调用汇编语言子程序;(3)汇编语言调用汇编语言子程序;(4)汇编语言调用C语言子程序;下面详细说明4中调用方法:1.C语言调用C语言子程序这种调用方法最简单,和标准C语言调用一样。

声明函数之后便可以调用例程:Func调用SubCFuncvoid SubCFunc(int *BuffAddr, int N);void Func(void){int *BuffAddr;int N;SunCFunc(BuffAddr, N);Return;}void SubCFunc(int *BuffAddr, int N){return;}2.C语言调用汇编语言子程序这种调用方法最常用。

首先要在C语言程序中用extern声明汇编子函数,在汇编子函数中要用global _SunAsmFunc;,这样便可以调用汇编子程序了2.1 声明:C语言中声明用extern void SubAsmFunc(int *BuffAddr, int N);汇编语言中声明.global _SubAsmFunc;2.2 参数传递C语言的参数传递到汇编语言中,地址和整数依次分别用j4, j5, j6, j7传递;浮点数依次分别用xr4,xr5, xr6, xr7 传递;汇编函数的返回值:浮点值放在xr8中;整型值放在j8中;多于4个参数的传递则要借助堆栈传递数据。

2.3 例程:C语言函数:extern int SubAsmFunc(int *BuffAddr, float x, int N)void CFunc(void){int *BuffAddr;float x;int N;SubAsmFunc(BuffAddr, x, N);return;}汇编子程序section program;global _SubAsmFunc;_SubAsmFunc://j4存放BufferAddr地址//xr5存放浮点数x//j6存放N//j8返回值存放地址,如果是浮点数则放在xr8中_SunAsmFunc.endalign_code 4;cjmp(np)(abs);nop;nop;nop;3.汇编程序调用汇编子程汇编程序调用汇编子程序时,首先要进行堆栈保护,每进一层子函数都要进行堆栈保护。

DSP汇编语言与C语言混合编程关键技术研究(精)

DSP汇编语言与C语言混合编程关键技术研究(精)

DSP汇编语言与C语言混合编程关键技术研究DSP(数字信号处理器凭借其高速数字信号处理功能、实时性强、低功耗、高集成度等嵌入式微计算机的特点,已在通信、航空航天、工业控制、医疗、国防、汽车等领域得到了广泛的应用。

TMS320LF240xA DSP(以下简称LF240xA是美国TI公司推出的高性能16位数字信号处理器,它具有运算速度快,在片集成的外设丰富等特点,故又称其为DSP控制器。

应用领域主要针对工业测控、电机控制、家用电器和消费电子等场合。

LF240xA的软件开发过程,既可以使用汇编语言,也可以使用C语言。

汇编语言的代码执行效率高、运行速度快,可以直接对寄存器进行操作,充分发挥了DSP控制器的硬件性能;但其开发的工作量大,程序可读性、移植性差。

与汇编语言不同的是,C语言可读性强、编程简单、调试方便,适合编写结构和算法比较复杂的程序。

然而,对于控制来说,用C语言开发程序也有其明显的缺点:首先,C语言代码有冗余,降低了执行效率,对于实时性要求很高的某些控制领域来说不符合要求;其次,C语言无法实现某些底层的操作。

在具体软件开发过程中,可以将汇编语言和C语言结合起来编程,发挥各自的优点。

这样既能满足实时性要求又能实现所需的功能,同时兼顾程序的可读性和编程效率。

为此,了解及掌握C语言和汇编语言的混合编程技术对于DSP的软件开发具有重要的意义。

1 准备工作在进行混合编程之前,首先要创造一个运行的基本环境。

这个基本环境包括存储空间的分配、DSP寄存器映射地址的定义以及中断向量的定义等方面。

(1存储空间的分配命令文件(*.cmd用来实现对程序存储器和数据存储器空间的分配。

一是目标存储器定义(由MEMORY 命令定义,二是各段的定位(由SECTIONS命令定义。

(2寄存器映射地址的定义头文件(*.h用来定义所用到的DSP控制器内部寄存器的映射地址,以及用户自定义的常量、寄存器等。

通常,头文件在主程序的开始,使用汇编指示符“.include”和“.copy”对其调用。

dsp原理及应用 第6章 C语言和汇编语言混合编程

dsp原理及应用 第6章 C语言和汇编语言混合编程
cnf位清0b0被映射到数据存储器空间dsp原理及应用北京理工大学珠海学院信息学院第6章汇编语言和c语言程序设计24在c语言中嵌入实现某一完整功能的多条汇编语句在c语言中调用汇编语言编写的子程序用户必须遵循相关规则自行维护模块的入口和出口代码主要应弄清楚堆栈的使用情况
第6章 汇编语言和C语言程序设计
《DSP原理及应用》
5
北京理工大学珠海学院信息学院
汇编伪指令
第6章 汇编语言和C语言程序设计
说明
技术汇编命令 包含一个已经写好的汇编文件 打印一个文件标题
举例
一般用于一个汇编文件的结尾 .include “240x.h” .title “vectors.asm”
.end .include .title
《DSP原理及应用》
15
北京理工大学珠海学院信息学院
第6章 汇编语言和C语言程序设计 MEMORY { PAGE0:/*程序存储器*/ name1[(attr)]: origin=constant,length=constant; …… namen[(attr)]: origin=constant,length=constant; PAGE1:/*数据存储器*/ name1[(attr)]: origin=constant,length=constant; …… namen[(attr)]: origin=constant,length=constant; PAGE2:/*I/O空间*/ name1[(attr)]: origin=constant,length=constant; …… namen[(attr)]: origin=constant,length=constant; }
.endif
(2) 第二种情况: .loop .endloop

第9讲 DSP的C及汇编语言

第9讲  DSP的C及汇编语言

OnFileLoaded()函数
GEL文件—回调函数
该回调函数在加载program/symbol(.out)文件之后执行。 可以建立调试源搜索路径(在没有CCS工程文件的时候), 设定断点和探针,完成软件的复位和重启。
GEL文件—回调函数
OnReset()函数
当目标处理器复位后该函数被调用。如果你需要每次重
无论用哪种方法定义中断服务函数,都须注意以下问题:
(1)中断处理函数必须是void类型,而且不能有任何
输入参数。
(2)进入中断服务函数,编译器将自动产生程序保护 所有必要的寄存器,并在中断服务函数结束时恢复运行 环境。 (3)进入中断服务函数,编译器只保护与运行上下文 相关的寄存器,而不是保护所有的寄存器。中断服务函 数可以任意修改不被保护的寄存器,如外设控制寄存器 等。 (4)要注意IMR、INTM等中断控制量的设置。通常 进入中断服务程序要设置相应寄存器将中断屏蔽,退出 中断服务程序时再打开,避免中断嵌套。
需要注意的问题
(2)指针类型转换是必须的,关系到接收分配 好的内存块的地址可以向前看多少字节。 如果不做指针类型转换会怎么样? void * 指针存在的意义。
需要注意的问题
(3)内存块大小的可移植性问题
分配一个整型变量数组应使用: 数组元素个数 * sizeof(int) 确定内存块的大小 问题:sizeof和strlen函数的区别
/*进行CCS存储器映射,告知目标处理器哪些空间可以访问,哪些不可以访问。*/
Setup_Memory_Map( ); } OnTargetConnect( )//对处理器进行最小初始化 { Setup_Cache( ); //设置缓存L1P,L1D,L2 Setup_Pin_Mux( ); // 设置管脚 Setup_Psc_All_On( ); // 设置psc Setup_PLL0_594_MHz_OscIn( ); // 设置dsp主频[DSP @ 594 MHz][Core 1.20V] Setup_PLL1_DDR_135_MHz_OscIn();//设置ddr时钟频率 Setup_Aemif_8Bit_Bus( ); // 设置Async-EMIF[8-bit bus] }

CCS 中C语言程序调用线性汇编

CCS 中C语言程序调用线性汇编

CCS 中C语言程序调用线性汇编在对DSP进行优化的时候,难免会用到线性汇编,今天找了一上午关于在C中调用线性汇编的程序,发现网上资料很少,这里自己做一个记录。

线性汇编类似于标准的汇编代码,不同的是,线性汇编代码中不需要给出标准汇编代码必须指出的所有信息,线性汇编代码会对这些信息进行选择,或者由汇编优化器确定,从而使得代码的编写较为容易。

线性汇编代码不需要给出如下的信息。

(1)使用的寄存器,由优化器分配。

(2)指令是否并行运行,由优化器决定。

(3)指令使用的功能单元,由优化器选择。

(4)流水执行,由优化器确定。

(5)如果代码中没有指定这些信息,汇编优化器会根据代码的情况确定这些信息。

与其它的代码产生工具一样,有时需要对线性汇编代码进行修改直到性能满意为止。

在修改的过程中,可能要对线性汇编添加更加详细的信息,如指出应该使用哪个功能单元。

线性汇编文件必须包含一些汇编优化器提供有关代码的其他信息。

汇编优化器伪指令如下:(1)线性汇编文件的扩展名必须是".sa"。

(2)线性汇编代码应该包括".cproc"和“.endproc”命令。

“.cproc”和".endproc"命令限定优化器优化代码段,“.cproc”放在这段代码的开始位置,“.endproc”放在这段代码的结尾。

用这种方式可以设置需要优化的汇编代码段,如程序或函数等。

(3)线性汇编代码中可能包含“.reg”指令,该命令允许使用将要存入寄存器的数值的描述字。

当使用“.reg”命令时,汇编优化器为数值选择一个寄存器,这个寄存器与对该值进行操作的指令所选择的功能单元一致。

(4)线性汇编代码中可能包含".trip"命令,该命令指出循环的迭代次数。

下面是一个简单的例子,用线性汇编实现两个数的相加。

的代码:#include <>int add(short a, short b);int main(){short a = 2, b = 3;short result;result = add(a, b);printf("result=%d\n", result);return 0;}的代码:.global _add_add: .cproc a, b.reg cADD a, b, c.return c.endproc需要注意的是在.global 前面一定要有空格或tab,否则编译时会报错(这个折磨了我很久。

如何将汇编语言与C语言整合至DSP

如何将汇编语言与C语言整合至DSP

如何将汇编语言与C语言整合至DSP本文将研究如何将汇编语言程序代码整合到中,以最大化性能以及程序设计人员生产力,内容涵盖了编译器惯例(convention)、内嵌(inlining)、内嵌函数(intrinsic)、缓存器连结(register binding)和除错策略。

随着处理器性能的提升以及编译器最佳化技术的长进,曾经红极一时、仅用汇编语言编写DSP应用程序的作法已逐渐被淘汰。

今日,几乎每个DSP应用程序都用法C语言程序代码和汇编程序码混合的方式。

对于一些性能需求极高的关键功能,DSP工程师会继续用法高度最佳化的汇编程序码;而一些次要的功能现在也用法C语言编写,使程序代码更简单维护和移植。

对于C语言和汇编程序码的结合,每位DSP工程师都需要把握特别的工具和办法。

众所皆知,汇编语言编码具有更高的性能优势,而用C语言编码则较简单且速度也更快。

为了解其中缘由,以下我们进一步比较汇编语言编码与C语言编码的优缺点:汇编语言编码的优点:汇编语言编码可以充分利用处理器的独特命令以及各种特地的硬件资源。

而C语言程序代码是通用型程序代码,必需支持各种硬件平台,因此很难支持特别平台程序代码。

汇编程序设计人员通常对应用程序十分认识,可以作出编译器无法作出的假设。

汇编程序设计人员可以发挥人类的制造性;而再先进的编译器也只是一个的程序。

汇编语言编码的缺点:汇编程序设计人员必需解决耗时的机器级问题,如缓存器分配和命令排程。

若用法C语言程序代码,这些问题可以由编译器解决。

用法汇编语言编码的程序设计人员必需了解DSP架构及其命令集的专业学问;而C语言编码只需要把握相当普及的C语言学问。

若用法汇编语言,将应用程序从一个平台移植到另一个平台十分困难也相当耗时;而C语言应用程序的移植相对而言十分简单。

第1页共9页。

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

DSP报告
系部:电子通信工程系
班级:
学号:
姓名:
成绩:
2011年11月
实验报告
一、实验时间:2011年10月~ 2011年12月
二、实验目的:
1、学习使用ccs3.3来进行dsp程序的编写和调试工作;
2、掌握dsp在处理程序式的过程和常见错误类型;
3、理解ccs3.3的C运行时的环境和流水线工作流程;
三、实验要求
实现C调用汇编语言程序,在main函数中调用汇编实现的函数addarr2,addarr2(int * arr1, int * arr2, int * arr3, int n) 是汇编函数,其功能为2个数组的对应位置相加,结果放在arr3[n]中
四、实验步骤
1、打开ccs3.3的C运行时的环境。

2、在第二个程序中,调用汇编函数,汇编函数调用c函数,这其中采用数据来实现参数的传递。

(1)先从最后一个子函数开始,即addarr2(int *arr1, int *arr2, int *arr3, int n)
static int addarr2(int *arr1, int *arr2,int *arr3,int n)
{
for(i=0;i<n;i++)
{
*arr3++ = *arr1++ + *arr2++;
}
return ;
}
(2)实现了两个数组相加的子程序之后,下面就要编写汇编子函数了,这个子函数不仅是一个子函数,也是一个父函数,通过它来调用上一个addarr2函数,由于是汇编程序,所以其中的断点的保护就需要用指令来实现,这就要先搞清楚需要把那些寄存器压栈,最后还要把相应的寄存器出栈。

这个函数的功能也是两个数组相加,即arr3[5]+arr4[5]=>arr4[5],通过地址来实现数据在函数中的传递。

实现这个函数的程序如下:
.global _addarr2
.text
_addarr2:
mvk .s2 0x0012,b0 ;设置循环次数
mvk .s1 0x04a5,a1 ;arr1首地址
mvkh .s1 0x6000002c,a1
mvk .s1 0x04c5,a2 ;arr2首地址
mvkh .s1 0x60000040,a2
loop:
ldw .d1 *a1++,a3 ;开始做加法
ldw .d1 *a2,a4
nop 4
add .l1 a3,a4,a3
sub .s2 b0,1,b0
stw .d1 a3,*a2++
nop 4
[b0] b .s2 loop
nop 5
.end
(3)由于在调试上面两个程序时都需要观察结果,所以在最初调试addarr2子函数时就采用用printf( )函数输出的办法来观察最后计算的结果是否正确,当addarr3汉书编写完成后,再实现两个子函数的联调。

最后得到main( )函数如下:
void main()
{
addarr2(arr1,arr2,arr3,n); /*调用addarr2函数*/
return ;
}
最后得到的整个C语言的程序如下:
#include "stdio.h"
#define size 12 /*定义常量size*/
int i,n=size;
int arr1[size]={13,19,16,20,21,55,70,71,19,11,3,4}; /*输入数据数组*/ int arr2[size]={ 5,6,7,8,9,10,11,12,13,14,15,16};
int arr3[size];
extern int addarr2(int *arr1,int *arr2,int *arr3,int n); /*定义子函数addarr2*/
void main()
{
addarr2(arr1,arr2,arr3,n); /*调用addarr2函数*/
return ;
}
static int addarr2(int *arr1, int *arr2,int *arr3,int n)
{
for(i=0;i<n;i++)
{
*arr3++ = *arr1++ + *arr2++;
}
return;
}
五、实验结果
实验结果如下图所示:
六、实验心得:
通过本次实验,让我掌握了ccs3.3的学习和应用,学会了用ccs3.3来进行dsp程序的编写和调试工作。

参考文献:
[1] DSP原理及应用北京邮电大学出版社;
[2] DSP芯片的原理与开发应用;。

相关文档
最新文档