DSP编程的几个关键问题
DSP常见问题及解决

问:我测试你们的程序的时候,go main 进不去主函数,进入的是一段汇编。
是怎么回事?答:程序如果要进行设断点,观察变量等操作,要先调入project文件,然后再调入out文件。
如果是可以直接执行能看到结果的,就直接调入out文件,run就可以。
问:CY68013的固件程序怎么修改?答:在把QQ2812都研究清楚了,有精力有兴趣自己可以买一本EZ-USB的书好好看看。
在此之前,请不要随便更改固件代码,因为一旦出错,可能带来不必要的麻烦。
固件代码是通过USBControlPanel,使用USB接口进行下载的。
:2812的主频是最大150M,我如果想设为100M是在那里设置?答:打开工程,在Source文件夹下,打开DSP28_SysCtro.c文件,找到如下语句,修改即可。
// Initalize PLLSysCtrlRegs.PLLCR = 0x02;///锁相环产生的时钟频率定标,这里配置为30M问:为什么我的程序在SRAM中正常,烧入Flash后不对?答:1、请先确认你编译的时候使用了flash.cmd,推荐使用我们提供的flash.cmd,如果自己更改了这个文件,请先确认cmd文件的正确性;2、编译的时候,如果选择release模式,请检查一下build option,把其中的opt level改为none,即取消编译优化选项,很多语句在优化的时候可能会产生错误的优化结果。
或者选择debug模式编译,烧写正确后再改为release模式,通过对比两种模式的编译选项也能看出其中的区别。
3、程序在flash中运行会比在ram中运行大概慢20%,因此对于一些时序敏感的外设,比如usb总线,就有可能需要调整时序,否则就会有问题。
问:数码管LED显示的时候发送的数据是怎么规定和产生的?答:其实如果自己看程序和原理图自己就可以知道是怎么产生的。
数码管数据如下:Uint16SpiCode[]={0x7E7E,0x2929,0x2c2c,0x6666,0xa4a4,0xa0a0,0x3e3e,0x2020,0x2424,0x22 22,0xe0e0,0xb1b1,0x6868,0xa1a1,0xa3a3,0xffff,0xdfdf};数码管的笔画对应关系如下:63 742 01 5就是说0~7分别对应笔画的a~h,在原理图看就是分别连接的Q0~Q7这个数码管的型号是LG3611BH,是共阳级的,也就是说某个笔画为0的时候,这个笔画被点亮。
DSP常见问题及解决

问:我测试你们的程序的时候,go main 进不去主函数,进入的是一段汇编。
是怎么回事?答:程序如果要进行设断点,观察变量等操作,要先调入pro ject文件,然后再调入ou t文件。
如果是可以直接执行能看到结果的,就直接调入ou t文件,run就可以。
问:CY68013的固件程序怎么修改?答:在把QQ2812都研究清楚了,有精力有兴趣自己可以买一本EZ-USB的书好好看看。
在此之前,请不要随便更改固件代码,因为一旦出错,可能带来不必要的麻烦。
固件代码是通过USBCon trolPa nel,使用USB接口进行下载的。
:2812的主频是最大150M,我如果想设为100M是在那里设置?答:打开工程,在Source文件夹下,打开DSP28_SysCt ro.c文件,找到如下语句,修改即可。
// Initali ze PLLSysCtrl Regs.PLLCR = 0x02;///锁相环产生的时钟频率定标,这里配置为30M问:为什么我的程序在SRAM中正常,烧入Flash后不对?答:1、请先确认你编译的时候使用了flash.cmd,推荐使用我们提供的flas h.cmd,如果自己更改了这个文件,请先确认cmd文件的正确性;2、编译的时候,如果选择rel ease模式,请检查一下bu ild option,把其中的opt level改为none,即取消编译优化选项,很多语句在优化的时候可能会产生错误的优化结果。
或者选择deb ug模式编译,烧写正确后再改为relea se模式,通过对比两种模式的编译选项也能看出其中的区别。
3、程序在flas h中运行会比在ram中运行大概慢20%,因此对于一些时序敏感的外设,比如usb总线,就有可能需要调整时序,否则就会有问题。
DSP编程中几个关键问题的探究

