DSP程序注释

合集下载

dsp实验注释

dsp实验注释

dsp实验注释实验一:简单指令程序运行实验代码(含注释):.mmregs.global _main_main:stm #3000h,sp ;sp为堆栈指针寄存器,stm为存储器映射寄存器寻址ssbx xf ;xf赋值为1,灯亮call delay ;调用delay函数,延迟0.5秒rsbx xf ;xf赋值为0,灯灭call delay ;调用delay函数b _main ;无条件调用_main函数nopnop;delay .5 second ;延时5秒delay:stm 270fh,ar3 ;ar3赋值207fh,十进制为9999dloop1:stm 0f9h,ar4 ;ar4赋值0f9h,十进制为249dloop2:banz loop2,*ar4- ;若不为0,ar4减1banz loop1,*ar3- ;若不为0,ar3减1,共进行10000*250次跳转retnopnop.end实验操作:可见XF灯以一定频率闪烁;单击“Halt”暂停程序运行,则XF 灯停止闪烁,如再单击“Run”,则“XF”灯又开始闪烁。

实验二:资料存储实验本实验程序将对0x1000开始的8个地址空间,填写入0xAAAA 的数值,然后读出,并存储到0X1008开始的8个地址空间。

在CCS 中可以观察DATA内存空间地址0X1000~0X100F值的变化。

代码(含注释):.mmregs.global _main_main:;store data ;存储数据stm 1000h,ar1 ;将立即数1000h送入辅助寄存器ar1 (内存地址) rpt #07h ;循环执行下一条指令,8次st 0aaaah,*ar1+ ;将立即数0xaaaah赋给辅助寄存器ar1的1000h地址内,;之后ar1的地址加1,8次;ar1的地址变1008,内存0x1000-- ox1007中的数据均为0xaaaah;read data then re-store ;读入数据重新存储stm 7h,ar3 ;令辅助寄存器ar3的初值为07hstm 1000h,ar1 ;重新将立即数1000h送入辅助寄存器ar1stm 1008h,ar2 ;将立即数1008h送入辅助寄存器ar2loop: ;进入循环ld *ar1+,t ;将辅助寄存器ar1的值0xaaaah存入T寄存器中,且ar1的地址加1 st t,*ar2+ ;将T寄存器内容0xaaaah存入辅助寄存器ar2 ,并且ar2的地址加1 banz l oop,*ar3- ;寄存器ar3的值不为0时,执行循环loop,ar3的地址值减1直至为0时退出循环here:b here.end ;结束(地址0x1000-- 0x100F,程序完成对16个内存单元赋值)实验操作:1.用“View”下拉菜单中的“Memory”查看内存单元;2.输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH单元的数值变化,输入地址0x1000H;3.查看0x1000H~0x100FH单元的初始值,单击“Run”运行程序,也可以“单步”运行程序;4.单击“Halt”暂停程序运行;5.查看0x1000H~0x100FH单元内数值的变化;6.关闭各窗口,本实验完毕。

DSP 6000系列开发指南

