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 倍,是一个正在发展的系列。
DSP常见问题
在CCS下,OUT文件加载时提示“Data verification failed...”的原因?Link的CMD文件分配的地址同GEL或设置的有效地址空间不符。
中断向量定位处或其它代码、数据段定位处,没有RAM,无法加载OUT文件。
解决方法:1)调整Link的CMD 文件,使得定位段处有RAM。
2)调整存储器设置,使得RAM区有效如何选择外部时钟?DSP的内部指令周期较高,外部晶振的主频不够,因此DSP大多数片内均有PLL。
但每个系列不尽相同。
1)TMS320C2000系列:TMS320C20x:PLL可以÷2,×1,×2和×4,因此外部时钟可以为5MHz-40MHz。
TMS320F240:PLL可以÷2,×1,×1.5,×2,×2.5,×3,×4,×4.5,×5和×9,因此外部时钟可以为2.22MHz-40MHz。
TMS320F241/C242/F243:PLL可以×4,因此外部时钟为5MHz。
TMS320LF24xx:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。
TMS320LF24xxA:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。
2)TMS320C3x系列:TMS320C3x:没有PLL,因此外部主频为工作频率的2倍。
TMS320VC33:PLL可以÷2,×1,×5,因此外部主频可以为12MHz-100MHz。
3)TMS320C5000系列:TMS320VC54xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为0.625MHz-50MHz。
TMS320VC55xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为6.25MHz-300MHz。
做DSP之前我们该弄明白哪些基本问题2
十四.DSP芯片有多大的驱动能力?DSP的驱动能力较强,可以不加驱动,连接8个以上标准TTL门。
十五.调试TMS320C2000系列的常见问题?1)单步可以运行,连续运行时总回0地址:Watchdog没有关,连续运行复位DSP回到0地址。
2)OUT文件不能load到片内flash中:Flash不是RAM,不能用简单的写指令写入,需要专门的程序写入。
CCS和CSource Debugger中的load命令,不能对flash写入。
OUT文件只能load到片内RAM,或片外RAM中。
3)在flash中如何加入断点:在flash中可以用单步调试,也可以用硬件断点的方法在flash中加入断点,软件断点是不能加在ROM中的。
硬件断点,设置存储器的地址,当访问该地址时产生中断。
4)中断向量:C2000的中断向量不可重定位,因此中断向量必须放在0地址开始的flash内。
在调试系统时,代码放在RAM中,中断向量也必须放在flash内。
十六.调试TMS320C3x系列的常见问题?1)TMS320C32的存储器配置:TMS320C32的程序存储器可以配置为16位或32位;数据存储器可以配置为8位、16位或32位。
2)TMS320VC33的PLL控制:TMS320VC33的PLL控制端只能接1.8V,不能接3.3V或5V。
十七.如何调试多片DSP?对于有MPSD仿真口的DSP(TMS320C30/C31/C32),不能用一套仿真器同时调试,每次只能调试其中的一个DSP; 对于有JTAG仿真口的DSP,可以将JTAG串接在一起,用一套仿真器同时调试多个DSP,每个DSP可以用不同的名字,在不同的窗口中调试。
注意:如果在JTAG和DSP间加入驱动,一定要用快速的门电路,不能使用如LS的慢速门电路。
十八.在DSP系统中为什么要使用CPLD?DSP的速度较快,要求译码的速度也必须较快。
利用小规模逻辑器件译码的方式,已不能满足DSP系统的要求。
DSP系统设计时应该注意的问题
DSP系统设计时应该注意的问题一、时钟电路选择原则1、系统中要求多个不同频率的时钟信号时,首选可编程时钟芯片;2、单一时钟信号时,选择晶体时钟电路;3、多个同频时钟信号时,选择晶振;4、尽量使用DSP片内的PLL,降低片外时钟频率,提高系统的稳定性;5、C6000、C5510、C5409A、C5416、C5420、C5421和C5441等DSP片内无振荡电路,不能用晶体时钟电路;6、VC5401、VC5402、VC5409和F281x等DSP时钟信号的电平为1.8V,建议采用晶体时钟电路二、电平变换的方法1、总线收发器(Bus Transceiver):常用器件:SN74LVTH245A(8位)、SN74LVTH16245A(16位)特点:3.3V供电,需进行方向控制延迟:3.5ns,驱动:-32/64mA,输入容限:5V应用:数据、地址和控制总线的驱动2、总线开关(Bus switch)常用器件:SN74CBTD3384(10位)、SN74CBTD16210(20位)特点:5V供电,无需方向控制延迟:0.25ns,驱动能力不增加应用:适用于信号方向灵活、且负载单一的应用,如McBSP等外设信号的电平变换3、2选1切换器(1 of 2 Multiplexer)常用器件:SN74CBT3257(4位)、SN74CBT16292(12位)特点:实现2选1,5V供电,无需方向控制延迟:0.25ns,驱动能力不增加应用:适用于多路切换信号、且要进行电平变换的应用,如双路复用的McBSP4、CPLD3.3V供电,但输入容限为5V,并且延迟较大:>7ns,适用于少量的对延迟要求不高的输入信号5、电阻分压10KΩ和20KΩ串联分压,5V×20÷(10+20)≈3.3V三、未用的输入/输出引脚的处理1、未用的输入引脚不能悬空不接,而应将它们上拉或下拉为固定的电平:1)关键的控制输入引脚,如Ready、Hold等应固定接为适当的状态——Ready引脚应固定接为有效状态,Hold引脚应固定接为无效状态;2)无连接(NC)和保留(RSV)引脚,NC引脚——除非特殊说明,这些引脚悬空不接,RSV 引脚——应根据数据手册具体决定接还是不接;3)非关键的输入引脚,将它们上拉或下拉为固定的电平,以降低功耗;2、未用的输出引脚可以悬空不接;3、未用的I/O引脚如果缺省状态为输入引脚,则作为非关键的输入引脚处理——上拉或下拉为固定的电平;如果缺省状态为输出引脚,则可以悬空不接;电子电路的一些问题1.IC设计成开漏输出有什么好处呢?和不是开漏结构的都有什么特点?IC设计成开漏输出方便“线与”,比如说两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去。
dsp 编程注意问题
TI 的 DSP 为了提高安全性能,将很多关键寄存器作了保护处理。
通过状态寄存器 1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。
这些关键寄存器包括器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE 矢量表、系统控制寄存器、GPIO MUX 寄存器、eCAN 寄存器的一部分。
DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。
为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位。
在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1 的C6 位。
DSP编程过程中的几个关键问题的研究(精)
DSP编程过程中的几个关键问题的研究DSP编程过程中的几个关键问题的研究类别:单片机/DSP1 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。
DSP一些常见问题(1)
【转】DSP CCS初学调试问题汇总(2011-11-02 12:52:52)1.DSP/BIOS应用程序调试(2009.10.20)在CCS2.0的emulator写dsp/bios的程序,编译链接无错误,而点击LOAD Program下载xxx.out完成时弹出如下对话框:RTDX target application does not match emulation protocol!Loaded program was created with an rtdx library which does not match the target device这将导致RTDX(实时数据交换)不能使用分析:RTXD可以在DSP/BIOS中使用,也可以脱离DSP/BIOS使用;目前CCS Simulator不支持RTDX,故RTDX必须在Emulator下使用,即还需要硬件仿真器和DSP目标板。
故这是由于下载BIOS/DSP程序时RTDX设置错误导致的;问题解决如下:把DSP/BIOS配置窗口中的input/output-->RTDX -real-Time Exchange settings的RTDX mode 改为JTAG(原来是simulator),重新编译后LOAD,上述警告消除,可以在模拟的情况下进行BIOS调试了。
PS:虽然simulator能编译运行DSP/BIOS程序,并能提供实时查询程序运行情况(主要是CPU 负荷,时序,日志以及线程等)。
但实际开发DSP/BIOS应用程序时为了真实的了解目标板的各种信息,仅有Simulator(软件仿真器)是不行的,还需要使用Emulator(硬件仿真器)和DSP/BIOS插件(安装时已装入)。
2.RTDX应用程序调试(10.22)RTDX测试DSP Target传输数据到PC机:a)创建工程,编辑源代码(.c/。
asm),加入头文件(.h),库文件(.lib)以及链接命令文件(.cmd)b)添加修改具有实时数据传输的RTDX语句包括:#include <rtdx.h>; RTDX头文件(rtdx.h)RTDX_CreateOutputChannel( ochan );定义一个全局的PC机数据输出通道,通道名可以任取TARGET——INITIALIZE();初始化DSP目标系统;RTDX_enableOutput( &ochan );使能输出通道写数据;status=RTDX_write( &ochan,&data,sizeof(data) );传送数据至PC;RTDX_disableOutput( &ochan );禁止输出通道传输数据。
dsp最应弄懂的57个问题
dsp最应弄懂的57个问题二十.什么是boot loader?DSP的速度尽快,EPROM或flash的速度较慢,而DSP片内的RAM很快,片外的RAM也较快。
为了使DSP充分发挥它的能力,必须将程序代码放在RAM中运行。
为了方便的将代码从ROM中搬到RAM中,在不带flash的DSP中,TI在出厂时固化了一段程序,在上电后完成从ROM或外设将代码搬到用户指定的RAM中。
此段程序称为"boot loader"。
二十一.TMS320C3x如何boot?在MC/MP管脚为高时,C3x进入boot状态。
C3x的boot loader在reset时,判断外部中断管脚的电平。
根据中断配置决定boot的方式为存储器加载还是串口加载,其中ROM的地址可以为三个中的一个,ROM可以为8位。
二十二.Boot有问题如何解决?1)仔细检查boot的控制字是否正确。
2)仔细检查外部管脚设置是否正确。
3)仔细检查hex文件是否转换正确。
4)用仿真器跟踪boot过程,分析错误原因。
三十三.对于C5000,大于48K的程序如何BOOT?对于C5000,片内的BOOT程序在上电后将数据区的内容,搬移到程序区的RAM中,因此FLASH必须在RESET后放在数据区。
由于C5000,数据区的空间有限,一次BOOT的程序不能对于48K。
解决的方法如下:1.在RESET后,将FLASH译码在数据区,RAM放在程序区,片内BOOT程序将程序BOOT 到RAM中。
2.用户初试化程序发出一个I/O命令(如XF),将FLASH译码到程序区的高地址。
开放数据区用于其它的RAM。
3.用户初试化程序中包括第二次BOOT程序(此程序必须用户自己编写),将FLASH中没有BOOT的其它代码搬移到RAM中。
二.DSP的C语言同主机C语言的主要区别?1)DSP的C语言是标准的ANSI C,它不包括同外设联系的扩展部分,如屏幕绘图等。
但在CCS中,为了方便调试,可以将数据通过prinf命令虚拟输出到主机的屏幕上。
做DSP最应该懂的57个问题
几个DSP高手的经验介绍,编写基于DSP程序的注意事项[zt]一. 我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP 的开发写一写自己的感受,一家之言,欢迎指教。
我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是ISA总线的,我从206开始240、2407A都作过产品,对5402、2812、5471在产品方案规划制定和论证时也研究过。
由于方向所限对6X、8X系列没有接触。
我发现在国内无论在公司或高校许多地方为了加快开发周期往往把一个产品开发分为硬件和软件两个相对独立部分,由不同的人完成。
这在具有一定技术和管理基础的公司,由总设计师统一规划协调,分任务并行完成的情况下是可行的,也是符合现代产品开发规律的。
但是在高校人员的流动很大,研究生的有效科研时间很短、基础差(许多研究生起步时对电熔、电阻、三极管的分类和选型都很困难,我也是这样过来的)更不用说系统规划设计了,况且许多老板自己也不太懂,师兄有自己的任务,他们搞明白时也毕业了。
在许多高校做DSP就是找一个算法加到自己的主程序里,在板子上跑一下,基本达到效果就可以了,至于可靠性是次要的,产业化无从谈起,这已经算不错的了。
其实我觉得一个系统的完成,系统的规划是最重要的,在规划时对硬件设计的知识和认识是决定性的,它可以让你知道什么是可行的,什么是不可行的,当你同时具有软件设计能力时,就可以合理的分配系统功能,完成使用VHDL进行系统行为描述-—系统功能划分——系统子结构设计这样的自顶向下的设计规划流程,成为系统设计专家、项目经理,否则只是硬件工程师、软件工程师。
无论作51、196、还是DSP 都是这样。
下面分别谈谈我对硬件和软件设计的感受硬件设计是系统设计的关键,国内和国外产品的差距往往是硬件设计水平高低决定的,任何软件设计思想没有可靠的物理载体都是空中楼阁,纸上谈兵。
DSP编程中几个关键问题的探究
DSP编程中几个关键问题的探究作者:李丽来源:《中国新技术新产品》2010年第11期摘要:对DSP串口的DMA传输方式使用中可能遇到的疑难问题、汇编指令歧义及C语言混合编程容易犯的错误作了分析,对Bootload编程的疑难点做出了相应实例解释。
关键词:汇编指令的歧义;Bootload Bug;Multi-Frame1 引言DSP芯片凭其优异的性能在高速计算领域有着巨大的应用前景。
但其应用所涉及的知识非常庞杂。
本文以TI公司320C54X系列为蓝本进行提纯,所有认识都是笔者在实际工作中亲手实践所得。
2 DSP编程的关键问题2.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的发送即可2.2 McBSP串口配置的关键时序主要是寄存器SPCR2的配置:在保持RRST、XRST、FRST各位为0的前提下,配置好其它串口控制寄存器。
等待至少2个CLKR/T时钟以确保DSP内部的同步。
可以向DXR装载数据或使能DMA;使能GRST(GRST=1)(如果需要DSP内部产生采样时钟);使能RRST或XRST,注意此时要保证SPCR中仅有此一位发生改变。
DSP调试及烧写和加载常见错误及分析
DSP调试及烧写和加载常见错误及分析在进行DSP调试、烧写和加载过程中,常见的错误有很多,下面是一些常见错误及其分析:1.调试错误:-问题描述:无法连接到DSP设备。
-分析:可能是因为设备未正确连接,或者连接线路有问题,也可能是驱动程序不兼容导致的。
-解决方法:检查设备的连接状态,确保连接正确;检查连接线路是否完好;更新或卸载并重新安装驱动程序。
2.烧写错误:-问题描述:烧写失败或者烧写之后设备无法启动。
-分析:可能是烧写的文件有错误或者不完整,也可能是设备本身存在问题。
3.加载错误:-问题描述:加载程序时出现错误,或者加载之后程序无法正常运行。
-分析:可能是加载的程序有问题或者与设备不兼容,也可能是设备本身存在问题。
4.软件错误:-问题描述:使用的调试、烧写或加载软件出现错误或崩溃。
-分析:可能是软件本身存在问题,也可能是与其他软件或系统的兼容性冲突。
-解决方法:更新软件版本,或者使用其他可靠的软件;检查是否存在与其他软件或系统冲突的情况,如果有需要进行排查和修复。
5.设备故障:-问题描述:设备无法识别、烧写或加载,存在硬件故障。
-分析:可能是设备损坏或老化,设备内部电路出现问题。
-解决方法:检查设备的物理状态,是否存在损坏或老化情况;检查设备的内部电路,如果有问题需要进行修复或更换。
6.嵌入式系统错误:-问题描述:DSP芯片上的嵌入式系统无法正常运行。
-分析:可能是系统的软件代码有问题,硬件与软件的不匹配,系统配置错误等。
-解决方法:检查系统的软件代码,重新进行编译、调试和烧写;检查系统的硬件与软件的兼容性,如果有问题需要进行修复或更换;检查系统的配置参数,进行适当的修改。
在遇到以上错误时,可以根据具体情况进行分析和解决。
同时,可以参考调试、烧写和加载工具的操作手册,寻求厂商的技术支持,或者查阅相关的文档和资料来获取更多的帮助和解决方案。
调试、烧写和加载过程中可能会遇到各种各样的问题,需要耐心和细心进行排查和解决。
DSP开发中值得注意的几个问题
DSP开发中值得注意的几个问题选择DSP的型号目前市场上的主要DSP生产商包括TI,ADI,Motorola,Lucent和Zilog等,其中TI占有最大市场份额。
产品包括了从低端的低速度DSP到高端的大运算量的DSP产品。
目前,广泛使用的TI DSP有三个系列:C2000、C5000、C6000(C3X 也有使用),其它型号都基本淘汰。
需要提醒注意的是:在TI的DSP中,同一系列中不同型号的DSP都具有相同的DSP核,相同或兼容的汇编指令系统,其差别仅在于片内存储器的大小,外设资源(如定时器、串口、并口等)的多少;不同系列DSP的汇编指令系统不兼容,但汇编语言的语法非常相似。
除了汇编语言外,TI还为每个系列都提供了优化的C/C++编译器,方便用户使用高级语言进行开发,效率可以达到手工汇编的90%甚至更高。
在具体的开发中,根据所设计的系统要求和最终产品的成本估算,一般从以下几个方面去考虑选择什么型号的DSP芯片。
DSP设计中的基本技巧可以同时使用FIFO为CY7C4225(1k×18)。
多CPU的混合系统。
MCU在控制、管理领域有不可替代的地位,因为它无论从成本,开发系统都很廉价和成熟。
DSP在数字信号处理方面又是普通MCU,甚至通用CPU都无法比拟的。
因此许多应用中采用MCU+DSP的结构,MCU负责管理,甚至运行嵌入式操作系统;而DSP仅仅负责快速的数据运算处SP的混合系统目前也很方便,有时采用多个低档的DSP并行比采用一片高档的DSP 会大大降低系统的成本。
如前锋公司的GSM手机综测仪采用3片VC5409并行处理,分别负责信道、基带和信令。
多CPU的混合系统中使用RTOS。
在DSP+MCU或多DSP的系统中,嵌入式操作系统,特别是实时嵌入式操作系统显得尤其重要。
但实时操作系统不仅少,而且价格昂贵,但普通嵌入式操作系统很廉价,根据具体设计要求可以做不同的选择。
目前也正在VC5471平台和C5000平台上尝试嵌入式操作系统电源管理。
- 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等寄存器进行保护的)。