义 ,1e cI 。  ̄.f a y 汇编语 言程序巾使用 的局部变 d T 量不需定义 , 可直接声 明,例如 t _ u .o r nm wr n d O h 如果在两个 am文件中有 两个都没有定义 O。 s 的同名变量 ,则编译程序会 认为分f 不是 同 门 变量 。在汇编程序 的开头应 有. m e s m r 宏语 g 句 。它一方 面表示对 默认定义的确认 (h hr a , ,n bt 等) , 另一方面可以对所用寄存器雨新定义 。 : 如
AR4 (/ 、)
其他易导致歧义 的语句还有 : L R , ; A 5 D A 5A 把 R 的内容送人寄存器 A
( X)
确结果 。 因为 C到 A M的汇编有默认的人 口c S — i0 , n 0 从这开始 的一段程序为 C程序的运行做 t 准备工 作。 这些工作包括初 始化变量 、 设置栈指 针等 ,相 当于 系统壳 不能 耐跨越 。这时可在 . c d文件 中去 掉语 句 :em i—tt m - a sr ^ n a 。如仍想执 行某些汇编程序 , 可以 c函数的形式执行 , : 如 ma n s r ;/ i tt , a0 其中含有其 他汇编程序 但前 提是 在汇 编程 序 中把 _ a _t t m ns r作 i a 为首地址 , 序以 rt结 尾 ( 为可调用 的函 程 e e 作 数 ) 的 程 序 段 , 并 在 汇 编 程 序 中 引 用
摘 要 :对 D P串 口的 D A传 榆 方式 使 用 中可能遇 到 的疑 难 问题 、汇编指 令歧 义及 C语 言 混合 编程 容 易犯 的错 误作 了分析 , S M 对 B o od编 程的疑 难点做 出 了相应 实例 解释 。 ot a l
关 键 词 : 编 指 令 的 歧 义 ; ot a u ; l — rme 汇 B oI d B g Mut F a o i
dsp编译错误与解决方法

dsp编译错误与解决方法dsp--ccs部分错误及解决1,ERROR multiple sections with name PAGE0解决 PAGE 0 中间有个空格隔开。
2 ERROR MEMORY specification ignored解决书写格式错误3 ERROR:zero or missing length for memory area SPRAMSPRAM: origin=0x0060H, 解决书写格式错误4 W ARNING: entry point other than _c_int00 specified解决,在“TMS320C6000优化汇编手册”第五章“链接C/C++代令人生厌的multiple definition of我把所有的全局变量写在一个global.h里然后其他文件都include 了它于是出现了multiple definition of ..... 编译器gcc ) 后来在网上搜到了很多类似的错误大家各有各的烦心事。
我的代码结构main.cpp#include "global.h"WinMain(....)...}file_1.cpp#include "global.h"....file_2.cpp#include "global.h"...由于工程中的每个文件都是独立的解释的即使头文件有#ifndef _x_h....#enfif )在其他文件中只要包含了global.h 就会独立的解释,然后生成每个文件生成独立的标示符。
在编译器连接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。
下面是解决方法在global.c或.cpp) 中声明变量然后建一个头文件global.h 在所有的变量声明前加上extern ... 如extern HANDLE ghEvent; 注意这儿不要有变量的初始化语句。
DSP的160个经典问题

[原创]做DSP最应该懂得157个问题(回答)做DSP最应该懂得157个问题(回答)一.DSP系统设计100问一、时钟和电源问:DSP的电源设计和时钟设计应该特别注意哪些方面?外接晶振选用有源的好还是无源的好?答:时钟一般使用晶体,电源可用TI的配套电源。
外接晶振用无源的好。
问:TMS320LF2407的A/D转换精度保证措施。
答:参考电源和模拟电源要求干净。
问:系统调试时发现纹波太大,主要是哪方面的问题?答:如果是电源纹波大,加大电容滤波。
问:请问我用5V供电的有源晶振为DSP提供时钟,是否可以将其用两个电阻进行分压后再接到DSP的时钟输入端,这样做的话,时钟工作是否稳定?答:这样做不好,建议使用晶体。
问:一个多DSP电路板的时钟,如何选择比较好?DSP电路板的硬件设计和系统调试时的时序问题?答:建议使用时钟芯片,以保证同步。
硬件设计要根据DSP芯片的时序,选择外围芯片,根据时序设定等待和硬件逻辑。
二.干扰与板的布局问:器件布局应重点考虑哪些因素?例如在集中抄表系统中?答:可用TMS320VC5402,成本不是很高。
器件布局重点应是存贮器与DSP的接口。
问:在设计DSP的PCB板时应注意哪些问题?答:1.电源的布置;2.时钟的布置;3.电容的布置;4.终端电路;5.数字同模拟的布置。
问:请问DSP在与前向通道(比如说AD)接口的时候,布线过程中要注意哪些问题,以保证AD采样的稳定性?答:模拟地和数字地分开,但在一点接地。
问:DSP主板设计的一般步骤是什么?需要特别注意的问题有哪些?答:1.选择芯片;2.设计时序;3.设计PCB。
最重要的是时序和布线。
问:在硬件设计阶段如何消除信号干扰(包括模拟信号及高频信号)?应该从那些方面着手?答:1.模拟和数字分开;2.多层板;3.电容滤波。
问:在电路板的设计上,如何很好的解决静电干扰问题。
答:一般情况下,机壳接大地,即能满足要求。
特殊情况下,电源输入、数字量输入串接专用的防静电器件。
DSP编程的几个关键问题