DSP 6000系列开发指南
图七 内存分配
图八 是一些打印调试用到的信息需要分配空间
这些信息,是和 cmd 文件是一致的。 运行完 main 函数之后,系统就转到线程函数运行。如下图
图九
其中,HWI 是硬中断,优先级是最高的,即 main 函数运行完毕后,要首先运行中断函数, 如果没有,就会到 SWI 软件中断,运行完毕中断之后,就到 TSK 了,即任务了。如果没有 任务运行,就是启动空闲线程 IDL,这个如果没有定义东西,系统就默认状态。 现在,我们的视频采集和处理,都会在 TSK 中进行的。
.rtdx_data: align = 0x40 { . += 0x80; *(.rtdx_data) } > DDR2
/* RTA_fromHost buffer */ .hst1: align = 0x4 {} > DDR2
/* RTA_toHost buffer */ .hst0: align = 0x4 {} > DDR2
FVID_Frame *frameBuffTable[FRAME_BUFF_CNT];定义视频采集帧要用到的内存 可以看看这个内存结构式如何的: typedef struct _FVID_Frame {
QUE_Elem
queElement; /* for queuing
*/
union
{
FVID_IFrame iFrm;
/* Initialize BSL library to read jumper switches: */ EVMDM6437_DIP_init();//初始化,根据 cmd 或 tcf 档,初始化内存的分配,所以在执 行工程前,要设定好。
sysModuleRegs -> PINMUX0 &= (0x005482A3u); sysModuleRegs -> PINMUX0 |= (0x005482A3u);

DSP指令大全(最全)

DSP指令大全(最全)

附录6 TMS320C54x 指令系统一览表(按指令功能排列) 一、算术运算指令二、逻辑运算指令三、程序控制指令6.注:?条件“真”,§条件“假”,※延迟指令。

四、加载和存储指令4.6.7.五.伪指令2.初始化常数(数据和存储器)的伪指令3.调整段程序计数器伪指令(SPC).align 把SPC调整到页边界.even 把SPC调整到偶数字边界4.控制输出列表格式化伪指令5.条件汇编伪指令.break [well-defined expression] 如果条件真结束.loop汇编,.break结构是可选项.else 如果.if条件为假,汇编代码块.else结构是可选项.elseif well-defined expression——如果if条件为假且.elseif条件为真,汇编代码块.else结构是可选项.endif 结束.if代码块.endloop 结束.1oop代码块.if well-defined expression 如果条件为真则汇编代码块.loop [well-defined expression] 开始代码块的重复汇编6. 汇编符号.asg [”] character string [”],substitution symbol——把字符串赋予替代的符号..endstruct 结束结构定义.equ 使值和符号相等.eval well-defined expression,substitution symbol 根据数字替代符号完成运算.newblock 取消局部标号.set 使数值和符号相等.struct 开始结构定义.tag 把结构属性赋予标号7.宏指令宏定义:Macname .macro[参数1],[…],[参数n]宏调用:[标号][:] macname [参数1],[…],[参数n]8.编译软件指令①汇编器:asm500.exeasm500[input file[object file [listing file] [-options]]-c—使汇编语言文件中大小没有区别。

DSP汇编编程及应用举例

DSP汇编编程及应用举例

1.DSP汇编语言程序的编写(1)汇编语言源程序以.asm为其扩展名。

(2)汇编语言源程序的每一行都可以由4个部分组成,句法如下:[标号] [:] 助记符[操作数] [;注释]其中可用空格或TAB键隔开标号——供本程序的其他部分或其他程序调用。

标号是任选项,标号后面可以加也可以不加冒号“:”。

标号必须从第一列写起,标号最多可达到32个字符(A~Z ,a~z ,0~9 ,_ ,以及$),但第1个字符不能以数字开头。

引用标号时,标号的大小写必须一致。

标号的值就是SPC(段程序计数器)的值。

如果不用标号,则第一个字符必须为空格、分号或星号(*)。

助记符——助记符指令、汇编指令、宏指令和宏调用。

作为助记符指令,一般用大写;汇编命令和宏指令,以英文句号“.”开始,且为小写。

汇编命令可以形成常数和变量,当用它控制汇编和连接过程时,可以不占用存储空间。

指令和汇编命令都不能写在第1列。

操作数——指令中的操作数或汇编命令中定义的内容。

操作数之间必须用逗号“,”分开。

有的指令操作无操作数,如NOP、RESET。

注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行或数行。

注释是任选项。

如果注释从第1列开始,也可以用“*”表示注释。

(3)常用的汇编命令如表所示。

(4)汇编语言程序中的数据形式如表所示2.程序2.1 程序一编程目的:了解DSP的输入和输出方法程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4.title "mpy_add.asm".mmregs ;将存储映像寄存器导入列表STACK .usect "STACK",10h ;给堆栈段分配空间.bss a,4 ;将9个字空间分配给各个变量.bss x,4.bss y,1PA0 .set 0 ;将端口PA0全部置0.def start ;定义标号start.data ;定义数据代码段table: .word 4,4,4,4.word 4,4,4,4.text ;定义文本代码段start: STM #0,SWWSR ;将等待寄存器设为0,表示不等待STM #STACK+10h,SP ;设堆栈指针STM #a,AR1 ;将AR1指向变量a的地址RPT #7 ;从程序存储空间转移7+1个值到数据储存空间MVPD table,*AR1+CALL SUM ;调用SUM子程序end: B end ;循环等待SUM: STM #a,AR3 ;将AR3指向变量a的地址STM #x,AR4 ;将AR4指向变量x的地址RPTZ A,#3 ;将A清0,并重复执行下一条指令3+1次MAC *AR3+,*AR4+,ASTL A,@y ;将寄存器A中的低16位存入y地址空间PORTW @y,PA0 ;将y地址中的值输出到输出口RET ;子程序返回.end ;程序结束等待位的设置:C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。

DSP术语

DSP术语

AA0–An:数据/程序存储器或 I/O 设备的外部地址引脚。

绝对地址:永久分配给存储器位置的地址。

另请参见符号地址。

绝对列表器:将链接的文件接受为输入并创建 .abs 文件作为输出的调试工具。

这些 .abs 文件经汇编可产生显示对象代码绝对地址的列表。

如果没有该工具,可通过大量手动操作准备绝对列表。

ABU:请参见自动缓冲单元。

ACC:请参见累加器。

ACCB:请参见累加器缓冲器。

存取阶段:主处理器的获取、执行、存取 (FEA) 管道的第三个可选阶段,在此过程中会发生存储器存取(加载或存储操作)。

(TMS320C8x)ACCH:请参见累加器高字节。

ACCL:请参见累加器低字节。

累加器 (ACC):临时存储算术逻辑单元 (ALU) 操作结果并为后续 ALU 操作提供输入的寄存器。

ACC 可分两部分访问:累加器高 (ACCH) 和累加器低 (ACCL)。

累加器缓冲器 (ACCB):临时存储累加器 (ACC) 内容的寄存器。

ACCB 具有返回算术逻辑单元 (ALU) 的直接路径,并可与 ACC 一起进行算术和逻辑处理。

累加器高字节 (ACCH):存储在累加器 (ACC) 的最高有效位。

另请参见累加器。

累加器低字节 (ACCL):存储在累加器 (ACC) 的最低有效位。

另请参见累加器。

活动时间:显示帧不处于消隐状态的时间间隔。

显示像素的时间间隔。

另请参见消隐。

(TMS320C8x)活动窗口:当前选定用于移动、调整大小、编辑、关闭或一些其它功能的窗口。

传动器:将电子控制信号转换为物理操作的器件。

传动器可用于流控制阀、泵、定位驱动器、电机、开关、继电器和仪表。

A/D:请参见模拟到数字。

ADC:请参见模数转换器。

ADC 位:请参见检测完成位。

地址:存储在存储器中的程序代码或数据的逻辑位置。

寻址模式:指令解释其操作数来获取所需数据的方法。

寻址阶段:并行处理器的获取、寻址、执行 (FAE) 管道的第二阶段,在此过程中地址将计算得出并提供给 crossbar。

DSP代码释义

DSP代码释义

•装载累加器–LACC:左移装载累加器•LACC dma [,shift]•LACC dma ,16•LACC ind [,shift[,ARn]]•LACC ind ,16[,ARn]•LACC #lk [,shift]–LACL:装载累加器低位并清累加器高位•LACL dma•LACL ind[,ARn]•LACL #k–LACT:按TREG规定左移后再转载入累加器•LACT dma•LACT ind[,ARn]–PAC:用乘积寄存器PREG装载累加器,移位方式由ST1中的PM确定•PAC•装载临时寄存器TREG–LT:将指定数据存储器的内容装入TREG。

常作乘法的准备工作。

•LT dma•LT ind[,ARn]–LTA:装载TREG同时累加前次乘积•LTA dma•LTA ind[,ARn]–LTD:装载TREG,累加前次乘积并移动数据•LTD dma•LTD ind[,ARn]–LTP:装载TREG,并将PREG值保存至累加器•LTP dma•LTP ind[,ARn]–LTS:装载TREG并减去前次乘积•LTS dma•LTS ind[,ARn]•装载辅助寄存器AR–LAR:装载辅助寄存器•LAR ARx,dma•LAR ARx,ind[,ARn]•LAR ARx,#k•LAR ARx,#lk–MAR:修改辅助寄存器•MAR dma•MAR ind[,ARn]•装载其它寄存器–LDP:装载数据页指针•LDP dma•LDP ind[,ARn]•LDP #k–LPH:装载乘积寄存器高位字•LPH dma•LPH ind[,ARn]–LST:装载状态寄存器•LST #m,dma•LST #m,ind[,ARn]存储寄存器值•保存AR值(SAR)–SAR ARx, dma–SAR ARx, ind[, ARn] •保存PREG高位字(SPH)–SPH dma–SPH ind[, ARn]•保存PREG低位字(SPL)–SPL dma–SPL ind[, ARn]•保存状态寄存器ST0和ST1(SST)–SST #m, dma–SAR #m, ind[, ARn]堆栈操作•出栈至ACC低位字(POP )–POP•ACC低位字入栈(PUSH )–PUSH•出栈至数据存储器(POPD )–POPD dma–POPD, ind[, ARn]•数据存储器值入栈(PSHD )–PSHD dma–PSHD ind[, ARn]读写数据或程序存储器•数据存储器至数据存储器的块移动(BLDD )–BLDD #lk,dma–BLDD #lk,ind[, ARn]–BLDD dma ,#lk–BLDD ind ,#lk[, ARn] •程序存储器至数据存储器的块移动(BLPD )–BLPD #pma, dma–BLPD #pma, ind[, ARn] •片内数据存储器中的数据传送(DMOV )–DMOV dma–DMOV ind[, ARn]•长立即数写入数据存储器(SPLK )–SPLK #lk, dma–SPLK #lk, ind[, ARn]•读程序存储器(表读)(TBLR )–TBLR dma–TBLR ind[, ARn]•写程序存储器(表写)(TBLW )–TBLW dma–TBLW ind[, ARn]读写I/O单元•读I/O单元(IN )–IN dma, PA–IN ind, PA[, ARn]•写I/O单元(OUT )–OUT dma, PA–OUT ind, PA[, ARn]加法•左移加至ACC(ADD)–ADD dma [,shift]–ADD dma ,16–ADD ind [,shift[,ARn]]–ADD ind ,16[,ARn]–ADD #k–ADD #lk [,shift]•带进位位加至ACC (ADDC)–ADDC dma–ADDC ind [,ARn]•抑制符号扩展加至ACC (ADDS)–ADDS dma–ADDS ind [,ARn]•按TREG低4位规定左移加至ACC (ADDT)–ADDT dma–ADDT ind [,ARn]•加短立即数至当前AR(ADRK)–ADRK #k减法•左移后从ACC中减去(SUB)–SUB dma [,shift]–SUB dma ,16–SUB ind [,shift[,ARn]]–SUB ind ,16[,ARn]–SUB #k–SUB #lk [,shift]•带借位从ACC中减去(SUBB)–SUBB ind [,ARn]•条件减(SUBC):常用来实现除法–SUBC dma–SUBC ind [,ARn]•抑制符号扩展减(SUBS)–SUBS dma–SUBS ind [,ARn]•按TREG低4位左移后从ACC中减去(SUBT)–SUBT dma–SUBT ind [,ARn]•当前AR减去短立即数(SBRK)–SBRK #k•ACC减去PREG(SPAC)–SPAC•SUBC实现16位数除法的步骤–被除数(必须为正)置于累加器低位字中,且最高位放在bit15中,累加器高位字清零;–除数(必须大于0)放入数据存储单元中;–执行SUBC指令16次;–除的结果:商在累加器低位字;余数在累加器高位字。

DSP汇编程序解读小程序

DSP汇编程序解读小程序

.include "f2407.h".def _c_int0.datadata0 .word 0 将0的值装入到data0 下面同样data1 .word 1data2 .word 2data3 .word 3data4 .word 4udata5 .word 5data6 .word 6data7 .word 7CALL SYSINIT ;无+统初始化.text_c_int0:LDP #DP_B01 ;数据页指针;DP_B01=4;将4赋给指针DPLACC data0 ;data0 的值赋给累加器ACCADD #1 ;累加器ACC加1SACL data1 ;将ACC的值加1后的值装入到data1中NOP ;空操作(什么也不作)MAR *, AR1 ;定义AR1(系统提供的8个辅助寄存器AR0—AR7中的一个) LAR AR1,#data3 ;将data3的地址的值赋给AR1LACC data2 ;将data2的值给累加器(若# data2则为将data2的地址值给累加器)ADD * ;ACC=ACC+*AR1SACL data3 ;将累加器中的值与AR1所指向的值相加后的值装入到data3 NOPLACC #100 ;将100的值给了累加器ACC(若##100则意思是100的地址值给累加器)LAR AR1, #data4 ;将data4的地址的值赋给AR1ADD *+ ;ACC=ACC+*AR1;AR1=AR1+1SACL data5 ;将累加器中的值与AR1所指向的值相加后的值装入到data5NOPLACC #10 ;将10的值给了累加器ACC(若##10则意思是10的地址值给累加器)LAR AR1,#data6LAR AR0,#2ADD *0+ ;ACC =ACC+*AR1;AR1 =AR1+AR0SACL data7NOPLOOP: NOPSYSINIT: SETC INTM ;关中断CLRC SXM ;符号扩展有效(有关正负号1和0的,扩展后不乱)CLRC OVM ;溢出模式CLRC CNF ;B0数据存储器使用(SETC CNF是程序数据存储器)LDP #0E0HSPLK #0200H, SCSR1;30M ;将值0200送到寄存器SCSR1中(30M不使用任何模块)-(相当于单片机中的MOV)SPLK #6FH, WDCR ;看门狗控制寄存器(监视程序运行,用运行的时间来监视)LDP #0SPLK #0000H, IMR ;中断屏蔽寄存器(IMR)SPLK #0FFFFH, IFR ;中断标志寄存器(IFR)RET.END另外的;SETC INTM ; 关(掉)中断CLRC SXM ;符号扩展有效(有关正负号1和0的,扩展后不乱)CLRC OVM ;。

DSP C语言程序设计中几个重要的关键字

DSP C语言程序设计中几个重要的关键字
DSP C语言程序设计中几个重要的关键字

关键字
const
使用格式
const数据类型变量名
作用
优化存储器的分配。const表示变量值为常数,不可改变,这样CCS在进行编译的时候就会将这些常数放在程序存储空间中。比如LCD显示的内容等。
举例
constunsigned char LCD[3] = {0x01, 0x02, 0x03};
作用
表示该函数是中断服务函数,这样CCS在编译时会自动添加保护现场、恢复现场等操作。
举例
interruቤተ መጻሕፍቲ ባይዱt void INT14_ISR(void)
{
……
}

关键字
volatile
使用格式
volatile数据类型变量名
作用
volatile修饰的变量不仅可以被C程序本身修改,还可以被硬件修改,即变量是“易变的”(volatile的原意)。常用于声明存储器、外设寄存器等。
举例
volatilestructCPUTIMER_REGS *RegsAddr;

关键字
cregister
使用格式
cregister数据类型变量名
作用
在F281x的C语言中,cregister仅用于声明寄存器IER和IFR,表示允许高级语言直接访问控制寄存器。
举例
cregistervolatile unsignedintIFR;

关键字
interrupt
使用格式
interrupt void function(void)

dsp指令语法说明

dsp指令语法说明

指令语法说明dma数据存储器地址的7位最低有效位,它与数据页面指针(DP)构成一个完整的16位数据存储器地址。

pma 16位程序存储器地址。

shift左移0~15位(缺省为0)。

ARn n为数值0~7,ARn指定下次的辅助寄存器。

ind选择以下7种符号之一。

*,*+,*-,*0+,*0-,*BR0+,*BR0-。

# 立即寻址方式中常用的前缀。

数值前面带“#”,表示该数值为一个立即数。

例如:ADD #3h,表示累加器的内容和3h相加。

数值前面不带“#”,表示该数值为间接寻址中在数据指针DP所选定的据存储器页面内的偏移量。

例如:ADD 3h,表示累加器的内容与数据指针DP所选定的当前页面内的3h单元的内容相加。

k8位短立即数。

lk16位长立即数。

在指令格式中用k和lk来区分8位和16位的立即数(在实际指令书写中长立即数前面不带“l”)。

例如:ADD #222h,1;将长立即数222h左移1位与累加器内容相加,222h前就不带“l”。

[, x]操作数x是可选项。

[x1[, x2]] 操作数x1和x2是可选项,如果若不写x1,也就不能写x2。

例如指令ADD ind[, shift[, ARn]]中必须提供ind,而shift和ARn可以缺省,* 但若没有shift,就不能写ARn。

如ADD *+ 还可以包括可选项shift,如ADD *+, 5。

** 如果希望包含ARn,即使不移位,也必须写上shift,如ADD *+,0,AR2操作数0表示不移位,但必须写。

ADD *+,AR2是错误指令。

DSP汇编语言程序设计

DSP汇编语言程序设计
圆括号内的表达式最先运算,不能用{ }或[ ]来代 替( )。
TMS320C54x汇编器的优先级使用与C语言类似, 优先级高的运算先执行。 表4-1给出了表达式中可用的 运算符及优先级。
表4-1 表达式的运算符及优先级
符号 +、−、~ *、/、% <<、>> +、− <、<=、>、>= !=、= & ^ |
若B为… 绝对 外部 可重新定位 绝对 可重新定位 外部 绝对 可重新定位 外部
则A+B为… 绝对 外部 可重新定位 可重新定位 非法 非法 外部 非法 非法
则A−B为… 绝对 非法 非法 可重新定位 绝对 非法 外部 非法 非法
4.1.3 TMS320C54x伪指令 TMS320C54x伪指令给程序提供数据、控制汇编过程。具体
设置16位无符号整型量 设置16位带符号整型量 为未初始化的变量保留存储空间
.sect “段名”[,段起点]
建立包含代码和数据的自定义段
符号 .usect “段名” ,字数
为未初始化的变量保留存储空间的自定义段
.def 变量1[,…,变量n]
在当前模块中定义,并可在别的模块中使用
.ref 变量1[,…,变量n]
4.2.2 顺序结构程序 顺序结构是最基本、最简单的程序结构形式,程序
中的语句或结构被连续执行。
【例1】 试编制程序,求出下列公式中z的值。 z=(x+y)×8-w 源程序编制如下:
************************************************
* ex41.asm z=(x+y)*8-w
在当前模块中使用,但在别的模块中定义

DSP应用程序设计解读PPT文档112页

DSP应用程序设计解读PPT文档112页
11、越是没有本领的就越加自命不凡。——邓拓 12、越是无能的人,越喜欢挑剔别人的错儿。——爱尔兰 13、知人者智,自知者明。胜人者有力,自胜者强。——老子 14、意志坚强的人能把世界放在手中像泥块一样任意揉捏。——歌德 15、最具挑战性的挑战莫过于提升自我。——迈克尔·F·斯特利
DSP应用程序设计解读

26、我们像鹰一样,生来就是自由的 ,但是 为了生 存,我 们不得 不为自 己编织 一个笼 子,然 后把自 己关在 里面。 ——博 莱索

27、法律如果不讲道理,即使延续时 间再长 ,也还 是没有 制约力 的。— —爱·科 克
•ห้องสมุดไป่ตู้
28、好法律是由坏风俗创造出来的。 ——马 克罗维 乌斯

29、在一切能够接受法律支配的人类 的状态 中,哪 里没有 法律, 那里就 没有自 由。— —洛克

30、风俗可以造就法律,也可以废除 法律。 ——塞·约翰逊
谢谢

DSP指令解释

DSP指令解释

word格式-可编辑-感谢下载支持1.STM #8765,*AR7+ 把立即数8765存放到AR7所指定的数据存储单元中去2.MPY #-2,A 立即数-2与T寄存器中的值相乘,并将乘积装入累加器A中3.MVPD TABLE,*AR1+把中TABLE标注的程序存储器单元地址中的一个字复制到由AR4所指定的数据存储单元中去。

4.BC new,AOV 若累加器A溢出,则跳转至new5.BC new,AGT 若累加器A中的值大于0,则跳转至new6.STL A,*AR1+ 把累加器A低端存放到AR1所指定的数据存储单元中7.PRTZ A,#4 对A清零并设置重复执行下条指令5次8.ADD *AR4,16,B,A将AR4所指定的数据存储单元中的值左移16后的值与累加器B中的值相加,并把结果装入累加器A中9.SUB *AR3+,14,A 累加器A中的值减去AR3所指定的数据存储单元中的数左移14位后的值,并将结果装入累加器A中。

即:从累加器A中减去AR3所指定的数据存储单元中的数左移14位后的值的值。

10.MAC #345H,A,B将T寄存器中的值与立即数345的乘积加上累加器A中的值所得到的和装入累加器B中。

11.STA, *AR4-(ASM=0)将累加器A中的值存储到AR4所指向的数据存储单元中。

12.MAC *AR3+,*AR4+,A,BAR3所指定数据存储单元中的值与AR4所指定数据存储单元中的值相乘,将乘积与累加器A中的值相加所得到的和装入累加器B中13.SUB #12345,8,A,B把累加器A中的值与立即数12345左移8位后的值相减所得到的差装入累加器B14.RPT #99NOP重复执行NOP指令100次15.MVDD *AR3+,*AR5+将AR3所指定的数据存储单元中的值传送到AR5指定的数据存储单元中。

16.CALA A 用累加器A的滴16位加载PC17.ST T,*AR7- T寄存器高端移位后存储到AR7所指定的数据存储单元中。

DSP指令大全(最全)

DSP指令大全(最全)

DSP指令大全(最全)附录6 TMS320C54x 指令系统一览表(按指令功能排列) 一、算术运算指令二、逻辑运算指令三、程序控制指令6.注:?条件―真‖,§条件―假‖,※延迟指令。

四、加载和存储指令4.6.7.五.伪指令2.初始化常数(数据和存储器)的伪指令3.调整段程序计数器伪指令(SPC).align 把SPC调整到页边界.even 把SPC调整到偶数字边界4.控制输出列表格式化伪指令5.条件汇编伪指令.break [well-defined expression] 如果条件真结束.loop汇编,.break结构是可选项.else 如果.if条件为假,汇编代码块.else结构是可选项.elseif well-defined expression——如果if条件为假且.elseif 条件为真,汇编代码块.else结构是可选项.endif 结束.if代码块.endloop 结束.1oop代码块.if well-defined expression 如果条件为真则汇编代码块.loop [well-defined expression] 开始代码块的重复汇编6. 汇编符号.asg [”] character string [”],substitution symbol——把字符串赋予替代的符号..endstruct 结束结构定义.equ 使值和符号相等.eval well-defined expression,substitution symbol 根据数字替代符号完成运算.newblock 取消局部标号.set 使数值和符号相等.struct 开始结构定义.tag 把结构属性赋予标号7.宏指令宏定义:Macname .macro[参数1],[…],[参数n]宏调用:[标号][:] macname [参数1],[…],[参数n]8.编译软件指令①汇编器:asm500.exeasm500[input file[object file [listing file] [-options]]-c—使汇编语言文件中大小没有区别。

DSP知识点

DSP知识点

DSP知识点1:自定义数据段#pragma DATA_SECTION(symbol,".section")Int32 symbol[LENGTH];2:前几天遇到一个问题。

dsp在执行某一块算法执行的时间太长达到100多ms。

这个时间后面通过设置ccs的一些优化选项。

减少到42ms。

这还是不能达到我们的需求。

后来知道我没打开cache。

所以执行的时间很长。

在网上找了好久也没一个确切的办法打开cache。

因此在此我详细的给出打开cache的方法。

希望能给菜鸟们一点帮助。

我也是菜鸟。

大家一起进步。

如果又不对的地方请老鸟们指正,谢谢。

#define L2CFG *(unsigned int*)(0x01840000) //6747 L2配置缓冲区寄存器宏定义#define L1PCFG *(unsigned int*)(0x01840020) //6747 L1程序配置缓冲区寄存器宏定义#define L1DCFG *(unsigned int*)(0x01840040) //6747 L1数据配置缓冲区寄存器宏定义void init_cache(void){L1PCFG = 4;L1DCFG = 4;L2CFG = 0x01010002;}CMD文件-l rts64plus.lib-l C6747bsl.lib-stack 0x00001000 /* Stack Size */-heap 0x00001000 /* Heap Size */ MEMORY{VECS: o = 0x80000000 l = 0x00000f00 ARMRAM: o = 0xFFFF0080 l = 0x00001f80 DSPL2RAM: o = 0x00800000 l = 0x00040000 DSPL1PRAM: o = 0x00E00000 l = 0x00008000 DSPL1DRAM: o = 0x00F00000 l = 0x00008000 DSPL2RAM2: o = 0x11800000 l = 0x0003FFFF DSPL1PRAM2: o = 0x11E00000 l = 0x00008000 DSPL1DRAM2: o = 0x11F00000 l = 0x00008000SHAREDRAM: o = 0x80000f00 l = 0x0001ffff SDRAM: o = 0xC0000000 l = 0x20000000 }SECTIONS{".vectors" > VECS.bss > DSPL2RAM.cinit > DSPL2RAM.cio > DSPL2RAM.const > DSPL2RAM.stack > DSPL2RAM.sysmem > DSPL2RAM.text > DSPL2RAM.switch > DSPL2RAM.far > DSPL2RAM.calcbuffer > DSPL2RAM.compxbuf > DSPL2RAM.bufs > SHAREDRAM.audiobuffer > SDRAM.buffertemp > SDRAM.compxbuffer > SDRAM}The DATA_SECTION pragma allocates space for the symbol in a section called section name.The syntax for the pragma in C is:#pragma DATA_SECTION (symbol, "section name");定义一个数据段:段名为: "section name"段的内容在: symbol 里在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令#pragma CODE_SECTION#pragma DATA_SECTION其中data_section是针对数据空间的,code_section是针对程序空间的,具体的使用办法是#pragma DATA_SECTION(bufferB, ”my_sect”)char bufferB[512];在.cmd文件中建立对应的section就可以使用了。

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

DSP程序注释
2006-08-18 18:55
DSP5402程序注释
2004年3月30日作者:浙江大学微系统公司
实验一
关于本程序的整体说明:
本程序的目的是利用5402进行处理,在屏幕上显示“hello,world!”其中使用了 #ifdef FILEIO 来选择是否输入字符串。

流程图如下:
定义了 FILEIO 么?
|
/ \
Y / \ N
输出“hello,world!” 输出“hello,world!”
| |
要求输入字符串 OVER
|
输出读入字符串大小
|
OVER
/* ======= hello.h ========== 头函数
struct PARMS { /*头函数中仅定义了一个结构体 PARMS*/
int Beta;
int EchoPower;
int ErrorPower;
int Ratio;
struct PARMS *Link;
};
======================= */
/* ======== hello.c ======== */
#include <stdio.h>
#include "hello.h"
#define BUFSIZE 30 /*定义BUFSIZE(缓冲空间)为30*/
struct PARMS str = /*全局变量是一个结构体 str*/
{
2934, /*Beta = 2934*/
9432, /*EchoPower = 9432*/
213, /*ErrorPower = 213*/
9432, /*Ratio = 9432*/
&str /*Link 是指向str自己的指针。

本程序中并未使用*/
}; /*PARAMS是在hello.h中定义的结构类型*/
/*
* ======== main ======== 主函数
*/
void main()
{
#ifdef FILEIO /*第一次运行程序时,FILEIO没有定义,此处不执行,只执行puts()一句。

*/
int i;
char scanStr[BUFSIZE]; /*输入字符存入scanStr数组中*/
char fileStr[BUFSIZE]; /*存储从文件中读出的内容*/
size_t readSize; /* size_t 是在stdio.h中定义的无符号整型,用来存储输入字符数目*/
FILE fptr; /*FILE是在stdio.h中定义的一结构变量,用来记录控制输入输出流的所有信息,fprt是文件指针*/
#endif
/* 向标准输出设备写一字符串*/
puts("hello world!\n");
#ifdef FILEIO
/*清除字符型数组*/
for (i = 0; i < BUFSIZE; i++) {
scanStr[i] = 0 /* 预置的语法错误(少一个“;”)*/
fileStr[i] = 0;
}
/* 从输入设备读入一字符串,并存入scanStr数组中 */
scanf("%s", scanStr);
/*在主机上打开一文件,然后向文件写入刚才的字符串 */
fptr = fopen("file.txt", "w");
fprintf(fptr, "%s", scanStr);
fclose(fptr);
/* 在主机打开一文件,然后从中读入字符串 */
fptr = fopen("file.txt", "r");
fseek(fptr, 0L, SEEK_SET); /*SEEK_SET是stdio.h中通过宏定义定义的常量0x0000*/
/*此句如果没有,运行结果不改变,此处为了保证程序的规范(修改方便)*/
readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr); /*获取文件大小,即输入字符数目*/ printf("Read a %d byte char array: %s \n", readSize, fileStr); /*输出“Read a ??(数字) byte char array: ??????(字符串)”*/
fclose(fptr); /*关闭文件*/
#endif
}
实验二
/* ======== hello.c ======== */
/* DSP/BIOS 头文件*/
#include <std.h>
#include <log.h>
/* 被配置工具创建的对象*/
extern far LOG_Obj trace;
/* ======== main ======== */
Void main()
{
LOG_printf(&trace, "hello world!"); /*本程序简单,仅有一句话意思很明了了。

*/
/* 返回后进入DSP/BIOS闲置循环 */
return;
}
实验三
/* ======== volume.h ======== */
#ifndef __VOLUME_H
#define __VOLUME_H#ifndef TRUE
#define TRUE 1
#endif
#define BUFSIZE 0x64
#define FRAMESPERBUFFER 10
#define MINGAIN 1
#define MAXGAIN 10
#define MINCONTROL 0
#define MAXCONTROL 19
#define BASELOAD 1
#endif /* __VOLUME_H */
/*一些宏定义,定义了一些常量*/
#include <stdio.h>
#include "volume.h"
/*定义全局变量 */
int inp_buffer[BUFSIZE]; /* 设置输入输出数据缓冲区 inp_buffer 和 out_buffer 大小为 0x64*/ int out_buffer[BUFSIZE];
int gain = MINGAIN; /* 增益设置,MINGAIN代表1,在volume.h中定义的 */
unsigned int processingLoad = BASELOAD; /*BASELOAD大小为1,也是在volume.h中定义的*/ extern void load(unsigned int loadvalue); /*该函数是一个汇编的处理函数,具体分析见后文*/ static int processing(int *input, int *output);
static void dataIO(void); /*定义了三个函数load、processing、dataIO*/
/* ======== main ======== */
void main()
{
int *input = &inp_buffer[0]; /*指针赋初值*/
int *output = &out_buffer[0];
puts("volume example started\n"); /*输出一句话*/
/* 下面是一个无限循环 */
while(TRUE)
{
/* 使用探测器来连接住机上的文件. */
dataIO(); /*调用dataIO函数,实际上,dataIO是一个空函数。

*/
processing(input, output); /*调用processing函数*/
} /*dataIO是一个空函数,实际上主函数完成的是对processing函数的无限次调用。

*/
}
/* ======== processing ======== *
对输入信号进行数字信号处理变换.
参数:输入输出缓冲区的地址 */
static int processing(int *input, int *output) /*函数processing*/
{
int size = BUFSIZE;
while(size--){
*output++ = *input++ * gain;
} /*根据输入信号和gain大小,对输出信号进行赋值*/
/* load辅助程序*/
load(processingLoad);
return(TRUE);
}
/* ======== dataIO ======== *
读入输入信号,写输出信号 */
static void dataIO()
{
return;
}
;load函数,是一个保存在load.asm中的汇编函数。

这里,就涉及到混编。

DSP处理程序的一般形式在这里就看到了。

过程的控制,使用C语言,利用高级语言较强的逻辑功能。

处理的过程,则使用汇编语言,以提高处理速度,达到实时信号处理的要求。

简单介绍一下load函数,这里不讲汇
编语言的语言及其格式了,只说明一下这个函数的作用。

该函数通过执行N*loadvalue来模仿在DSP上的一个负载。

相关文档
最新文档