DSP编程的几个关键问题汇编与C语言混合编程的关键问题7.1 C程序变量与汇编程序变量的共用为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:.ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff在汇编程序中引用而在C程序可直接定义的变量:unsigned char to_dte_buff[BUFF_SIZE]; //DSP发向PC机的数据int to_dte_num; //缓冲区中存放的有效字节数int to_dte_store; //缓冲区的存放指针int to_dte_read; //缓冲区的读取指针这样经过链接就可以完成对应。
7.2 程序入口问题在C程序中,程序的入口是main()函数。
而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为main _start。
这样,混合汇编出来的程序得不到正确结果。
因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。
这些工作包括初始化变量、设置栈指针等,相当于系统壳不能跨越。
这时可在*.cmd文件中去掉语句:-e main_start。
如仍想执行某些汇编程序,可以C函数的形式执行,如:main_start(); //其中含有其他汇编程序但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即.ref _main_start。
7.3 移位问题在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。
所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。
解决的办法是在C程序中,把移位结果再用0X00FF去“与”一下即可。
7.4 堆栈问题在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。
DSP实验常见错误及解决方法

实验常见错误及解决方法1、启动CCS时出现如下错误:错误原因:以前在CCS setup里设置当前使用的平台为sdgo2xx(硬件仿真),或者同时设置为sdgo2xx 与c2xx simulator,所以进行软件仿真时应设置当前正在使用的为c2xx simulator。
解决方法有两种:方法1:点击“终止”,然后重新设置CCS setup,将sdgo2xx移除。
方法2:点击“忽略”,然后在“Parallel Debug Manager”中Open菜单下选择c2xx simulator2、编译连接时出现如下错误:错误原因是:文件命名、文件夹命名或保存位置不正确。
文件命名:不能以数字开头(包括mak文件的名字)文件夹命名:不能为中文保存位置:项目文件(mak文件)存储的位置一定要与其它文件(C文件、asm文件、h文件、cmd文件、等)放在同一目录下,且最好放在“x:\tic2xx\myprojects”目录下。
3、编译连接时出现如下错误提示:warning: entry point symbol _C_int0 undefined错误原因:用C语言开发的DSP程序在向工程文件添加文件时没有添加运行支持库文件rts2xx.lib注意rts2xx.lib的路径:在C:\tic2000\c2000\cgtools\lib目录下4、CCS与CCS setup均不能启动,提示:不能正确初始化程序或者CCS运行到某个地方后(例如编译连接后)不能停止,观察任务管理器,发现cc_app.exe占用CPU为100%,即CCS已经死了。
错误原因:CCS被病毒感染或破坏,或者多个版本CCS共存,相互干扰。
解决方法:方法1:重新启动电脑方法2:用运行正确的cc_app.exe程序替换被破坏的cc_app.exe程序。
5、编译连接通过,加载程序后,在运行时出现如下错误提示:错误可能原因:第一种可能:没有加载CMD文件第二种可能:CMD文件已加载,但CMD文件编写有问题,存储器配置、定位不正确第三种可能:用C语言编写的DSP程序,C初始化设置错误,已修改C Initialization 设置,方法:Project ——> Option——> Linker6、探测点设置不成功注意:①在设置探测点时应先加载程序②如下图所示,应先点击Probe Point中的选择框,使volume.c line 63——> No Connection被选中,然后在选Connect下拉菜单,找到相关联的数据文件,再点击Replace ,最后点“确定”。
做DSP最应该懂得的几个问题

---------------------------------------------------------------最新资料推荐------------------------------------------------------ 做DSP最应该懂得的几个问题做 DSP 最应该懂得的几个问题二.DSP 的 C 语言同主机 C 语言的主要区别? 1)DSP 的 C 语言是标准的 ANSI C,它不包括同外设联系的扩展部分,如屏幕绘图等。
但在 CCS 中,为了方便调试,可以将数据通过 prinf 命令虚拟输出到主机的屏幕上。
2)DSP 的 C 语言的编译过程为, C 编译为 ASM,再由 ASM 编译为OBJ。
因此 C 和 ASM 的对应关系非常明确,非常便于人工优化。
3)DSP 的代码需要绝对定位;主机的 C 的代码有操作系统定位。
4)DSP 的 C 的效率较高,非常适合于嵌入系统。
三.DSP 发展动态 1.TMS320C2019 TMS320C2019 系列包括C24x 和 C28x 系列。
C24x 系列建议使用 LF24xx系列替代C24x系列, LF24xx系列的价格比 C24x便宜,性能高于C24x,而且LF24xxA具有加密功能。
C28x 系列主要用于大存储设备管理,高性能的控制场合。
2.TMS320C3x TMS320C3x 系列包括 C3x 和 VC33,主要推荐使用 VC33。
C3x 系列是 TI 浮点 DSP 的基础,不可能停产,但价格不会进一步下调。
1 / 123.TMS320C5x TMS320C5x 系列已不推荐使用,建议使用C24x 或 C5000 系列替代。
4.TMS320C5000 TMS320C5000 系列包括 C54x 和 C55x 系列。
其中VC54xx 还不断有新的器件出现,如:TMS320VC5471(DSP+ARM7)。
C55x 系列是 TI 的第三代 DSP,功耗为 VC54xx 的 1/6,性能为 VC54xx 的 5 倍,是一个正在发展的系列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:对dsp串口的dma传输方式使用中可能遇到的疑难问题、汇编指令歧义及c语言混合编程容易犯的错误作了列举分析,对bootload编程的疑难点做出了实例解释。
关键词:汇编指令的歧义 bootload bug mcbsp multi-framedsp芯片凭其优异的性能在高速计算领域有着巨大的应用前景。
但其应用所涉及的知识非常庞杂。
本文以ti公司320c54x系列为蓝本进行提纯,所有认识都是笔者在实际工作中亲手实践所得。
当程序调不通不知该从何处下手时,此文也许会有所帮助。
这些关键点有些是tms320c5409所触有而有些是与dsp所共有的。
1 mcbsp(multichannel buffered serial port)串口利用dma中的多帧(multi-frame)方式通信的中断处理在实际通信应用中,一个突发之后,程序必须为下一个突发作准备。
因此一般采用串口的dma多帧方式但在串口以dma方式传输数据时却有一些问题要讨论。
首先dma的传输同步事件应设mcbsp的传输事件即xevt,这样一字节传输后会自动准备另一字节(mcbsp的ready上升沿触发dma传输)。
中断发生时意味着一个块已传完,这时dma的使能自动关闭,mcbsp的ready将一直保持高状态。
但是在下一次突发传输直接使能dma时却启动不了传输(相信会有许多我遇到此类问题)。
这是因为无法产生mcbsp触发启动所需的ready 上升沿。
解决办法是在中断程序中先关闭mcbsp的发送,使ready=0,随后在程序中发送使能dma,再打开mcbsp的发送即可。
如先打开mcbsp的发送后打开dma,也是不会工作的。
因为mcbsp的ready已经由0变到1了,无法再产生ready上升沿。
2 关闭dma与关闭mcbsp 的区别在通信领域,为了充分利用dsp的片上外设资源,常常利用dma把从串口来的数据或要发的数据放入缓冲区,再处理。
对dma而言,只要其在数据缓冲区的指针指向了中断应发生的位置,就产生中断。
但此时最后一个数据只是进入了mcbsp而并未真正发出去,所以在传送结束的中断程序中只能关闭dma不能关闭mcbsp。
因为此时mcbsp的发寄存器dxr中还有一个字没有发出。
3 mcbsp串口配置的关键时序主要是寄存器spcr2的配置:在保持rrst、xrst、frst各位为0的前提下,配置好其它串口控制寄存器。
等待至少2个clkr/t时钟以确保dsp内部的同步。
(1)可以向dxr装载数据或使能dma。
(2)使能grst(grst=1)(如果需要dsp内部产生采样时钟)。
(3)使能rrst或xrst,注意此时要保证spcr中仅有此一位发生改变。
(4)使能frst(frst=1)(如果需要dsp内部产生帧同步)。
(5)等待2个r/t clk 时钟周期后,收或发端便会有效。
4 汇编语言程序中的变量汇编语言程序中的公用变量应在文件中定义,如.def carry。
汇编语言程序中使用的局部变量不需定义,可直接声明,例如trn_num .word 00h。
如果在两个asm文件中有两个都没有定义的同名变量,则编译程序会认为分他们不是同一变量。
在汇编程序的开头应有.mmregs宏语句。
它一方面表示对默认定义的确认(ah,bh,trn等),另一方面可以对所用寄存器重新定义。
如:.mmregsdmprec .set 54h ;定义dma优先和使能寄存器地址在54hdmsa .set 55hdmsdn .set 57hdxr10 .set 23h ;定义串口1的发送寄存器地睛在23h5 st1寄存器中cpl位的影响cpl位是编译模式控制位,它表示在相对直接寻址时采用哪种指针。
当cpl=0时,使用页指针dp;当cpl=1时,使用堆栈指针sp。
实际使用中二者没有什么差别,但使用sp寻址的程序更易读。
在程序中经常使用cpl=1。
6 指令的歧义6.1 比较下面指令stlm b,ar4 ;把bl内容送入寄存器ar4 (×)stlm b,*ar4 ;把bl内容送入寄存器ar4 (√)前者实际执行的是把bl内容送入一个系统用的缓冲区,后者也可用:mvdm bl,ar4 ;把bl内容送入寄存器ar4 (√)其他易导致歧义的语句还有:ld ar5,a ;把ar5的内容送入寄存器a (×)ldm ar5,a ;把ar5的内容送入寄存器a (√)andm #0x107e,ar4;把#107e加到寄存器ar4 (×)andn #0x107e,*ar4;把#107e加到寄存器ar4 (√)仅对某些寄存器有效的指令:mvdd * ar2+,*ar3+ ;把以ar2为地址的内容拷入ar3的地址中此类指令用作数据块搬移特别有效,但仅对ar2、ar3、ar4、ar5有效。
易错语句中对程序运行危害最大的是:st #0,*(bsp0_out_sign) ;bsp0_out_sign是一个变量名(√)stm #0,bsp0_out_sign ;此语句被编译为stm #0,pmst或stm #0,imr (×)这种语句会导致程序运行中的随机故障,且极难发现。
6.2 流水冲突分析以下程序:stm
to_dce_buff,ar4ldm ar4,badd a,b ;b=ar4+almvdm bl,ar4 ;ar4=to-dce-buff+al实际上,上段程序得不到ar4=to-dce-buff+al的结果。
这是因为dsp一般采用深度为3~6级的流水结构,产生了无法解决的冲突,所以它不能被正确执行。
解决的办法是在赋值和引用之间插入一条或几条其他的指令,或nop语句即可。
7 汇编与c语言混合编程的关键问题7.1 c程序变量与汇编程序变量的共用为了使程序更易于接口和维护,可以在汇编程序中引用与c程序共享的变量:.ref_to_dce_num,_to_dte_num,_to_dce_buff,_to_dte_buff在汇编程序中引用而在c程序可直接定义的变量:unsigned char to_dte_buff[buff_size]; //dsp发向pc机的数据int to_dte_num; //缓冲区中存放的有效字节数int to_dte_store: //缓冲区的存放指针int to_dte_read; //缓冲区的读取指针这样经过链接就可完成对应。
7.2 程序入口问题在c程序中,程序的入口是main()函数。
而在汇编程序中其入口由*.cmd文件中的命令决定,如:-emain_start;程序入口地址为main_start。
这样,混合汇编出来的程序得不到正确结果。
因为c到asm的汇编有默认的入口c-int00,从这开始的一段程序为c程序的运行做准备工作。
这些工作包括初始化变量、设置栈指针等,相当于系统壳不能耐跨越。
这时可在*.cmd文件中去掉语句:-e main_start。
如仍想执行某些汇编程序,可以c函数的形式执行,如:main_start(); //其中含有其他汇编程序但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即.ref _main_start。
7.3 移位问题在c语言中把变量设为char型时,它是8位的,但在dsp汇编中此变量仍被作为16位处理。
所以会出现在c程序中的移位结果与汇编程序移位结果不同的问题。
解决的办法是在c程序中,把移位结果再用0x00ff去“与”一下即可。
7.4 堆栈问题在汇编程序中对堆栈的依赖很小,但在c程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。
而c编译器无法检查程序运行时堆栈能否溢出。
所以应尽量多给堆栈分配空间。
c编译器的默认大小为1kb。
在程序不正常跑飞时应注意检查是否堆栈溢出。
7.5 程序跑飞问题编译后的c程序跑飞一般是对不存在的存储区访问造成的。
首先要查.map文件并与memery map图对比,看是否超出范围。
如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。
如果在中断程序中调用了c程序,则要查汇编后的c程序中是否用到了没有被保护的寄存器并提供保护(在c程序的编译中是不对a、b等寄存器进行保护的)。