专题转载 ADSP 资料

作者在 2008-11-09 00:21:20 发布以下内容

VDSP5.0查看共享内存变量时出现一个BUG(已证实)

VDSP5.0双核工程下sml3中的变量查看问题

我的BF561的工程在VDSP4.5(update_6)下能正常运行,但是升级到VDSP5.0(updata3)后就不行了,板子是优视的BF561的开发板,仿真器为原厂HPUSBICE。

尝试使用VDSP5的双核单应用方式建造一个最简单的双核工程(5个工程的工程组那种),发现相同的函数,如果实现部分放在A或B核中则没有问题,如果放在SML3中并单步调试,会发现虽然可以正常运行,但是无法实时得知其中变量的值(无论是通过鼠标直接观测还是通过Expression窗口)。

咨询ADI官方的技术支持,他们的回信证明该问题是一个VDSP5.0自身的一个Bug,回信如下:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Hi,

Thank you for the concise example demonstrating the problem. The issue you are encountering is indeed a bug, resulting in the inability to view variables in shared memory.  The only options for being able to view the value of these local variables are to move the function into CoreA , or make use of global variables when a function is located in shared memory. This issue is due to be resolved in the next update to VisualDSP++ 5.0, due later this year.
We apologise for the inconvenience this issue has caused.

Regards,
Processor Tools Support

技术 | 阅读 12100 次
文章评论,共13条
vfdff(作者)
2008-11-09 00:22
1
VDSP4.5一个BUG,单步调试显示错误&nbsp;&nbsp;<br />
<br />
调试程序时发现一个循环怎么都有问题,老进入一个不太可能进入的断点,开始以为是别的地方有问题,后来开始怀疑VDSP4.5(updata_6)自身调试有问题,做一个单独的简化版本循环测试,发现确实如此。<br />
<br />
极其简单的一个循环:<br />
<br />
int i=0;<br />
<br />
while(1)<br />
<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;i++;<br />
<br />
&nbsp;&nbsp;&nbsp;if(i&gt;1000) continue;<br />
<br />
}<br />
<br />
调试时,在continue设置断点,全速运行,发现第一次运行下来便到了停在断点了,此时i==1 !!!<br />
<br />
观察汇编代码,貌似没有问题,可能是仅仅是调试的定位出现问题,应该不影响结果,但是影响流程判断!!!!
vfdff(作者)
2008-11-09 00:23
2
发现vdsp4.5系统服务主频设置的一个BUG(含ADI技术支持回信) <br />
<br />
使用ADI系统服务设置BF561主频的时候竟然发现无法设置到600M/100M,跟入查看,发现竟然很有可能是一个BUG,发信一问,果然,是VDSP4.5的一个BUG,原文如下:<br />
<br />
PR52525 - PLL config BUG of VDSP4.5 ?&#8207; <br />
发件人: processor.tools.support (processor.tools.support@analog.com) <br />
发送时间: 2008年7月8日 21:59:26 <br />
收件人:&nbsp;&nbsp;<br />
<br />
<br />
Hi,<br />
 <br />
The issue you describe is one of several power management issues which have been fixed in the VisualDSP 5.0 release.&nbsp;&nbsp;<br />
 <br />
We are currently focusing mainly on the 5.0 development tools environment, and providing only minimal support for VisualDSP 4.5, meaning that we are only fixing very urgent bugs in 4.5.&nbsp;&nbsp;<br />
 <br />
Please upgrade to VisualDSP 5.0 by visiting our web site:<br />
 <br />
http://www.analog.com/en/embedded-processing-dsp/software-and-reference-designs/content/visualdsp_tools_upgrades/fca.html<br />
 <br />
If it is not possible for you to upgrade at this time, please let us know, and we will help you to work around the problem.<br />
 <br />
Regards,<br />
Processor Tools Support<br />
<br />
**********************************************************************<br />
Processor Tools Support<br />
Development Tools Product Line<br />
Analog Devices, Inc.<br />
<br />
e-mail:processor.tools.support@analog.com<br />
**********************************************************************<br />
CROSSCORE, Analog Devices Development Tools <br />
<br />
<br />
<br />
<br />
--------------------------------------------------------------------------------<br />
<br />
From:<br />
Sent: 05 July 2008 13:52<br />
To: processor.tools.support@analog.com<br />
Subject: PLL config BUG of VDSP4.5 ?<br />
<br />
<br />
Hi,<br />
&nbsp;&nbsp;&nbsp; I just use the vdsp4.5 SYSTEM SEVICE functions to set the PLL of BF561 as below:<br />
<br />
static void Init_POWER(void)<br />
{<br />
 ADI_PWR_RESULT&nbsp;&nbsp;PWRResult;<br />
 ADI_PWR_RESULT&nbsp;&nbsp;Result;<br />
 <br />
 u32 fcclk,fsclk,fvco;<br />
 ADI_PWR_COMMAND_PAIR ezkit_power[] = { <br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_PROC_VARIANT,&nbsp;&nbsp;(void*)ADI_PWR_PROC_BF561SKBCZ600X }, // Processor variant<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_PACKAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (void*)ADI_PWR_PACKAGE_MBGA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;// Packaging type of processor<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_VDDEXT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void*)ADI_PWR_VDDEXT_330&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, // External voltage supply (3.3V)<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_CLKIN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void*)33 /* MHz */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },&nbsp;&nbsp;&nbsp;// 30Mhz oscillator connected to CLKIN<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED,(void*)0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;// Enable Dual Core Synchronizatio! n<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_END, (void*)0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// No more commands<br />
 };<br />
 <br />
 PWRResult = adi_pwr_Init( ezkit_power ); <br />
<br />
adi_pwr_SetFreq(600000000, 100000000, ADI_PWR_DF_OFF); <br />
} <br />
<br />
&nbsp;&nbsp;&nbsp; It`s simple, but can`t work successfully, the PLL_CTL is still 0x1A00,and the PLL_DIV is 0x0005. <br />
<br />
the cclk is 429M and sslk is 85M.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I traced the routine with step debug mode, and I find it may be a bug of VDSP ,look at this:<br />
<br />
 <br />
<br />
==============================&nbsp;&nbsp;&nbsp;In file adi_pwr.h&nbsp;&nbsp;=========================<br />
<br />
#define ADI_PWR_VLEV_085&nbsp;&nbsp;6 <br />
#define ADI_PWR_VLEV_090&nbsp;&nbsp;7 <br />
#define ADI_PWR_VLEV_095&nbsp;&nbsp;8 <br />
#define ADI_PWR_VLEV_100&nbsp;&nbsp;9 <br />
#define ADI_PWR_VLEV_105&nbsp;&nbsp;10 <br />
#define ADI_PWR_VLEV_110&nbsp;&nbsp;11 <br />
#define ADI_PWR_VLEV_115&nbsp;&nbsp;12 <br />
#define ADI_PWR_VLEV_120&nbsp;&nbsp;13 <br />
#define ADI_PWR_VLEV_125&nbsp;&nbsp;14 <br />
#define ADI_PWR_VLEV_130&nbsp;&nbsp;15 <br />
#define ADI_PWR_VLEV_135&nbsp;&nbsp;16 <br />
#define ADI_PWR_VLEV_140&nbsp;&nbsp;17 <br />
<br />
 <br />
<br />
----- ADI_PWR_VLEV_MIN :<br />
<br />
#define ADI_PWR_VLEV_MIN&nbsp;&nbsp;&nbsp;ADI_PWR_VLEV_085 ====&gt;6<br />
<br />
----- ADI_PWR_VLEV_MAX :<br />
<br />
#define ADI_PWR_VLEV_MAX&nbsp;&nbsp;&nbsp;ADI_PWR_VLEV_130 ====&gt;15<br />
<br />
----- ADI_PWR_NUM_VLEVS :<br />
<br />
#define ADI_PWR_NUM_VLEVS&nbsp;&nbsp;&nbsp;ADI_PWR_VLEV_MAX-ADI_PWR_VLEV_MIN+1 ===&gt; 10<br />
<br />
 <br />
<br />
===============================&nbsp;&nbsp;In file adi_pwr.c&nbsp;&nbsp;&nbsp;===========================<br />
<br />
------ fvco:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fvco = adi_pwr_cclk_vlev[ADI_PWR_CCLK_VIDX(adi_pwr_active_config.MaxCoreVoltage)];<br />
<br />
------ adi_pwr_active_config.MaxCoreVoltage:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADI_PWR_VLEV_130&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ===&gt;15<br />
<br />
 <br />
<br />
------ ADI_PWR_CCLK_VIDX(adi_pwr_active_config.MaxCoreVoltage)]; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define ADI_PWR_CCLK_VIDX(V)&nbsp;&nbsp;&nbsp; (V - ADI_PWR_VLEV_MIN)&nbsp;&nbsp;&nbsp;===&gt;&nbsp;&nbsp;9&nbsp;&nbsp;<br />
<br />
 <br />
<br />
------ adi_pwr_cclk_vlev :<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0, vlev=ADI_PWR_VLEV_MIN ;i&lt;ADI_PWR_NUM_VLEVS; i++, vlev++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adi_pwr_cclk_vlev[i] = adi_pwr_cclk_vlev_datasheet[i][adi_pwr_active_config.proc_type]<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *adi_pwr_active_config.MHzFactor; <br />
<br />
------ adi_pwr_active_config.proc_type:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; == 2 (ADI_PWR_PROC_BF561SKBCZ600X)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
 <br />
<br />
------ adi_pwr_cclk_vlev_datasheet :<br />
<br />
static u32 adi_pwr_cclk_vlev_datasheet [ADI_PWR_TOT_VLEVS][4] = {<br />
 /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BF561SKBC750X&nbsp;&nbsp;BF561SKBCZ500X&nbsp;&nbsp;&nbsp;BF561SKBCZ600X&nbsp;&nbsp;&nbsp; BF561SBB600&nbsp;&nbsp;*/<br />
 /* ADI_PWR_VLEV_070 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_075 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_080 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_085 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_090 */ { ! ;CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;313,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;313,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;313&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_095 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_100 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;370&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_105 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_110 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_115 */ { CCLK_TBD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;444&amp;! nbsp; },<br />
 /* ADI_PWR_VLEV_120 */ { 600, &amp;n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;500,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;500&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_125 */ { 600,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 500,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;500&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_130 */ { 600,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 500,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_135 */ { 600,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 500,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602&nbsp;&nbsp;},<br />
 /* ADI_PWR_VLEV_140 */ { 756,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 500,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;602&nbsp;&nbsp;}<br />
}; <br />
<br />
==================================<br />
<br />
&nbsp;&nbsp;&nbsp;So,adi_pwr_cclk_vlev[] just have 10 elements, is {250,250,250,250,313,370,444,444,444} ,and the max freq of fvco is 444, but as the table above , ADI_PWR_VLEV_130 -- 602M is the No.11 !<br />
<br />
&nbsp;&nbsp;&nbsp;Is that a bug ?how to set the freq to 600M/100M of BF561?<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
 Thanks.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Roxy
vfdff(作者)
2008-11-09 00:24
3
PPI Underrun/Overflow Errors 解决方法&nbsp;&nbsp;<br />
<br />
The PPI FIFO is 16 bits wide and has 16 entries. In case the DMA can’t access L3 Memory fast enough, this fifo might overflow (OVR) or underrun (UNDR). <br />
<br />
Make sure you set the CDPRIO bit in the ASYNC Memory Configuration. (EBIU_AMGCTL: This allows the DMA to have higher priority than the Core for external memory accesses.)<br />
Increase SCLK System Clock.<br />
If external memory mapped peripherals like Ethernet Controllers are accesses while high speed PPI DMA is active into L3 Memory, External Async. Memmory access timings low. (EBIU_AMBCTL)<br />
If possible use internal L1 data memory for DMA buffers.<br />
If buffers dont fit in L1, you can try keep the data buffers in separate SDRAM data banks to reduce bank open/close latency. Linux does not inheritly support allocation in specific banks or on specific address ranges. It can be solved by direct addressing a specific bank, check the memory allocator page.<br />
Fine-tune SDRAM initialization parameters. (Use faster SDRAM).<br />
Always utilize the maximum DMA bus width, for 8-bit PPI transfers use the packing option.<br />
Reduce PPI CLK.<br />
再加几个:1.如果是连续工作,考虑乒乓buffer<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.DMA的TRAFFIC控制
vfdff(作者)
2008-11-09 00:25
4
BF561的PLL设置问题&nbsp;&nbsp;<br />
<br />
以前直接调用vdsp4.5的系统服务:<br />
<br />
&nbsp;&nbsp;ADI_PWR_COMMAND_PAIR ezkit_power[] = { <br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_PROC_VARIANT,&nbsp;&nbsp;(void*)ADI_PWR_PROC_BF561SKBCZ600X }, // Processor variant<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_PACKAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (void*)ADI_PWR_PACKAGE_MBGA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;// Packaging type of processor<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_VDDEXT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void*)ADI_PWR_VDDEXT_330&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, // External voltage supply (3.3V)<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_CLKIN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void*)33 /* MHz */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },&nbsp;&nbsp;&nbsp;// 30Mhz oscillator connected to CLKIN<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED,(void*)0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;// Enable Dual Core Synchronization<br />
&nbsp;&nbsp;{ ADI_PWR_CMD_END, (void*)0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// No more commands<br />
 };<br />
 <br />
&nbsp;&nbsp;PWRResult = adi_pwr_Init( ezkit_power ); <br />
 adi_pwr_SetFreq(600000000, 100000000, ADI_PWR_DF_OFF); <br />
<br />
失败,每次都是设置到429M/85.8M<br />
<br />
跟踪发现好像是一个BUG.<br />
<br />
改为直接写寄存器的方法:<br />
<br />
 Set_PLL( (short)(CORECLK/CLKIN), (short)(CORECLK/SYSCLK));<br />
<br />
 <br />
<br />
void Set_PLL(short CoreCLOCK_multiplier, short SCLK_divider)<br />
{ short previous_PLL= *pPLL_CTL;<br />
&nbsp;&nbsp;short previous_SICA_IWR = *pSICA_IWR0;<br />
&nbsp;&nbsp;short previous_SICB_IWR = *pSICB_IWR0;<br />
&nbsp;&nbsp;short new_PLL= (previous_PLL &amp; 0x81ff) | ((CoreCLOCK_multiplier &amp; 0x3f) &lt;&lt;9);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;if (new_PLL != previous_PLL) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// skip if multiplier has not changed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;if ((int)(*pSRAM_BASE_ADDRESS) == 0xFF800000 ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// do things for Core A<br />
&nbsp;&nbsp;&nbsp;*pSICA_IWR0 = (previous_SICA_IWR | 0x1); // enable PLL Wakeup Interrupt<br />
&nbsp;&nbsp;&nbsp; *pPLL_CTL = new_PLL;<br />
&nbsp;&nbsp;ssync();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; idle();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// put in idle<br />
<br />
&nbsp;&nbsp;&nbsp; *pSICA_IWR0 = previous_SICA_IWR;&nbsp;&nbsp;&nbsp; // continue here after idle, restore previous IWR content<br />
&nbsp;&nbsp;ssync();<br />
&nbsp;&nbsp;&nbsp;}<br />
 else{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do things for Core B<br />
&nbsp;&nbsp;&nbsp;*pSICB_IWR0 = (previous_SICB_IWR | 0x1); // enable PLL Wakeup Interrupt<br />
&nbsp;&nbsp;ssync();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; idle();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// put in idle<br />
<br />
&nbsp;&nbsp;&nbsp; *pSICB_IWR0 = previous_SICB_IWR;&nbsp;&nbsp;&nbsp; // continue here after idle, restore previous IWR content<br />
&nbsp;&nbsp;ssync();<br />
 <br />
&nbsp;&nbsp;&nbsp; } // if (&amp;_CORE == 0)<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;// if (new_PLL != previous_PLL)<br />
<br />
&nbsp;&nbsp;*pPLL_DIV = (*pPLL_DIV &amp; 0xFFF8) | SCLK_divider;<br />
&nbsp;&nbsp;ssync();<br />
&nbsp;&nbsp;<br />
}<br />
<br />
问题解决。
vfdff(作者)
2008-11-09 00:26
5
终于解决BF561的FLASH启动问题 (区别BF531) <br />
本来以为和以前BF531一样的方式,加一个稍微配置了init文件,烧进FLASH就可以了。谁知道按照标准的EE-314做,竟然弄了整整4天,给ADI也发了N封信,但用处不大。上网找了半天,发现和我一样的人很多,都很困惑。<br />
<br />
&nbsp;&nbsp;&nbsp;本人在VDSP4.5(update_june_2007)、VDSP4.5(update_6),VDSP5.0(update_2)编译下做了N多实验,终于弄出来了。工程分为调用/不调用SDRAM。<br />
<br />
&nbsp;&nbsp;&nbsp;方法1:使用init文件的方式<br />
<br />
&nbsp;&nbsp;&nbsp;方法2:采用boot kernel方式<br />
<br />
&nbsp;&nbsp;&nbsp;按照EE-314,较新版本的VDSP应该采用init文件方式,显然,我的3个vdsp环境都满足(NOVEMBER_06之后),但是实验证明该说法误导我走了很多冤枉路。<br />
<br />
&nbsp;&nbsp;&nbsp;实验过程不说了,有用的结果:5.0下1方式可以正常从FLASH启动不调用SDRAM 的工程,调用SDRAM的工程失败。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5(update_6)下1方式两种全部失败。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5(update_6)下2方式两种工程全部成功。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.5(update_6)下1+2方式两种工程全部成功。<br />
<br />
详细说下方法2成功实现的方法:<br />
<br />
&nbsp;&nbsp;&nbsp;1.在CORE A的MAIN()函数一开始加入*pSICA_SYSCR &amp;= 0XFFDF;<br />
<br />
&nbsp;&nbsp;&nbsp;2.在Project option 中的LOAD/option中选FLASH/PROM,binary,16BIT,下面的initialization文件则不用选。<br />
<br />
&nbsp;&nbsp;&nbsp;3.在Project option 中的LOAD/kernel中选中“use boot kernel”,再在“kernel file”中选择安装目录中的&quot;blackfin\ldr\561-prom16.dxe&quot;。<br />
<br />
&nbsp;&nbsp;&nbsp;4.点OK后,在重新检查下<br />
<br />
&nbsp;&nbsp;&nbsp;5.按binary方式烧入FLASH,地址选0
vfdff(作者)
2008-11-09 00:27
6
Intel FLASH芯片E28F128的烧写驱动完成<br />
板子上的intel norFLASH芯片E28F128总是无法烧写,仔细分析ECOS的驱动代码,发现和m29w160,m29w320的驱动有较大的区别。<br />
<br />
一定要在每个单独的操作完成后都加上resetflash的命令才能完全正常工作。
vfdff(作者)
2008-11-09 00:28
7
解决DM9000a发包的“source address Xerox 000000”问题 <br />
前几天改写DM9000AE驱动程序的时候,发现有时候会发不出来包,调用Sniffer查看,发现如下图所示,DM9000AE(192.168.1.21)发出来的包都被替换成Xerox 000000 为源地址和目标地址的奇怪的包,<br />
<br />
后来反复查找原因,问题解决,原来是在发包的时候,只关了DM9000的中断,而没有关系统中断造成。
vfdff(作者)
2008-11-09 00:29
8
该死的 __var_wa_06000047 问题&nbsp;&nbsp;<br />
才拿来一个双核BF561,试验初始化EBIU和PWR,竟然搞了一个晚上都有 &quot;...__var_wa_06000047...&quot;的错误,郁闷了,上ADI网站上一查,竟然是VDSP4.5的问题,更新最新的补丁,搞定。
vfdff(作者)
2008-11-09 00:30
9
Blackfin处理器的SDRAM应用&nbsp;&nbsp;<br />
在对SDRAM进行读写操作前首先须对SDRAM进行初始化,在Blackfin处理器中,SDRAM初始就是对Blackfin处理器的SDRAM控制器(EBIU_SDRRC,EBIU_SDBCTL和EBIU_SDGCTL)进行初始化配置,这三个控制寄存器的值要根据所选用的SDRAM参数进行设置(详细参数对照blackfin处理器数据手册SDRAM控制器相关章节和SDRAM的DATASHEET)。<br />
<br />
&nbsp;&nbsp;&nbsp; 当采用VisualDSP++进行仿真调试 时(如果需要用到外接SDRAM),在VisualDSP++启动的过程中自动配置SDRAM控制器的相关寄存器。VisualDSP++启动中调用ADSP-BF53x-proc.xml文件(Analog Devices\VisualDSP 4.x\System\ArchDef目录下)的<br />
<br />
&lt;register-reset-definitions&gt;<br />
 &lt;register name=&quot;EBIU_SDRRC&quot; reset-=&quot;0x01A0&quot; core=&quot;Common&quot; /&gt;<br />
 <br />
 &lt;!-- For BF533 EZ-Kit Lite's rev 1.7 and above use 0x25 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- register name=&quot;EBIU_SDBCTL&quot; reset-=&quot;0x25&quot; core=&quot;Common&quot; / --&gt;<br />
 <br />
 &lt;!-- For BF533 EZ-Kit Lite's rev 1.6 and below use 0x13 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;register name=&quot;EBIU_SDBCTL&quot; reset-=&quot;0x13&quot; core=&quot;Common&quot; /&gt;<br />
 <br />
 &lt;register name=&quot;EBIU_SDGCTL&quot; reset-=&quot;0x0091998D&quot; core=&quot;Common&quot; /&gt;<br />
&lt;/register-reset-definitions&gt;<br />
<br />
配置字节进行SDRAM控制器的配置。<br />
<br />
&nbsp;&nbsp;&nbsp; ADSP-BF533-proc.xml已经有这个配置字段,如果采用的不是BF533,则在启动VisualDSP++需要相对应的ADSP-BF53x-proc.xml加上上面的那段SDRAM配置字段。具体可参考ADSP-BF533-proc.xml。<br />
<br />
&nbsp;&nbsp;&nbsp; 程序直接在目标板上运行,在运行用户程序之前,亦须对SDRAM进行初始化处理器才能将程序从FLASH装载到SDRAM进行运行。也就是说,我们下载到目标板的程序包括(SDRAM初始部分和用户应用程序)。即在VisualDSP++的项目选项&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中加入SDRAM初始化文件.dxe,运行编译操作时VisualDSP++会自动在生成的用户.dxe文件中加入SDRAM初始化代码。<br />
<br />
&nbsp;&nbsp;&nbsp; SDRAM初始化代码例子(HY57V641620ET-7,代码已在产品中应用)<br />
<br />
#i nclude &lt;defBF532.h&gt;<br />
.SECTION program;<br />
<br />
[--SP] = ASTAT; /* Stack Pointer (SP) is set to the end of */<br />
[--SP] = RETS; /* scratchpad memory (0xFFB00FFC) */<br />
[--SP] = (r7:0); /* by the on-chip boot ROM */<br />
[--SP] = (p5:0);<br />
[--SP] = I0;[--SP] = I1;[--SP] = I2;[--SP] = I3;<br />
[--SP] = B0;[--SP] = B1;[--SP] = B2;[--SP] = B3;<br />
[--SP] = M0;[--SP] = M1;[--SP] = M2;[--SP] = M3;<br />
[--SP] = L0;[--SP] = L1;[--SP] = L2;[--SP] = L3;<br />
<br />
/*******************Init Code Section**************************/<br />
/*******Please insert Initialization code in this section******/<br />
/***********************SDRAM Setup****************************/<br />
Setup_SDRAM:<br />
P0.L = EBIU_SDRRC &amp; 0xFFFF;<br />
/* SDRAM Refresh Rate Control Register */<br />
P0.H = (EBIU_SDRRC &gt;&gt; 16) &amp; 0xFFFF;<br />
R0 = 0x074A(Z);<br />
W[P0] = R0;<br />
SSYNC;<br />
P0.L = EBIU_SDBCTL &amp; 0xFFFF;<br />
/* SDRAM Memory Bank Control Register */<br />
P0.H = (EBIU_SDBCTL &gt;&gt; 16) &amp; 0xFFFF;<br />
R0 = 0x0001(Z);<br />
W[P0] = R0;<br />
SSYNC;<br />
<br />
P0.L = EBIU_SDGCTL &amp; 0xFFFF;<br />
/* SDRAM Memory Global Control Register */<br />
P0.H = (EBIU_SDGCTL &gt;&gt; 16) &amp; 0xFFFF;//<br />
R0.L = 0x998D;<br />
R0.H = 0x0091;<br />
[P0] = R0;<br />
SSYNC;<br />
/*********************Post-Init Section************************/<br />
L3 = [SP++]; L2 = [SP++]; L1 = [SP++]; L0 = [SP++];<br />
M3 = [SP++]; M2 = [SP++]; M1 = [SP++]; M0 = [SP++];<br />
B3 = [SP++]; B2 = [SP++]; B1 = [SP++]; B0 = [SP++];<br />
I3 = [SP++]; I2 = [SP++]; I1 = [SP++]; I0 = [SP++];<br />
(p5:0) = [SP++];<br />
(r7:0) = [SP++];<br />
RETS = [SP++];<br />
ASTAT = [SP++];<br />
<br />
/************************************************************/<br />
RTS;
vfdff(作者)
2008-11-09 00:30
10
ADSP_BF535的存储器管理机制&nbsp;&nbsp;<br />
存储器的管理机制及其性能直接决定DSP的性能。文章首先分析了ADSPBF535的存储器分级管理机制,对各个区域的存储器进行了详细讲解。其次,针对该DSP的L1、L2,进行了并行指令和FFT运算的性能评测。再次,进行了多种存储器之间的DMA数据传输测试,给出了具体的速度指标。评测数据证明了BF535具有优良的存储器性能,为Blackfin系列DSP的工程应用设计提供了重要的数据参考。 <br />
  关键词:ADSP-BF535;存储器;分级;并行指令;FFT;DMA <br />
  ADSP-BF535是美国AD公司和Intel公司联合推出的一款定点DSP,属于Blackfin系列产品中的旗舰产品。在推出初期,该DSP被命名为ADSP-21535;2002年底,AD公司在中国开始大规模推广Blackfin系列产品,并在2003年初改进制造工艺和提高处理器主频,将其改命名为ADSP-BF535。其具有RISC指令结构,运作高效,性能优异,主频最高工作在350 M,具有1个40 bit的Shifter(移位寄存器),2个16 bit的MAC(乘加器)和2个40bit的ALU(算术逻辑单元),2个40 bit的Accumulator(累加器),4个8 bit的视频处理单元,16个地址寻址单元,在芯片内部集成了308 k byte的RAM,并支持各种外部RAM的扩展应用。<br />
  BF535具有丰富的外部接口:①32 bit/33M/3.3V、兼容PCI2.2标准的主从PCI总线接口;②1个集成的USB1.1兼容的设备接口;③2个SPI兼容接口;④2个全双工的SPORT口(同步串口);⑤2个UART(异步串口);⑥4个定时/计数器,其中3个支持PWM(脉宽调制)模式;⑦16个双向PF(Program-mable Flag,可编程标志)I/O引脚;⑧1个看门狗电路;⑨实时时钟。这些接口的集成,充分满足了软件工程的多样性的扩展设计要求。其中,接口①~⑤均可以通过DMA通道或者系统总线接口与各存储器之间传输数据,数据的传输率与总线速度的分频设计和各存储器的响应时间有关。<br />
  值得一提的是,BF535还可以动态地控制电压输入,内核电压VDD可以工作在0.9~1.5 V的范围,外部I/O接口则固定工作在3.3 V。与此同时,其可以用软件设置的方式动态改变内部锁相环的频率,调整DSP的核心和接口运行速度,减少芯片功耗。这种灵活的电源管理设计,十分适合于移动产品的 设计与开发。BF535的功能框图如图1所示。<br />
<br />
<br />
<br />
<br />
<br />
  在存储器管理方面,BF535有其独特的统一寻址设计。从图1的框图中可以看出,芯片集成了256k byte的系统RAM(L2),在DSP的核心处理器-Blackfin core里面集成有更高速度的52 k byte的L1RAM,External Port(外部端口)控制器还支持Flash、SRAM和SDRAM等多种存储器的扩展。除了对外部接口提供DMA传输外,在各种存储器之间,BF535也提供了DMA控制器,并且留有专用的内部总线带宽,允许数据在各种存储器之间高速传输。由于DSP所有内核与外设的数据操作和传输都不可避免地涉及到存储器,则存储器的性能直接决定了DSP的运算性能。本文的重点即是分析BF535的存储器管理机制,并进行相关的性能测试和指标评定。 <br />
<br />
1 BF535的存储器管理机制<br />
  BF535的存储器管理使用32 bit寻址,把所有DSP资源虚拟为一个统一的4GB的地址空间。地址空间的各部分存储器按照分级结构排列,以提供较高的性能价格比。一些快速、低延迟的存储器的位置接近处理器核心,低成本低性能的存储器则远离核心。BF535的存储器分为片内、片外存储器和内存映射的I/O资源,这些存储器都具有独立的地址空间。BF535存储器地址配置空间如图2所示。<br />
<br />
<br />
<br />
<br />
<br />
  片内的空间一共有285 Mbyte的地址空间,范围在0xEF000000~0xFFFFFFFF,包括L1(一级缓存)、L2(二级缓存)、MMR(Memory-Mapped Regis-ters,内存映射寄存器组)和引导ROM。这些空间并不是全部存在实际的物理存储器,有许多是保留的地址。<br />
  L1作为DSP的一级缓存,速度最快,可以和BF535的内核一样,运行在350 M的高速上。它分为三部分:L1指令缓存、L1数据缓存和中间结果缓存。其中,L1指令缓存为16 k byte,范围在0x-FFA00000~0xFFA04000,只能存放指令;L1数据缓存为32 k byte,分成两个16 k的数据块,范围在0xFF800000~0xFF804000和0xFF900000~0xFF904000,只能存放数据;中间结果缓存为4 k字节,范围在0xFFB00000~0xFFB01000。L1指令缓存既可以作为SRAM,也可以配置为4路联合设置的cache。L1数据缓存能够配置成双路联合设置的Cache或者SRAM;中间结果缓存只能够作为SRAM使用,通常被系统使用为堆栈。指令缓存和数据缓存都可以通过DMA方式灌入数据;对于中间结果缓存,DMA方式不能使用。<br />
  L2作为DSP的二级缓存,空间相对较大,有256k byte,范围在0xF0000000~0x F003FFFF。它是一个统一的指令和数据存储器,能够根据系统设计要求同时存放代码和数据。L2具有DSP核心同样的带宽,但是延迟时间较长,访问L2单个独立的地址时系统最多需要经过7个周期的延时,这使得它的综合访问速度大大下降。所以,如果程序比较大,必须在L2中编写程序时,通常将核心算法程序放在L1中,或者是将L1配置为L2的cache。这样,速度可以大大加快。但是根据硬件实测,将L1配置为L2的cache时,在某些情况下程序运行不稳定,如DMA操作不能正常结束、访问部分地址空间速度突然大幅度减慢等。因此,不推荐使用cache。<br />
  BF535的外部空间分成两大部分:PCI空间与EBIU(External Bus Interface Unit,外部总线接口单元)空间。前者占据了0x30000000~0xEEFFFFFF地址段,当存在实际的设备时该段空间才有意义;它隶属于指定的PCI外设,不能够作为存储器独立存在,因此在存储器分级管理机制中并不涵盖PCI的内存空间。后者访问空间达768 M,占据了0~0x2FFFFFFF的地址段,支持同步RAM和异步RAM等多种存储器。<br />
  在外部存储器中,SDRAM存取速度较快,作为BF535的存储器分级管理机制的第三级,它的空间分布在存储器空间的起始位置:0x00000000~0x23FFFFFF之间,分成4个Bank,每个Bank的容量允许在16 M到128 Mbyte之间调整。BF535所集成的SDRAM控制器既允许单个Bank的SDRAM接口工作,也允许4个Bank同时工作。当4个Bank同时以128 Mbyte工作时,可以为系统提供高达512 M<br />
byte的SDRAM空间。每个Bank空间都是可独立编程的,而且DSP在硬件设计上为各Bank间提供了无缝连接,无论各个Bank的实际物理内存大小是否相同,相邻的Bank地址都是连续的。这就意味着,即使不同的Bank使用不同大小的存储器,控制器也能够把所有Bank管理成一个连续的地址空间,以便处理器将所有的SDRAM视为单一的存储器。这样,在产品开发初期时,开发者可以在各个Bank上用小容量的SDRAM试验,然后再升级成大容量的存储器,开发过程中只需简单地把SDRAM空间视为一个连续的最多512 Mbyte的物理地址空间即可。<br />
  异步RAM空间的访问速度最慢,作为BF535的存储器分级管理机制的第四级,分布在0x24000000~0x2FFFFFFF之间,分成四个Bank,支持SRAM、ROM、EPROM、FLASH、FIFO等。无论使用设备的实际存储器大小如何,每个Bank的空间都固定占据64Mb。这样,异步RAM空间Bank间的地址一般是离散的,只有4个Bank均装满64 Mb的存储器时,地址空间才能全部连续。<br />
  根据上面的BF535的不同级别的存储器管理机制可知,在设计高速运算、传输和大容量存储时,需要对不同速度的存储器进行性能测试,以保证实际电路的正确运行。接下来的,作者基于AD公司的EZ-Kit评估板,使用Visual DSP++3.0的开发环境,针对L1、L2和SDRAM等存储器进行性能评估,并对多种存储器之间的数据传输进行测试和分析。<br />
2 存储器的关键性能测试与分析  <br />
&nbsp;&nbsp;&nbsp; 1) L1、L2的并行指令测试<br />
  在DSP存储器的访问性能指标测试上,首先需要考虑的是DSP核心的各个寄存器直接访问内部存储器的性能,这是DSP运算速度最重要的指标。由于BF535是改进型的哈佛结构,支持并行指令,而并行指令能够在一个周期内完成多条指令操作,因此该方面需要重点测试。表Ⅰ中测试了在不同的存储器环境下,双乘加运算的同时,进行单RAM16 bit存取数据和双RAM16 bit存取数据的速度指标。测试方法:运行0x1000次并行指令运算测量实际周期数。DSP核心时钟fCCLK为300 MHz,测试样本数目为15。 <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
  对于并行指令操作,由表Ⅰ中的测试数据可以得出以下结论:<br />
  (a)Visual DSP++3.0的软件仿真速度是以最快速度仿真的,即全速运行。<br />
  (b)寻址指针指向L1数据缓存时,能够做到全速运行。即在一个核心时钟周期内,能够完成一条并行指令;在作双乘加运算的同时,无论是双16 bit存取还是单16 bit存取,存取速度均约是300 M字/秒。<br />
  (c)寻址指针指向L2时,不能够全速运行,而且读写速度不对称。进行单16 bit写操作时,速度是全速的1/3,约100 M字/秒的存储速度;进行单16 bit读操作时,速度是全速的1/9,约33 M字/秒的读取速度。并且,经作者进一步测试,即使在以上的<br />
并行指令中去掉双乘加操作,速度也没有任何改善。因此,在L2中进行数据存取时,需要考虑性能的折扣与不对称性。<br />
  (d)程序的位置在L1指令缓存和L2中时,实测的性能差别不大。所以对于在作连续的大数据块并行指令运算时,程序本身处于L1指令缓存或者L2的重要性并不大。但是,据实测,在作离散的数据访问时,程序处于L2时的速度显著比处于L1指令缓存中慢。<br />
  (e)对于L1数据缓存,在对其中的RAM进行双16 bit数据存取操作时,和单16 bit操作消耗时间是相同的;但是,对于L2,双16 bit数据存取操作是单  16 bit操作的2倍时间。这就意味着,对L2的双16bit并行操作和两次独立的单16 bit操作无区别,性能没有提升。<br />
  (f)对于双16 bit存取操作,当I0和I1分别指向L1数据缓存和L2时,运算速度应当介于I0、I1同时指向L1或者L2之间。<br />
&nbsp;&nbsp;&nbsp; 2) L1、L2的FFT运算测试<br />
  在系统的分析设计中,特别如通信、雷达、图像传输、声纳等应用环境中,不可避免地进行频谱分析。FFT是信号频谱分析处理不可或缺的强大算法工具,也是DSP性能测试的重要指标。由于作FFT运算时,通常是在性能最优的存储器中进行,外部的RAM不是必要的外设配置,而且性能也不如L1数据缓存和L2,因此应当选择后两者作为测试对象。作者针对两者进行1024点的复数FFT测试,为了使其性能测试具有通用性和可验证性,下文使用AD公司提供的函数CFFTN作为评测对象,该函数的内核是纯汇编编写,效率在95%以上。函数原型声明如下:<br />
<br />
<br />
<br />
<br />
  函数的引用方式为CFFTN(in,t,out,w,wst,2048,0,0)。因为复数包含实部和虚部,因此对于1024点FFT,该函数参数中的FFT缓冲的长度为2048。表Ⅱ给出了CFFTN参数放在不同存储器区域的FFT测试数据。之所以需要进行这样的测试,是因为L1数据缓存的资源比较稀缺,合理使用L2,有助于在DSP性能和L1的资源消耗间找到一个平衡点。测试环境:DSP核心时钟fCCLK为300MHz,测试样本数目为15。<br />
<br />
<br />
 <br />
<br />
  从表Ⅱ中可以看出,当数据全部在L1中处理时速度最快,大约是全部在L2中处理速度的5.67倍。当部分参数在L2中时,处理的速度介于前两者之间。其中,输出数组out放在L1数据缓存中时FFT性能显著提高,旋转因子表数组w的位置对FFT性能影响也较大。因此,应当优先保证这两个参数在L1数据缓存中配置空间。<br />
  3) 各存储器内部与之间的DMA传输的性能测试<br />
  BF535支持不同存储器之间的块数据DMA传  输,带宽为32 bit,支持32 bit(双字)、16 bit(字)和8bit(byte)三种DMA传输方式。需要注意的是,当传输以16 bit和8 bit传输进行,只用到了部分的DMA带宽资源,剩下的资源将被浪费掉。表Ⅲ给出了32bit DMA传输模式下的速度指标,对于16 bit和8 bit传输时,传输速度保持不变,但是单位分别改为字/秒和字节/秒。在存储器DMA的同时,BF535可以同时进行其他操作,只要DSP核心不访问DMA正在读写的地址区域,就不会引起总线冲突。认识到这一点,对于提高BF535的效率而言至关重要。测试环境:DSP核心时钟fCCLK为300M Hz;系统时钟fSCLK为fCCLK的2.5倍分频,工作在120M;SDRAM为PC133标准。测试样本数目为15。 <br />
<br />
<br />
  <br />
  从表Ⅲ中的实测数据可以看出,DMA的速度均在18.7 M双字/秒以上,最高速度达46.9M双字/秒,满足绝大多数高速数据采集系统的速度要求。从表Ⅲ的数据同时可以得出以下结论:<br />
  (a) DMA双向速度不对称,将源地址和目的地址交换以后,传输速度会发生变化。低速存储器区域向高速区域传输时,要比反向传输快。<br />
  (b) 存储器区域内部DMA速度一般比区域之间DMA要慢,如L1→L1比L1→L2和L1→SDRAM都要慢一些。其它区域也有类似现象。<br />
  (c) 对于同种存储器内传输,高速存储器区域内部DMA速度并不一定快,如L1→L1 DMA比L2→L2慢一些。对于同种存储器内,DMA传输速度并不比通过核心寄存器访问存储器占优势,如后者在L1数据缓存内完成一次32位数据的搬移,速度可以到75M双字/秒。<br />
3 结束语  <br />
  本文对BF535的存储器机制进行了分析和评估,测试数据证明,BF535具有优良的存储器性能。文章基于BF535测试,对AD公司的Blackfin系列的其它产品也有重要的参考作用;对于已经推出的BF532和即将推出的BF531、BF533而言,这三者的核心设计和BF535没有任何区别。主要的变化有:根据不同的用户群,对BF535的外部接口进行了简化,对L1和L2进行了增加或者减少,在DSP的核心运行速度上也进行了调整。开发者在使用后续产品时,根据上面所提供的测试数据,适当换算一下即可估算出其它产品的存储器性能。实践证明,这种估算方法是真实可信,行之有效的。
vfdff(作者)
2008-11-09 06:39
11
VisualDSP++中文手册之一 开发工具及其特点<br />
(一)开发工具及其特点<br />
<br />
&nbsp;&nbsp;&nbsp; 1.开发工具概述<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++是ADI公司针对ADI公司的DSP器件而专门开发的一种使用方便的开发平台,它支持ADI公司所有系列的DSP处理器,包括Blackfin系列和ADSP-21XX系列定点处理器、SHARC系列和TigerSHARC系列的浮点处理器的各种型号处理器。<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++通过图形窗口的方式与用户进行信息交换。VisualDSP++采用直观的、易于使用的用户界面,针对处理器进行操作。ViSualDSP++集成了两大部分:集成的开发环境(Integrated Development Environment,IDE)和调试器(Debugger),称为IDDE(IntegratedDevelopment and Debugging Environment),提供了更强大的程序开发和调试功能。VisualDSP++具有灵活的管理体系,为处理器应用程序和项目的开发提供了一整套工具。VisualDSP++包含生成和管理处理器项目必须的所有工具。<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++从推出至今已经经历了1.0、2.0、3.0、3.5、4.0、4.5及5.0七种版本,相应的DSP开发和调试功能也不断增强。下面以常用的VisualDSP++的4.5版本进行介绍。<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++开发工具包中集成了开发DSP程序所需要的各种工具组件,根据用户所购买的软件,VisualDSP++包含下列组件中的一个或多个组件。 <br />
<br />
&nbsp;&nbsp;&nbsp; ·与VisualDSP++一体化的集成开发和调试环境(IDDE)<br />
<br />
&nbsp;&nbsp;&nbsp; ·带有实时运行库的C/C++语言最优化编译器<br />
<br />
&nbsp;&nbsp;&nbsp; ·汇编程序、链接器、预处理器和档案库<br />
<br />
&nbsp;&nbsp;&nbsp; ·程序加载器、分割器<br />
<br />
&nbsp;&nbsp;&nbsp; ·模拟器<br />
<br />
&nbsp;&nbsp;&nbsp; ·EZ—KIT Lite评估系统(必须单独购买)<br />
<br />
&nbsp;&nbsp;&nbsp; ·仿真器(必须单独购买,推荐安诺电子的AN系列ADI DSP仿真器:http://www.analogcn.com/Shop/shop1/Index.html)<br />
<br />
&nbsp;&nbsp;&nbsp; ·程序实例<br />
<br />
&nbsp;&nbsp;&nbsp; 以下是VisualDSP++的基本特点。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)源文件编辑特点<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++简化了源文件的操作任务,可以非常容易地实现创建^查看、打印、移动和信息定位等相关文件操作。<br />
<br />
&nbsp;&nbsp;&nbsp; ·编辑文本文件。创建和修改源文件,查看由代码开发工具生成的文件。<br />
<br />
&nbsp;&nbsp;&nbsp; 源代码文件是DSP工程开发的重要组成部分,可以采用C/C++语言或汇编语言进行编写。如果DSP开发工程的源代码文件采用汇编程序进行编写,那么DSP开发工程中还应当包含链接描述文件(.LDF文件)和一些相关的数据文件,而如果DSP开发工程的源代码文件采用C/C++语言进行编写,那么相应的工程则可不必包含链接描述文件。<br />
<br />
&nbsp;&nbsp;&nbsp; ·编辑窗口。VisualDSP++编辑器是一个完整的代码书写工具,用于编辑文本文件。查看和编辑多个编辑窗口的相关文件,也可为一个文件打开多个编辑窗口。<br />
<br />
&nbsp;&nbsp;&nbsp; ·为专用语法配置颜色。为文本编辑窗中相关关键词、引用、注释等采用不同的颜色进行表示,这一特点提高了查看和搜索文本的效率。<br />
<br />
&nbsp;&nbsp;&nbsp; ·与上下文相关的表达式评价。将鼠标指示移至一个变量上j在一定范围内可以查看变量的值。<br />
<br />
&nbsp;&nbsp;&nbsp; ·状态图标。用于指明断点,书签和处理器当前执行程序指令的在源代码文件中的位置。<br />
<br />
&nbsp;&nbsp;&nbsp; ·查看错误信息和违规代码。通过突出显示错误代码(如cc0251等)或按F1键,可以在输出窗口的生成视图中看到错误的详细信息,而且双击错误行可跳至编辑窗口中的违规代码。<br />
<br />
&nbsp;&nbsp;&nbsp; (2)工程管理特点<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++为处理器应用程序的开发提供了灵活的工程管理,包括创建、定义和编译等处理器项目所必须的操作。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; ·定义和管理工程。管理用户工程编译时所需的相关的文件和相关的开发工具。对工程的定义只需一次即可,在开发的过程中用户可以根据需要对工程灵活地进行修改。<br />
<br />
&nbsp;&nbsp;&nbsp; ·查看和管理代码开发工具。配置选项中确定了代码开发工具如何处理输人文件和生成输出文件。对于代码开发工具,工具设置类似于命令行转换。工程的配置选项可以在工程定义的时候进行设置,也可以在工程开发的过程中进行修改。<br />
<br />
&nbsp;&nbsp;&nbsp; ·查看工程编译结果。在进行工程编译的过程中可以随时查看编译状态,并且根据用户需要,用户可以随时停止工程的编译过程。查看工程编译结果时,如果工程编译存在错误,那么用户在输出窗口中双击错误信息则可以查看造成错误的源代码,或者重复错误信息。<br />
<br />
&nbsp;&nbsp;&nbsp; ·管理源代码文件。根据工程窗口内管理项目中的源文件和文件的依赖项,可以依次显示文件之间的关系。VisualDSP++使用代码开发工具处理工程和生成处理器所需的程序。它也提供了源代码控制(SCC)界面,使得用户可以直接在IDDE环境下完成源代码的控制操作。<br />
<br />
&nbsp;&nbsp;&nbsp; (3)调试特点<br />
<br />
&nbsp;&nbsp;&nbsp; 在调试一些工程的过程中,Visual DSP++提供了以下一些工具和功能为用户服务。<br />
<br />
&nbsp;&nbsp;&nbsp; ·查看C/C++语言和汇编语言的联合编程的源代码文件。在汇编源代码中,行数和符号信息有利于用户在源文件上查看和调试汇编代码。<br />
<br />
&nbsp;&nbsp;&nbsp; ·运行命令行脚本。通过使用脚本,用户可以使用它制定调试过程中的主要参数和特性。<br />
<br />
&nbsp;&nbsp;&nbsp; ·使用存储器表达式。使用存储器相关的表达式。<br />
<br />
&nbsp;&nbsp;&nbsp; ·利用断点查看寄存器和存储器。可以快速添加和移除断点,使能和使断点失灵。<br />
<br />
&nbsp;&nbsp;&nbsp; ·设置模拟观察点。对堆栈、寄存器、存储器和图标设置观察点可以停止程序的执行,方便调试过程中观察相关信息。<br />
<br />
&nbsp;&nbsp;&nbsp; ·统计描述目标处理器的指令执行数(该功能仅用于JTAG的仿真调试目标)。用户可以随意设置统计过程的取样,并将统计结果采用图形显示,根据统计结果可以轻松地观察到程序中最耗时的指令部分。<br />
<br />
&nbsp;&nbsp;&nbsp; ·线性描述目标处理器的指令执行数(该功能仅适用Visual DSP++的模拟调试目标)。对每个DSP的PC寄存器进行取样,统计它们的执行情况,并将结果采用图形显示。该功能与统计描述目标处理器的指令执行数功能类似,只不过该功能只能在Visual DSP++模拟下使用,而统计描述目标处理器的指令执行数功能在JTAG仿真器方式下使用。<br />
<br />
&nbsp;&nbsp;&nbsp; ·模拟I/O端口数据流、中断产生。通过该工具可以模拟串口或存储映射I/O进行数据流传输和模拟处理器通用中断的产生。<br />
<br />
&nbsp;&nbsp;&nbsp; ·创建用户自定义的寄存器窗口。配置一个自定义的寄存器窗口来显示指定的寄存器组。<br />
<br />
&nbsp;&nbsp;&nbsp; ·根据处理器存储器中的数值进行绘图。该工具将处理器存储器中的数据以图像的形式进行显示,并且用户可以根据自己的需要选择多样的绘图风格、典型数据处理功能和外观显示方式。<br />
<br />
&nbsp;&nbsp;&nbsp; ·跟踪程序运行历史,跟踪用户程序,可以获得用户程序是如何达到用户设置的特定的程序点,并显示读、写和符号名称等相关信息。<br />
<br />
&nbsp;&nbsp;&nbsp; ·查看汇编指令的流水线深度。通过流水线界面可以查看目标处理器流水线的阶段。<br />
<br />
&nbsp;&nbsp;&nbsp; (4)VDK特点<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++核(VDK)是一种可扩展的软件执行程序,专门用于高效开发ADI公司DSP处理器的操作。VisualDSP++软件集成了VisualDSP++核。<br />
<br />
&nbsp;&nbsp;&nbsp; VDK能够方便用户从软件中获取硬件实现的详细信息,使得用户可以更加专心的完成处理算法的实现。<br />
<br />
&nbsp;&nbsp;&nbsp; VDK为所有处理器应用开发过程阶段提供了基本模块,它们的性能描述如下:<br />
<br />
&nbsp;&nbsp;&nbsp; ·自动化。VisualDSP++可以根据用户指定的语言自动生成源代码框架。<br />
<br />
&nbsp;&nbsp;&nbsp; ·确定性。VisualDSP++明确指明VDK应用程序接口执行时间的确定性。<br />
<br />
&nbsp;&nbsp;&nbsp; ·多任务处理。VDK的任务问(线程)是相互独立的,并且每个线程都有自己的栈。<br />
<br />
&nbsp;&nbsp;&nbsp; ·模块化。VDK包含各种组件,并且在以后的版本中将会提供更多的功能。<br />
<br />
&nbsp;&nbsp;&nbsp; ·方便移植性。大部分的核组件可以用ANSI标准的C或C++语言编写,这将方便地实现代码在不同处理器之间的移植o<br />
<br />
&nbsp;&nbsp;&nbsp; ·优先性。VDK的优先级的调度表可以使高优先级的线程无需等待信号运行,随时可以执行。<br />
<br />
&nbsp;&nbsp;&nbsp; ·原型化。VDK和VisualDSP++包含模板文件,可以方便用户创建原始文件,且整个应用程序是原型化的,需要用户根据需要进行测试和修改。<br />
<br />
&nbsp;&nbsp;&nbsp; ·可靠性。VDK提供实时运行过程中的错误检查。<br />
<br />
&nbsp;&nbsp;&nbsp; ·可扩展性。如果某个项目不包括该属性,那么目标系统中将不包含其相关的代码支持。<br />
<br />
(二)DSP程序开发方法<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 利用VisualDSP++集成环境开发流程如图5-1所示。<br />
<br />
&nbsp;&nbsp;&nbsp; DSP程序开发有三个阶段:<br />
<br />
&nbsp;&nbsp;&nbsp; ·Simulation——利用Visual DSP提供的软件环境进行软模拟,不需要硬件;<br />
<br />
&nbsp;&nbsp;&nbsp; ·Evaluation——利用EZ-KIT板对程序进行测试和评估;<br />
<br />
&nbsp;&nbsp;&nbsp; ·Emulation——利用JTAG口对用户的目标系统进行仿真调试。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)模拟(Simulation)阶段<br />
<br />
&nbsp;&nbsp;&nbsp; 工程师开发新硬件时,项目开发通常以模拟环境为开始,模拟系统存储器和I/O,允许查看部分目标系统的硬件行为。模拟器是一种软件,用于模拟处理器的操作。由VisualDSP++可以生成一个模拟目标(无物理处理器)运行、编辑和调试用户的程序。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; (2)评估(Evaluation)阶段<br />
<br />
&nbsp;&nbsp;&nbsp; 在项目设计的初期,使用ADI公司的EZ.KIT Lite评估系统确定处理器和验证用户设计的程序的部分功能,并进行评估。<br />
<br />
&nbsp;&nbsp;&nbsp; (3)仿真(Emulation)阶段<br />
<br />
&nbsp;&nbsp;&nbsp; 用户目标系统的硬件设备准备完成后,用户可以通过JTAG仿真器将PC与用户的处理器目标板进行链接。仿真器为PC与实际处理器目标板之间提供了快捷通信,在VisualDSP++环境下通过仿真器可以将用户的程序下载到处理器内部,然后让程序在用户目标系统的处理器上运行。采用仿真器进行调试,处理器实际上是工作在用户的目标系统中,PC和仿真只是起到控制和监视作用,因此通过仿真器在用户目标系统上调试的程序基本上是符合用户目标系统在实际工作中的程序的。<br />
<br />
&nbsp;&nbsp;&nbsp; 在完成仿真阶段的程序设计和调试后,DSP程序的开发基本上完成了,剩下的工作,用户只需要将开发的程序生成加载文件提供给用户的目标系统,用户的目标系统按照设计的加载方式对处理器进行加载,那么处理器就能够按照用户设计的程序运行了。<br />
<br />
<br />
<br />
<br />
DSP程序开发的过程示意图如图5-2所示。<br />
<br />
在程序开发过程中,Vishal DSP++集成开发和调试环境中可利用的调试工具见表5-1。<br />
&nbsp;&nbsp;VisualDSP++的集成开发和调试程序界面主要由工程管理窗口、文本编辑窗口、反汇编窗口、输出窗口和一些辅助菜单组成,如图5-3所示。<br />
<br />
&nbsp;&nbsp;&nbsp; 集成开发和调试环境支持对DSP应用程序开发的整个过程,在IDDE的应用程序的开发一般都要经过如下几步:&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 第1步,创建一个新的工程。<br />
<br />
&nbsp;&nbsp;&nbsp; 第2步,设置工程选项。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 第3步,编辑或添加工程源文件。<br />
<br />
&nbsp;&nbsp;&nbsp; 第4步,设置工程编译链接选项。<br />
<br />
&nbsp;&nbsp;&nbsp; 第5步,编译链接Debug版的工程,生成可执行文件。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 第6步,建立Debug Session和加载可执行文件。<br />
<br />
&nbsp;&nbsp;&nbsp; 第7步,运行和调试(Debug)程序。<br />
<br />
&nbsp;&nbsp;&nbsp; 第8步,编译链接加载(Release)版本的工程。<br />
<br />
&nbsp;&nbsp;&nbsp; 通过以上这8步,就可以方便地完成整个DSP的应用开发,下面分别做介绍。<br />
<br />
第1步&nbsp;&nbsp;创建一个新的工程文件<br />
<br />
&nbsp;&nbsp;&nbsp; 在VisualDSP++中,DSP的所有应用开发都是基于工程的,所以创建一个工程文件是整个软件开发的第一步。工程文件(术.dpj)中存放程序的编译链接信息:源文件列表、其关联关系信息和开发工具的选项设置等。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)打开IDDE:选中WINDOWS’中的开始菜单“Start\Programs\Analog Devices\VisualDSP++ 4.5\VisualDSP++ Enviroment”,弹出IDDE主界面o。&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 2)单击“File”下拉菜单中的“new”一&gt;“Project”,VisualDSP++将启动新建工程向导,帮助用户逐步建立新工程。新建工程向导主要包含两个部分:“常规(General)”和“输出类型(Output Type)”。新建工程向导的常规信息窗口如图5.4所示已&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 在新建工程向导中主要包含了所建工程的名称、路径和工程类型等。工程的名称和路径由用户自己设置,工程的类型有四种,分别为:“Standard application”、“Library”、“Muhi—threaded applicaton using VDK”和“TCP/IP Stack application using LwIP and VDK”四种,用户根据自己需要进行选择,系统默认为“Standard application”,本书也将按照“Standard application”进行讲解。在将工程名称、路径和类型设置完成后,单击“NEXT”按钮,VisualDSP++将显示工程选项设置窗口,如图5-5所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 在输出类型窗口中主要是设置工程采用的处理器类型(Processor types)、芯片版本号(Silicon)和工程输出文件类型(Project output)等。<br />
<br />
&nbsp;&nbsp;&nbsp; 处理器类型窗口用于可以选择相关的处理器,该窗口中包含了ADI公司2007年以前的所有处理器类型。<br />
<br />
&nbsp;&nbsp;&nbsp; 芯片版本号选项将随所选的处理器信号变化而变化,包含2007年所有处理器的芯片版本号,另外还附加了自动(Automatic)、无(NONE)和任意(any)三个选项,例如处理器ADSP 201065L有O.1、O.2、O.3三个版本,所以当处理器类型选择为ADSP 21065L时,相应的芯片版本号选项中则有6个选项:自动、无、O.1、O.2、0.3和任意。用户需根据自己开发的处理器芯片版本号自行选择,在芯片版本号未知的情况下可以选择自动或者任意。<br />
<br />
&nbsp;&nbsp;&nbsp; 工程输出文件选项是用来设置工程输出的文件为处理器可执行的文件(Executable File)或者处理器加载文件(Load File)。如果用户的工程处在调试阶段,那么一般将该选项设置为处理器可执行的文件,以方便模拟器或者仿真器进行调试,而如果用户的工程处于开发完成阶段,那么一般将该选项设置成加载文件,加载文件可以用于对处理器进行程序加载。<br />
<br />
&nbsp;&nbsp;&nbsp; 在对新建工程向导的输出类型设置完成后,单击“NEXT”按钮则将显示出用户建立的工程信息,如图5-6所示。如果用户确认信息无误,则单击该窗口中的“Finish”按钮将完成工程的建立,如果用户需要修改工程的某些参数,那么通过单击“Back”按钮可以回到前面的窗口重新进行设置。<br />
<br />
&nbsp;&nbsp;&nbsp; 另外,如果用户在建立工程完成后,通过工程选项窗口也可以对工程进行修改。<br />
<br />
&nbsp;&nbsp;&nbsp; 当新的工程建立完成后,在工程管理窗口中将显示出新的工程,并且在该工程下通常有三个文件夹分别为:源文件文件夹(Source Files)、链接文件夹(Linker Files)和头文件的文件夹(Header Files),它们分别用于存放工程中相关文件,如图5-7所示。<br />
第2步 设置工程选项<br />
<br />
&nbsp;&nbsp;&nbsp; 在新的工程建立完成后,用户可以通过工程选顼窗口对工程修改,并对工程设置参数。用户通过单击visualDSP++主界面中的“Project”下拉菜单,然后选择“Project Options”或者通过键盘快捷方式“Alt+F7’’可以显示出工程选项窗口,如图5-8所示。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 该窗口中主要包含9个部分,分别是:工程(Project)、常规(General)、编译(Compile)、汇编(Assemble)、链接(Link)、分割(Split)、加载(Load)、预编译(Pre.build)和后编译(Post-Bulid)等。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 大部分选项栏的选项可以使用默认值,主要是Project选项栏的设置。它用于选择处理器类型和工程输出类型,其余选项可以使用默认值。Project选项栏的各选项的意义如下。<br />
<br />
&nbsp;&nbsp;&nbsp; ·目标(Target)&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Processor:用于设霉该工程中使用的处理器的类型,包含了ADI公司的绝大多数处理器(如ADSP-21 160、ADSP-2106i、ADSP-21062、ADSP-21065L等)。<br />
<br />
&nbsp;&nbsp;&nbsp; Type:IDDE的输出文件类型,包括可执行文件(E斌utable File)、库文件(Library File)、加载文件(Load File)、目标文件(Object File)和分割文件(Split File)等。<br />
<br />
&nbsp;&nbsp;&nbsp; Name:输出文件的文件名,如FFT。<br />
<br />
&nbsp;&nbsp;&nbsp; ·工具链组(Tool Chain)<br />
<br />
&nbsp;&nbsp;&nbsp; Complier:指定C编译器;<br />
<br />
&nbsp;&nbsp;&nbsp; Assembler:指定汇编器;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Linker:指定链接器;<br />
<br />
&nbsp;&nbsp;&nbsp; Loader:指定加载器;<br />
<br />
&nbsp;&nbsp;&nbsp; Splitter:指定加载方式的镜像文件管理器。<br />
<br />
&nbsp;&nbsp;&nbsp; 该组参数基本上使用默认值即可。<br />
<br />
&nbsp;&nbsp;&nbsp; ·设置(Settings for)&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 指定一个输出类型,有以下两种输出类型:<br />
<br />
&nbsp;&nbsp;&nbsp; Debug类型,编译链接的工程文件可用来进行Debug调试。<br />
<br />
&nbsp;&nbsp;&nbsp; Release类型,生成具有限制的或不能进行Debug调试的工程文件,Release类型通常用来进行优化程序性能。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 一般在调试过程中选择Debug类型,当程序调试好以后,选择Release类型。<br />
第3步&nbsp;&nbsp;编辑或添加工程源代码文件&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 一个工程文件--般包含--+或多个C/C++或者汇编语言源代码文件。当创建了一个工程并在工程选项中指定了所用的处理器类型后,就可以编辑新的源代码文件或将已存在的源文件加入到该工程中。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)添加文件到工程中&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++支持将多种类型的文件添加到工程中,当工程进行编译链接时,IDDE能自动选择可识别的文件进行编译链接。<br />
<br />
&nbsp;&nbsp;&nbsp; 添加文件到工程中一般可以采用三种方法。<br />
<br />
1)通过单击工具栏中的添加文件图标<br />
<br />
&nbsp;&nbsp;&nbsp; 2)选择工程下拉菜单中的“Add to Project”一&gt;“File(s)…”;<br />
<br />
&nbsp;&nbsp;&nbsp; 3)在工程管理窗口中,选中所需添加文件的工程,然后单击鼠标右键,选择菜单中的“Add File(S)to Folder…”选项。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 其他两种添加方式如图5-9、图5一lO所示,无论采用那种方法进行文件添加,都将弹出文件选择窗口,如图5—11所示。&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 在对话窗中可以查找所需的源文件,双击该文件后会自动添加到工程中。被添加的文件会自动出现在工程管理窗口的文件目录列表中,选择某个文件,然后单击鼠标右键就出现对该文件的操作栏。<br />
<br />
&nbsp;&nbsp;&nbsp; (2)新建一个文本文件并把它加入到工程中<br />
<br />
&nbsp;&nbsp;&nbsp; 选File\New,或从工具栏中选择编辑新文件图标按钮,则会打开一个WINDOWS风格的编辑窗口,接下来就可以在里面进行编辑了。VisualDSP++的编辑器可以编辑任意名称的文本文件,VisualDSP++.文本编辑器将根据文件后缀名来判断文件类型并根据文件类型以不同的颜色显示源代码文件中的关键字。<br />
<br />
&nbsp;&nbsp;&nbsp; 当把一个文件添加到工程中后,它会自动更新工程窗口中的关系树。<br />
<br />
&nbsp;&nbsp;&nbsp; (3)编辑文件&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++的编辑功能是非常强大的,不但支持标准的编辑功能,还支持用户、DSP指定语言语法的Hightlighting(不同颜色显示)功能,还可以加入书签和进行列编辑操作等。<br />
<br />
&nbsp;&nbsp;&nbsp; 其他一些标准的编辑操作,如copy、paste、cut和书签等功能与其他的编辑器一样。注意编辑完成后,要把新编辑的文件存盘,并加入到工程中去。<br />
<br />
&nbsp;&nbsp;&nbsp; (4)工程相关性<br />
<br />
&nbsp;&nbsp;&nbsp; 相关性(Dependency)用于描述工程中源文件之间的相互关系,它存放在后缀为.mak的文件中,即哪一个文件需要用到另一个文件的信息,因此这决定了编译链接的顺序。<br />
<br />
&nbsp;&nbsp;&nbsp; 更新工程相关性可以通过Project\Update Dependencies来实现。<br />
第4步 设置工程配置选项<br />
<br />
&nbsp;&nbsp;&nbsp; 创建完工程、设置工程选项和添加源代码文件完成后,需要定义工程配置选项或按照默认的设置进行编译,之后才能生成处理器的可执行文件。通过下拉菜单Project,选择configurations选项,将弹出Projectconfigurations窗口,如图5-12所示,在其中将指定编译链接其产生的工程的类型等。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 工程类型决定工程编译链接后的类型,有两种选择:Debug和Release,默认的类型为Debug。选择Debug类型,并且接受其他默认值时,编译器会产生一个包含有调试信息的目标文件,供调试使用。而选择Release类型,并接受其他默认值时,编译器则会产生一个不包含有调试信息的目标文件,并且会对代码进行优化。<br />
<br />
&nbsp;&nbsp;&nbsp; 在新建工程时,新建工程向导中也有对工程选项的设置。<br />
第5步&nbsp;&nbsp;编译链接Debug版的工程生成可执行文件<br />
<br />
&nbsp;&nbsp;&nbsp; 在对工程配置完成后,需要使用Build方式对工程和相关文件进行编译和链接。使用Build方式有多种方法。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)通过使用工具栏上的图标或者键盘快捷方式“F7”来编译链接当前工程文件,如图5-13所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 2)通过VisualDSP++的下拉菜单Project.,单击菜单里面的Build Project来编译链接当前工程文件,如图5.14所示。<br />
<br />
&nbsp;&nbsp;&nbsp; 3)在工程管理窗口中,选择相应的工程,然后单击鼠标右键,在弹出的菜单中同样有“Bulid Project”相关选项,如图5—15所示,单击后完成对工程的编译链接。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 在编译链接过程中,输出窗口中会显示状态信息。如果编译链接错误,输出窗口将会告知“编译链接失败(Build was unsuccessful)”,如图5一16所示,且显示出错信息和错误类型,用鼠标双击出错信息行,IDDE会自动打开出错的源代码文件,并跳转到与错误信息相关的代码位置。具体的错误所在需要用户自己进行判断。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 而如果编译链接过程成功,那么在输出窗口的“编译链接(Build)”中将会显示“编译完成(Build bompleted successfully)”等相关信息,如图5—17所示。<br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,输出文件类型(工程选项中)必须指定为“Executable File”类型(*.dxe),且工程类型为Debug类型时,才能产生可进行Debug调试的输出文件。<br />
第6步&nbsp;&nbsp;建立调试会话(Debug Session)和加载可执行文件<br />
<br />
&nbsp;&nbsp;&nbsp; 在编译链接成功之后,VisualDSP++将生成处理器可执行文件。这种可执行文件可以在VisualDSP++自带的模拟器环境下运行,也可以由计算机通过仿真器提供给目标板上的处理器,然后在处理器中执行。无论是在模拟器环境下还是在仿真器中,都需要建立调试会话,才能让该文件执行。建立会话完成后,由加载器将可执行文件调入模拟器或者通过仿真器加载给目标板上的处理器内进行执行。会话的相关操作请参见5.4节。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++在工程编译链接完成后,加载器将根据用户建立的会话将编译链接生成的文件加载到模拟器或者通过仿真器加载给用户目标板上的处理器中。加载完成后,VisualDSP++将在输出窗口中显示加载完成信息,如图5—18所示。<br />
<br />
第7步运行和调试(Debug)程序<br />
<br />
&nbsp;&nbsp;&nbsp; 在加载器完成将生成的可执行文件的加载工作后,就可以用VisualDSPC++中的Debugger工具来调试该工程了。<br />
<br />
&nbsp;&nbsp;&nbsp; 通过单击工具栏上的图标或选择Debug菜单中的子菜单,就可以对程序进行运行、停止等调试操作,如图5-19所示。用户根据需要不断对程序进行修改、完善和优化。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 如果工程不是当前的(有过期的源文件或Dependency信息),IDDE会建议你先编译链接此工程,然后再启动Debugger工具并把可执行文件加载到Debugger工具中。&nbsp;&nbsp;&nbsp;<br />
第8步&nbsp;&nbsp;编译链接Release版的程序和生成加载文件<br />
<br />
&nbsp;&nbsp;&nbsp; 用户在对调试版的程序调试完成后,就基本完成了对DSP应用程序的基本开发,接下来,可以将调试版本的程序优化后生成正式版本程序。在生成正式版本程序后,如果用户开发的工程是需要应用在硬件平台上的,那么用户还需要将生成的正式版程序编译生成处理器的加载文件,提供给处理器系统中的程序加载方,实现处理器系统运行程序的加载。<br />
<br />
&nbsp;&nbsp;&nbsp; 生成正式版程序和加载文件可以通过以下简单的步骤完成。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)选择VisualDSP++主界面中的Project下拉菜单,然后单击Project Configurations,将其设置成“Release”,或者在Project下拉菜单中选择Option,将其中setting for的内容修改为“Release”即可;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 2)选择VisualDSP++主界面中的Project下拉菜单中的Options,将其中Type的内容修改为Load File。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 3)在Options窗口中,选择Load选项,根据用户系统的要求对所生成的加载文件进行设置,设置选项如图5-20所示。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 4)编译链接该工程,VisualDSP++将生成正式版本的程序。&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
经过前面八个步骤,可以认为DSP处理器程序开发完成。<br />
Visual DSP++的IDDE中已经集成了Debugger工具。Debugger是WINDOWS窗口操作界面,操作使用非常方便。在Debugger工具下,可以直接应用ADI公司的模拟器(Simulator)和仿真器(Emulator)工具。<br />
<br />
 <br />
<br />
&nbsp;&nbsp;4.1&nbsp;&nbsp;设置调试会话<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 进行Debugger调试的第一步是必须先设置好调试会话(Debugging Sessions)。在调试会话中主要是设置调试的目标和调试所使用的工具的。Debugger工具支持的会话类型包括硬件仿真调试会话和软件仿真调试会话。硬件调试会话必须有硬件系统的支持,也就是VisualDSP++软件会检测所需调试的目标硬件系统,而软件调试会话不需要硬件系统支持,是由VisaulDSP++自带软件模拟器工具通过计算来模拟处理器的工作。<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 1.新建调试会话的设置<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 新建调试会话的设置步骤如下。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)单击VisualDSP++主界面的。“会话(Session)”,然后选择“New Session'’,IDDE将弹出新建会话向导,如图5-21所示。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 新建会话向导有三个步骤,分别是:处理器选择(Select Processor)、连接类型选择(Select Connection Type)和平台选择(Select Platform)。<br />
<br />
&nbsp;&nbsp;&nbsp; 处理器选择如图5-21所示,主要用于设置所建立的调试会话是针对何种处理器,处理器型号的选择等。在该窗口中,主要选项如下:&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 1)Pmcessr用于选择会话的目标处理器类型,有Blackfin、SHARC和TigerSHARC三种类型。用户需要根据所调试的目标处理器进行选择。<br />
<br />
&nbsp;&nbsp;&nbsp; 2)Choose a target processor——用于选择具体的处理器型号,该选项的内容将随Processor选项的处理器类型选择变化而变化,比如,如果Processor中选择为TigerSHARC系列,那么在Choose a target processor中将只会显示TigerSHARC系列处理器,只有ADSP TSl01、ADSP TS201、ADSP TS202和ADSP TS203等,同样如果选择为SHARC类型,那么该窗口中将显示SHARC系列的相关型号o<br />
<br />
&nbsp;&nbsp;&nbsp; 3)Configurator——用于配置非模拟器环境下的会话。由于在模拟器环境下是通过计算机来模拟处理器的运行,所有并不需要使用硬件配置,但如果用户开发的是非模拟器的目标,如EZ-KIT评估板或者用户设计的处理器硬件系统,那么就需要使用Configurator。因此,对于非模拟器平台,只有在Configurator中定义了的非模拟器平台才可以在新建会话向导中选择,否则用户的目标系统将无法正常使用。VisualDSP++Configurator窗口如图5-22所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 在Configurator中用户可以根据自己的目标系统设置所对应的平台,而且在Configurator中直接带有了各种处理器评估板系统的平台。用户如果建立了自己的目标系统平台,通过单击“新建(New)”按钮将弹出新建仿真平台窗13,如图5-23所示。&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 在该窗口中,有三个参数组,分别是:平台(Platform)、仿真器设置(Emulation Settings)和器件(Devices)。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 平台(Platform)——包含两个参数:名称(Name)和平台类型(Type)。名称用来为所建立的平台命名,用户可以随意命名。平台类型有:通过串口和USB方式连接的各种处理器的EZ—KIT、HP PCI仿真器、HP USB仿真器等,该类型的选择需根据用户的硬件系统进行选择。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 仿真器设置(Emulation Settings)——用于设置用户计算机上安装的仿真器的相关硬件地址,该参数随用户的仿真器选择不同而不同。在正常情况下,该窗口会自动识别计算机上安装的仿真器而直接提取仿真器相关的地址参数,因此基本上用户可以不用修改该部分内容。如果用户希望自己修改仿真器的地址,那么用户需要通过操作系统中的硬件设备管理来查询仿真器相关的地址。&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 器件(Devices)——用于设置用户所建立的硬件平台中的处理器型号,该处的处理器型号必须与用户硬件平台中的处理器、用户建立工程的处理器型号一致。可以通过新建(New)、修改(Modify)、删除(Delete)和全部删除(Delete A11)等方式。图5-24为新建仿真平台中的器件选择窗口。<br />
<br />
&nbsp;&nbsp;&nbsp; 4)License——用于管理VisualDSP++的授权信息,如图5-25所示。VisaulDSP++在安装后需要输入软件序列号,并进行授权验证后才能正常使用,否则VisualDSP++将只能试用30天,且部分使用功能受限。在进行新会话设置的时候,对该窗口可以不予以设置。<br />
<br />
&nbsp;&nbsp;&nbsp; (2)在对处理器选择窗口设置完毕后,单击下一步(NEXT)将进入到连接类型选择(Select Connection Type)窗口,如图5-26所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 连接类型选择窗口主要是用于设置所建立的会话使用的连接方式,在一般正常安装的VisualDSP++中会有四种连接方式:评估板系统(EZ—KIT Lite)、仿真器(Emulator)、模拟器(Simulator)和遗留目标(Legacy Target)。根据安装VisualDSP++的授权不同,在该窗口中有些选项可能不能选择。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 用户根据需要自行选择其中的一种即可。对于模拟器方式,不需要硬件支持,完全由计算机来模拟处理器的运行,而对于评估板系统和仿真器连接方式是需要用户提供硬件平台进行连接的。如果用户没有硬件平台,而在此处选择为评估板系统和仿真器连接方式,那么在建立会话完成后,由于VisualDSP++检测不到硬件设备,VisualDSP++将会弹出错误信息,如图5-27所示,提示用户连接不上硬件平台。因此如果用户在没有硬件系统时,只能将类型选择作为模拟器方式。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; (3)用户在确定会话的连接方式后,单击下一步,将显示所建立的会话使用到的平台,如图5-28所示。对于大多数处理器而言,除针对部分Blackfin系列的处理器建立的平台该窗口中有两个选项,该窗口中只有单一的选项。因此对于大多数情况,该窗口使用默认选项即可。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; (4)单击下一步后,将显示用户新建会话的信息,以便用户检验所建立的会话是否正确,如图5-29所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 用户在确定所建立的会话信息无误后,单击完成(Finish)后,VisualDSP++将根据用户的设置建立会话。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 在会话建立完成后,VisualDSP++将把刚建立完成的会话作为当前的会话平台。另外用户可以从下拉菜单Session中的会话选择,在会话列表中查看到用户建立的会话和选择其他以前建立的会话。&nbsp;&nbsp;<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 2.打开已经存在的调试会话<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 如果用户已经建立过多个会话环境,用户可以对存在的所有会话进行管理并在其中进行选择。选择已经存在的会话,拥户只需要通过VisualDSP++主界面的“会话(Session)”下拉菜单,单击“会话选择(Select Session)”,然后在选择所需要的会话即可,如图5-30所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 用户通过会话列表(Session List)可以完成对已经存在的会话进行管理和选择。单击会话列表(Session List)后,VisualDSP++将弹出会话管理窗口,如图5-31所示。在该窗口中可以新建、删除和激活已经存在的会话。<br />
4.2&nbsp;&nbsp;程序执行操作&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Debugger中的程序执行命令在Debug下拉菜单中,如图5—19所示。这些命令在工具栏中也有相应的快捷按钮。下面简单说明一些常用的执行命令。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)运行(Run):<br />
<br />
&nbsp;&nbsp;&nbsp; 运行程序直到遇到某种条件才停止,程序停止的条件可以是执行到断点或用户干预等。当程序处于停止状态时,在VisualDSP++中所有的已经打开的各种相关窗El的内容都更新为程序运行后的值。&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; (2)暂停(Halt)<br />
<br />
&nbsp;&nbsp;&nbsp; 程序在执行过程中,用户可以通过暂停功能来暂停程序的执行。当程序处于暂停状态时,在VisualDSP++中所有已经打开的各种相关窗口的内容都更新为程序运行后的值,且状态条显示为当前程序停止的地址。<br />
<br />
&nbsp;&nbsp;&nbsp; (3)执行到光标所在位置(Run To Cursor)<br />
<br />
&nbsp;&nbsp;&nbsp; 该功能将使程序运行,直到程序执行到光标所在位置时,程序暂停。光标的位置可以在源文件窗或反汇编窗中设置。<br />
<br />
&nbsp;&nbsp;&nbsp; (4)执行1行程序(Step over)<br />
<br />
&nbsp;&nbsp;&nbsp; 仅仅执行1行C语言程序行,仅用于C语言程序。<br />
<br />
&nbsp;&nbsp;&nbsp; (5)单步执行程序(Step Into)<br />
<br />
&nbsp;&nbsp;&nbsp; 单步执行程序。每执行1步,所有已经打开的相关窗口的内容都更新。<br />
<br />
&nbsp;&nbsp;&nbsp; (6)单步执行当前函数(Step out of)<br />
<br />
&nbsp;&nbsp;&nbsp; 单步执行当前函数,直到返回到它的调用程序。仅用于C语言程序。<br />
<br />
&nbsp;&nbsp;&nbsp; (7)复位(Reset)&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 通过VisualDSP++对处理器进行复位,如果当前会话处于模拟器状态,那么VisualDSP++将使模拟器所有状态复位,而如果VisualDSP++处于硬件会话环境下,那么VisualDSP++将通过仿真器向目标系统上的处理器发送复位信号。在复位后,必须使用加载器将程序重新加载才可以运行。<br />
 <br />
4.3&nbsp;&nbsp;程序性能分析操作 <br />
&nbsp;&nbsp;&nbsp; VisualDSP++调试器中提供了两个工具来分析程序的执行情况:跟踪(Trace)和线性剖析(Linear Profiling)。这两个命令都位于VisualDSP++的“Tools”下拉菜单中,如图5-32所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 1.跟踪(Trace)<br />
<br />
&nbsp;&nbsp;&nbsp; 提供对程序执行指令的跟踪,结果显示程序如何执行到某一地址上,显示程序的读、写和存储器访问。通过如下步骤来设置Trace功能并显示其结果。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)单击VisualDSP++主界面Tool下拉菜单中的Trace,选择Enable Trace激活跟踪操作;<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 2)单击VisualDSP++主界面Tool下拉菜单中的Trace,选择Set Trace Depth,然后设置Trace Buffer Depth,如图5—33所示,选择用户定义的跟踪深度或最大跟踪深度,VisualDSP++默认为最大跟踪深度;<br />
<br />
&nbsp;&nbsp;&nbsp; 3)单击VisualDSP++主界面View下拉菜单中的Debug Windows,选择Trace打开跟踪显示窗口;<br />
<br />
&nbsp;&nbsp;&nbsp; 4)运行程序,在通过对程序设置断点或者使用Halt命令来停止程序的执行后,通过跟踪窗口可以查看跟踪的执行结果,如图5-34所示。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 跟踪的结果含有如下内容:&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; ·访问类型(RD或WR)<br />
<br />
&nbsp;&nbsp;&nbsp; ·内存类型(PM或DM)<br />
<br />
&nbsp;&nbsp;&nbsp; ·方括号中的地址([ ])<br />
<br />
&nbsp;&nbsp;&nbsp; ·读写的数据值<br />
<br />
&nbsp;&nbsp;&nbsp; 对于跟踪分析工具的使用需要注意以下几点:<br />
<br />
&nbsp;&nbsp;&nbsp; 1)对于SHARC及TigerSHARC处理器,系统的虚拟内存限制了深度;<br />
<br />
&nbsp;&nbsp;&nbsp; 2)对于Blackfin系列处理器,在模拟器中不支持跟踪,但是在仿真器中支持跟踪。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.剖析(Profiling)<br />
<br />
&nbsp;&nbsp;&nbsp; VisualDSP++的剖析工具Linear Profile是用来分析程序的运行时间特性,通过线性统计剖析,可以分析出每段程序的耗时量和在整个程序运行中所占用的比例,为用户分析程序的性能、优化程序提供帮助。VisualDSP++4.5提供了线性统计剖析工具,即对运行的程序做统计分析,计算出每条指令占用执行程序中的百分比和运行的周期数,并以统计表的形式给出。<br />
<br />
&nbsp;&nbsp;&nbsp; 完成一次剖析的基本步骤如下:<br />
<br />
&nbsp;&nbsp;&nbsp; 1)编译和链接工程完成;<br />
<br />
&nbsp;&nbsp;&nbsp; 2)单击VisualDsP++主界面Tool下拉菜单中的Linear Profiling,选择New Profiling建立和激活新的剖析;<br />
<br />
&nbsp;&nbsp;&nbsp; 3)在新建剖析窗VI中的空白处单击鼠标右键,选择Properties…,如图5-35所示。<br />
<br />
&nbsp;&nbsp;&nbsp; 4)在选择Properties…后,VisualDSP++将弹出剖析参数设置窗口,如图5-36所示。在该窗口中可以对全部程序进行分析,也可以对C/C++子函数进行分析,还可以指定程序的址段进行分析。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 5)在对所需分析的程序段设置后,运行程序,那么在剖析窗口中将显示线性统计剖析的结果,如图5-37所示。剖析窗口中的左半部分为用户所分析的程序段相关的结果,使用鼠标双击相关的函数,那么在窗口的右半部分将显示出对该函数中每条指令进行线性统计的结果。在该窗口中显示的结果默认为每个子程序或者每条程序占整个剖析运行程序段的百分比,通过修改剖析参数,也可以显示每条指令执行的周期数。<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,在每次重新编译的时候,由于VisalDSP++会使用到预编译器,因此在每次编译后,剖析窗口中的数值都会发生变化。另外,如果对剖析窗VI中的数值不采用清除操作,那么剖析的结果将一直进行累计。所以在实际运用过程中,无论是程序重新编译还是重新执行程序,都应当先将剖析窗口中原有的数值清除后再运行程序进行分析,否则分析出来的数据有可能不准确。<br />
<br />
&nbsp;&nbsp;&nbsp; 清除剖析窗口中原有数值的方法非常简单,在剖析窗口中单击鼠标右键,选择菜单中的Clear Profiling即可。<br />
 <br />
4.4 设置观察点&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 观察点(Watch Point)与断点(Break Point)功能非常相似,断点可以在程序的任意位置上设置,使程序暂时停止执行。而观察点可以设置某种条件,当满足条件时才暂停程序的执行,如存储器读写、堆栈弹出等。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 通过下列步骤来设置观察点。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)选择VisualDSP++主界面下拉菜单Settings中的Watch points,会出现一个Watch points对话框,如图5-38所示。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 2)该窗口用于设置使程序停止的条件,使程序停止运行进行判断的方式有三种:寄存器(Registers)、硬件堆栈(Hardware Stacks)和存储器(Memory)。下面以寄存器页面为例进行说明,在寄存器类型中主要包括如下一些设置:<br />
<br />
&nbsp;&nbsp;&nbsp; Register一列出了所有寄存器,提供给用户用于选择需要的寄存器进行条件设置。<br />
<br />
&nbsp;&nbsp;&nbsp; Watch For Read——当指定寄存器的读操作满足条件,就暂停程序的执行。读取到数值判断有四种:读到任意值(Any Read)、读入特定值(Read value)、读入值作为某种计算的操作数(Read in computation)和读入未定义的值(Read uninitial)。<br />
<br />
&nbsp;&nbsp;&nbsp; Watcn For WIite——当指定寄存器的写操作满足条件,就暂停程序的执行。条件判断有四种:写任意值(Any write)、或者写指定的值(Write vaIue)、写的值作为某种计算的操作数(Write in computation)、写未定义的值(Write uninitial)。<br />
<br />
&nbsp;&nbsp;&nbsp; Value——读或者写操作的指定值。<br />
<br />
&nbsp;&nbsp;&nbsp; Format——读或者写的指定值的格式,可以选择二进制、整数、浮点数等。<br />
<br />
&nbsp;&nbsp;&nbsp; Add、Edit、Delete——对观察点列表进行添加、删除、编辑等管理操作。<br />
<br />
&nbsp;&nbsp;&nbsp; 3)对观察点判断条件设置完毕后,单击Add按钮,将所指定的观察点加入到观察点列表中。利用Add按钮可以加入多个观察点到列表中。<br />
<br />
&nbsp;&nbsp;&nbsp; 4)单击OK按钮,完成设置。<br />
<br />
&nbsp;&nbsp;&nbsp; 5)运行程序,当程序运行时,满足所设置的任意一个条件时,VisualDSP++将自动停止运行程序。<br />
4.5 模拟硬件环境 <br />
&nbsp;&nbsp;&nbsp; 为了方便用户在模拟器环境下更好的调试用户所编写的程序,VisualDSP++的调试器提供了3种硬件环境的方式模拟:<br />
<br />
&nbsp;&nbsp;&nbsp; Interrupts——中断,模拟在程序的执行过程中产生外部随机中断。<br />
<br />
&nbsp;&nbsp;&nbsp; Streams——数据流,模拟处理器通过外部端口进行数据传输。’<br />
<br />
&nbsp;&nbsp;&nbsp; Load Sim Loader——模拟处理器通过EPROM或主机等方式的加载过程。<br />
<br />
&nbsp;&nbsp;&nbsp; 上面三种硬件模拟均在VisualDSP++主界面的Settings下拉菜单中,用户通过单击Setting按钮就可以对其进行设置,下面分别介绍。<br />
<br />
&nbsp;&nbsp;&nbsp; 1.中断(Interrupts)模拟<br />
<br />
&nbsp;&nbsp;&nbsp; 中断模拟用于模拟程序在执行过程中处理器外部产生随机中断,这对调试中断服务程序是非常有用的,其设置窗口如图5—39所示。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 该窗口中的主要选项意义如下:<br />
<br />
&nbsp;&nbsp;&nbsp; External interrupts——外部中断类型,用于设置外部中断的类型,包括FLAG中断、IRQ中断、定时器中断等,具体的中断类型与用户选择的处理器型号有关,不同的处理器所包含的外部中断类型也有所不同o<br />
<br />
&nbsp;&nbsp;&nbsp; Min cycles——中断信号产生的最小指令周期间隔o<br />
<br />
&nbsp;&nbsp;&nbsp; Max cycles——中断信号产生的最大指令周期间隔。<br />
<br />
&nbsp;&nbsp;&nbsp; Offset cycles——在第一次中断发生之前的指令周期数。<br />
<br />
&nbsp;&nbsp;&nbsp; Interrupts——显示设置完成的模拟中断及其参数。&nbsp;&nbsp;&nbsp; 、<br />
<br />
&nbsp;&nbsp;&nbsp; Add、Remove、Remove All——用于对设置完成的模拟中断进行添加、删除的管理操作。<br />
<br />
&nbsp;&nbsp;&nbsp; 在对模拟断设置完毕后,直接运行程序即可,那么中断模拟器将会按照所设置的方式产生中断。&nbsp;&nbsp;&nbsp; .<br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,无论是重新执行程序、重新编译链接工程还是重新加载已编译过的程序,模拟中断都并不会取消,只有在模拟中断设置窗口中,将其删除,那么才能停止产生模拟的中断。当然如果重新启动VisualDSP++是可以关闭模拟中断的。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.数据流(Streams)模拟和DMA模拟传输<br />
<br />
&nbsp;&nbsp;&nbsp; 1)SHARC和Blackfin系列处理器的数据流传输<br />
<br />
&nbsp;&nbsp;&nbsp; 数据流模拟是用于模拟处理器通过外部端口进行数据传输过程的。数据流模拟可以模拟处理器的外部数据总线、链路口、串口等端口的数据传输。该功能对于在模拟器环境下调试处理器的DMA传输非常有效。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; ①单击VisualDSP++主界面的下拉菜单中的Stream,将弹出数据流管理窗口,单击数据流管理窗口中的添加(ADD)按钮,将显示新建的模拟数据流传输的设置窗口,如图5-40所示。数据流管理窗口可以对已经存在的数据流模拟进行修改或删除等操作。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; ②新建数据流设置窗口中的主要包含了数据流的源和目的、类型端口等。主要参数说明<br />
<br />
如下:<br />
<br />
&nbsp;&nbsp;&nbsp; Source/Destination——数据传送的源/目的,用以设置数据传输的来源和目的,只有数据传输的源和数据传输的目的均设置正确才能进行数据流传输。<br />
<br />
&nbsp;&nbsp;&nbsp; Processor——给出针对数据流模拟的器件,该参数默认为会话选择的处理器型号。<br />
<br />
&nbsp;&nbsp;&nbsp; Device——数据流使用的设备,也就是数据流传输使用的端口或者存储器。<br />
<br />
&nbsp;&nbsp;&nbsp; Address——数据流使用的I/O地址。<br />
<br />
&nbsp;&nbsp;&nbsp; File/Browse——用于采用文件方式实现数据流模拟中打开数据文件。<br />
<br />
&nbsp;&nbsp;&nbsp; Format——数据传输使用的格式,数据流可以采用十六进制、十进制、二进制等整数类型和浮点格式进行数据传输。<br />
<br />
&nbsp;&nbsp;&nbsp; Circular——设置数据文件读取过程中,读取到数据结束后是否采用循环方式再从头读取数据,如果该选项选中,则支持循环读取方式,否则不支持循环读取数据文件。<br />
<br />
&nbsp;&nbsp;&nbsp; ③对数据流设置完成后,单击OK按钮,退出窗口;<br />
<br />
&nbsp;&nbsp;&nbsp; ④运行程序,那么在程序运行过程中,处理器通过指令或者DMA均可以实现对数据的获取或者写出。<br />
<br />
&nbsp;&nbsp;&nbsp; 处理器读取数据流一般是从外部文件将数据读入,处理器写出的数据也将写出到文件中,用户通过相关的文件可以查看处理器传输的数据。<br />
<br />
&nbsp;&nbsp;&nbsp; 2)TigerSHARC系列处理器的DMA模拟传输<br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,前面讲述的数据流模拟传输的设置只针对SHARC和Blackfin系列处理器有效,而对于TigerSHARC系列处理器,VisualDSP++只提供DMA模拟传输,且相关操作如下。<br />
<br />
&nbsp;&nbsp;&nbsp; ①如果用户选择了TigerSHARC系列处理器的会话环境,那么在VisualDSP++主界面的下拉菜单Settings中的Stream选项将不可选择,用户应当选择Simulator,然后单击Config DMA File I/O…,将弹出TigerSHARC系列处理器的DMA传输模拟器设置窗口,如图5-41所示。&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; ②在该窗口中主要包含对DMA的数据源和数据目的进行设置的参数,主要选项如下:<br />
<br />
&nbsp;&nbsp;&nbsp; DMA Channels——DMA通道选择。TigerSHARC系列处理器带有14个DMA通道,通道O~3分配给了处理器外部总线端口,通道4~7分别分配给了4个链路口的发送端口,通道8~11分别分配给了4个链路口的接收端口,通道12~13分配给了AutoDMA通道。用户根据模拟的需要,选中所需的DMA通道即可。该窗口支持对多个DMA同时模拟,但用户需要对每个DMA通道进行设置。<br />
<br />
&nbsp;&nbsp;&nbsp; Enable Description——DMA通道使能描述,用于显示选中的DMA是否被使能。如果相应的DMA通道使能,那么将使该选项使能。<br />
<br />
&nbsp;&nbsp;&nbsp; Halt On Error——选中该选项,若DMA在传输过程中遇见任何错误,DMA传输将停止。<br />
<br />
&nbsp;&nbsp;&nbsp; Source——用于设置DMA传输的数据源,如果模拟DMA通道从处理器外部获取数据,设置该选项,如果模拟DMA通道从处理器内部向外部送出数据,那么该相关参数将不用设置。它包含以下参数:&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Path——用于设置DMA数据传输的数据文件存放的路径。<br />
<br />
&nbsp;&nbsp;&nbsp; Preview——对用户选中的数据文件进行预览,方便用户确认所需传输的数据是否正确。支持十六进制、十进制和浮点等处理器支持的所有格式。<br />
<br />
&nbsp;&nbsp;&nbsp; Circular——设置数据文件读取过程中,读取到数据结束后是否采用循环方式再从头读取数据,如果该选项选中,则支持循环读取方式,否则不支持循环读取数据文件。<br />
<br />
&nbsp;&nbsp;&nbsp; On/On New Sequence——进行新的DMA传输采取的方式,Rewind为从数据文件的开头进行数据读取;Continue从上次DMA传输完毕的数据位置接着读取数据。<br />
<br />
&nbsp;&nbsp;&nbsp; Destination——用于设置DMA传输的数据目的,如果模拟DMA通道从处理器内部向外部送出数据,设置该选项,如果模拟DMA通道从处理器外部获取数据,那么该相关参数将不用设置。它包含以下参数:<br />
<br />
&nbsp;&nbsp;&nbsp; Path——用于设置DMA数据传输的数据文件存放的路径。<br />
<br />
&nbsp;&nbsp;&nbsp; Fomat——用户通过DMA通道输出数据的格式,支持十六进制、十进制和浮点等处理器支持的所有格式。<br />
<br />
&nbsp;&nbsp;&nbsp; Comment——写入到输出文件中的注释,在该窗口中的注释信息将写在输出数据文件中的开头位置。<br />
<br />
&nbsp;&nbsp;&nbsp; On/On New Sequence——进行新的DMA传输的采取的方式,Rewind为从数据文件的开头进行数据写操作,即覆盖上次DMA传输写出的数据;Append为将DMA传输悬挂起来。<br />
<br />
&nbsp;&nbsp;&nbsp; 3)用户在设置该窗口中的参数完成后,单击OK按钮即可。数据的传输由用户的程序来控制开启,并且只能采用DMA方式进行数据传输,处理器通过指令访问将无效。<br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,由于对数据的传输需要通过用户的程序控制开启,因此在该窗口中的设置应当与用户程序中所设置的DMA通道及其方向一致,否则将不能模拟DMA的正常传输。<br />
<br />
&nbsp;&nbsp;&nbsp; 3.Load Sim badef模拟&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Load Sim Loader是用来模拟EPROM或主机给处理器加载.1dr文件的过程,为用户设计实现处理器加载提供帮助。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 通过下列步骤可以建立一个处理器EPROM加载。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)选择VisualDSP++主界面的下拉菜单Settings中的Load Sim Loader,如图5-42所示。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 2)在该菜单中有两个选项:从主机加载启动(Boot from Host)和从PROM加载启动(Boot from PROM),分别用于模拟从主机对处理器进行加载启动和让处理器从PROM加载启动。由于不同处理器的加载方式不同,因此对于不同的处理器,该菜单中的内容也有所不同,具体的内容与处理器所具有的加载方式有关,例如对于ADSP-21062具有链路口加载方式,则该菜单中也就包含了连接口加载方式的模拟。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 无论模拟主机加载启动还是PROM加载启动,选择以后,VisualDSP++都将提示选择所需要加载的文件,加载文件是后缀名为.ldr的文件,选择加载文件完毕后,VisualDSP++将提示用户单击调试(Debug)菜单中的复位(Reset)按钮,然后弹出提示信息。如图5-43所示,在用户单击确认并复位完成后,VisualDSP++将进入模拟加载过程。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 3)进入模拟加载过程后,用户直接运行程序,VisualDSP++将自动完成加载过程。用户通过单步执行程序,可以观察到处理器的模拟加载过程。<br />
<br />
&nbsp;&nbsp;&nbsp; 4)如果要从模拟加载环境下退出,需要单击VisualDSP++主界面的下拉菜单Settings中的Load Sim Loader,并将其设置成无加载(None of Above)方式。<br />
4.6&nbsp;&nbsp;寄存器窗口操作<br />
<br />
&nbsp;&nbsp;&nbsp; 寄存器操作也是DSP调试过程中经常使用的。寄存器的显示通过在VisualDSP++主界面的寄存器(Register)下拉菜单中进行选择即可,如图5埘所示。寄存器下拉菜单中一般包含了核寄存器、系统寄存器、IO端口寄存器或者附属设备寄存器等,具体内容随处理器型号而异。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 通过鼠标右键可以更改寄存器数据格式的显示方式,如图5-45所示。寄存器的数据格式包括:十六进制、八进制、二进制、有符号或无符号整数、32/40位浮点、有符号或无符号小数等。&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 在寄存器窗口中可以改变寄存器内容显示的数据格式和修改寄存器内容。修改寄存器的值只需要选中需修改的寄存器,鼠标双击后即可对寄存器的值进行修改,当它高亮显示后,敲入新值并回车就可以了,也可以用文本编辑操作,如复制、剪切、粘贴等对寄存器的值进行修改。<br />
4.7&nbsp;&nbsp;存储器窗口操作<br />
<br />
&nbsp;&nbsp;&nbsp; 存储器窗口不但像寄存器窗口那样,可以提供数据格式和编辑操作,还提供跳转(Goto)、查找(Search)、填充(Fill)、导出(Dump)等功能。<br />
<br />
&nbsp;&nbsp;&nbsp; 下面分别介绍存储器操作。<br />
<br />
&nbsp;&nbsp;&nbsp; (1)存储器查看<br />
<br />
&nbsp;&nbsp;&nbsp; 通过单击VisualDSP++下来菜单存储器(Memory),选择存储器查看方式,如图5-46所示.即可弹出存储器窗VI,如图5-47所示。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 值得注意的是,不同的处理器片内存储器的物理结构不同,因此对于不同处理器,存储器下拉菜单的内容也有所不同。例如,SHARC系列处理器的片内存储器是按照16位设计的,因此SHARC系列处理器的存储器查看方式有短字(Short Word)、32位字(Two Column)和48位字(Three Column)等查看方式;而TigerSHARC系列处理器的片内存储器是按照32位设计的,因此TigerSHARC系列处理器的存储器查看方式只有32位查看方式。<br />
<br />
&nbsp;&nbsp;&nbsp; (2)改变存储器数据格式<br />
<br />
&nbsp;&nbsp;&nbsp; 类似对寄存器窗口的操作,选中所需修改地址对应的数值,双击鼠标左键,高亮后填人修,然后修改即可。<br />
<br />
&nbsp;&nbsp;&nbsp; (3)跳到某一地址上查看<br />
<br />
&nbsp;&nbsp;&nbsp; ①直接在存储器窗口的跳转地址栏中敲人所需跳转的地址即可,该地址栏支持16进制地址输入和标号选择;<br />
<br />
&nbsp;&nbsp;&nbsp; ②在激活的存储器窗VI上单击鼠标右键,在菜单中选择Go To命令,会出现一个GO To Address对话框,如图5-48所示。在此对话框中敲人十六进制的地址或通过Browse从标号<br />
<br />
列表中选择一个标号,单击OK按钮即可。存储器窗口中的显示内容会变成指定地址的存储器的内容。&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; (4)填充或者导出存储器数据<br />
<br />
&nbsp;&nbsp;&nbsp; 填充是把数据填充到存储器中,导出是把存储器内容写到数据文件(.dat)中。<br />
<br />
&nbsp;&nbsp;&nbsp; 1)在激活的存储器窗口中单击鼠标右键,在菜单中选择Fill,将出现存储器数据填充对话框,如图5-49所示。配置该窗口中的参数,完成后单击OK按钮即可。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; 填充存储器的数据来源有两个:固定值和用户数据文件。<br />
<br />
&nbsp;&nbsp;&nbsp; 该窗口中的主要选项含义如下:<br />
<br />
&nbsp;&nbsp;&nbsp; Address——要填充的存储器首地址。该栏中可以填人16进制地址,也可以填入用户程序中定义的变量名o<br />
<br />
&nbsp;&nbsp;&nbsp; Memory——要填充的存储器类型,该选项使用默认即可。<br />
<br />
&nbsp;&nbsp;&nbsp; Count——要填充的数据长度。<br />
<br />
&nbsp;&nbsp;&nbsp; Stride——填充存储器的地址增量。<br />
<br />
&nbsp;&nbsp;&nbsp; Value——填充的数值,该功能只在采用固定数值填充时有效,也就是在“Fill from a file”选项无效的时候才能使用。 <br />
<br />
&nbsp;&nbsp;&nbsp; Fill From a File——当选择此项时表示利用文件数据填充存储器,否则必须指定一个值,该选项有效后,文件设置(File settings)选项才有意义。<br />
<br />
&nbsp;&nbsp;&nbsp; File Name——采用文件填充时,数据文件存放的路径和文件名。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 2)在激活的存储器窗口中单击鼠标右键,在菜单中选择dump,将出现存储器数据导出设置对话框,如图5-50所示。配置该窗口中的参数,完成后单击OK按钮即可。<br />
<br />
&nbsp;&nbsp;&nbsp; 该对话框中的主要选项含义如下:&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Address——要保存数据的存储器首地址。该栏中可以填入十六进制地址,也可以填人用户程序中定义的变量名。<br />
<br />
&nbsp;&nbsp;&nbsp; Memory——要填充的存储器类型,该选项选择默认即可。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Format——存储器数据格式,支持十六进制、十进制、八进制、二进制、整数、浮点数等各种类型。<br />
<br />
&nbsp;&nbsp;&nbsp; Count——要保存的数据长度。<br />
<br />
&nbsp;&nbsp;&nbsp; Stride——保存数据的存储器地址增量。&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; Dump to a file——将数据保存到文件选项,该选项必须有效,否则不能正常保存数据。<br />
<br />
&nbsp;&nbsp;&nbsp; Show addresses——地址显示选项,如果该选项选中,那么在导出的数据文件中,除了会将数据保留,还会将数据多对应的存储器地址也保留:且一一对应。<br />
<br />
&nbsp;&nbsp;&nbsp; File Name——保留数据的文件存放的路径和文件名。<br />
<br />
<br />
 <br />
<br />
&nbsp;&nbsp;&nbsp; (5)
vfdff(作者)
2008-11-09 17:24
12
ALU逻辑算术指令编程 <br />
<br />
一。试验目的:<br />
a。 掌握ALU的结构原理和数据流; <br />
<br />
b。 掌握ALU的算术逻辑指令用法; <br />
<br />
c。 理解饱和和舍入的含义; <br />
<br />
二。 试验代码:<br />
<br />
<br />
.section program ; <br />
<br />
.global _main ; <br />
<br />
_main : <br />
<br />
<br />
// 16bit operation ; <br />
<br />
// 16bit ALU, Addition ; <br />
 r0.h = 0xa5a5 ;<br />
 r7.l = 0x5a5a ; <br />
 r6.h = r0.h + r7.l (ns) ; <br />
 <br />
// 16bit ALU with AC ; <br />
 R0.L = 0x6000 ; <br />
 R5.H = 0X3000 ; <br />
 R7.L = R5.H + R0.L ( NS) ;&nbsp;&nbsp;// 不饱和操作; <br />
 R7.H = R5.H + R0.L ( S ) ;&nbsp;&nbsp;// 饱和操作,比较结果; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;两个负数相加后的结果;<br />
 R0.L = 0XE5A4 ; <br />
 R4.H = 0X8A5A ; <br />
 R5.L = R0.L + R4.H (S) ; <br />
 R5.H = R0.L + R4.H (NS) ;&nbsp;&nbsp;&nbsp;// 对比结果看异同; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 两个负数相加后不溢出的情况; <br />
 R6.H = R0.H + R0.L (S) ; <br />
 R6.L = R0.H + R0.L (NS) ;&nbsp;&nbsp;&nbsp;// 对比结果看异同; <br />
 <br />
// 32bit opertation ; <br />
<br />
 R0.H = 0X5555; <br />
 R0.L = 0X5555; <br />
 R2.H = 0XAAAA; <br />
 R2.L = 0XAAAA; <br />
 R4 = R0 + R2 (NS) ;&nbsp;&nbsp;&nbsp;// 32bit 带饱和操作; <br />
 <br />
 R2.H = 0X5555; <br />
 R2.L = 0X5555 ; <br />
 R5 = R0 + R2 (S) ; <br />
 <br />
// 16bit 实例; <br />
<br />
// 16bit ALU operation ; <br />
<br />
 R0.H = 0XFFFE ; <br />
 R0.L = 0XFF00 ; <br />
 R2.H = 0X1; <br />
 R2.L = 0X1; <br />
 R6 = R0 +|+ R2 ;&nbsp;&nbsp;// 没有进位产生,对位相加,对应存储; <br />
 <br />
 R0.H = 0X7FFF ; <br />
 R6 = R0 +|+ R2 ; // 有进位产生,不带饱和操作; <br />
 <br />
 R6 = R0 +|+ R0 ( S) ;&nbsp;&nbsp;// 带饱和操作 ; <br />
 R7 = R0 -|+ R2 ; <br />
 <br />
//&nbsp;&nbsp;16bit 双ALU操作 ; <br />
<br />
 R0.H = 0XFFFF; <br />
 R0.L = 0XFF00; <br />
 R2.H = 0X1; <br />
 R2.L = 0X1 ; <br />
 R6 = R0 +|- R2 , R7 = R0 -|+ R2 ; <br />
 R6 = R0 +|+ R2 ,R7 = R0 -|- R2 ; <br />
 <br />
// 32bit 双ALU 操作; <br />
<br />
 R0.H = 0X7FFF; <br />
 R0.L = 0XFFFF; <br />
 R2.H = 0; <br />
 R2.L = 1; <br />
 R6 = R0 + R2 , R5 = R0 - R2 ; <br />
 R0.H = 0X7FFF ; <br />
 R4.H = 0X8000 ; <br />
 R4.L = 0 ; <br />
 R6 = R4 + R2, R5 = R4 - R2 ( S ) ; <br />
<br />
// 带有选项(co)的操作 ; <br />
<br />
 R0.H = 0XFFFF ; <br />
 R0.L = 0XFF00 ; <br />
 R2.H = 1 ; <br />
 R2.L = 1 ; <br />
 R6 = R0 +|- R2,R7 = R0 -|+ R2 (CO) ; <br />
 // 计算的结果进行交叉再存储;<br />
 R6 = R0+|-R2 ,R7 = R0-|+R2(S);<br />
 <br />
// 预增比例的加法 ; <br />
 R6.H = R0 + R7 ( RND12 ) ; <br />
 l, <br />
// 预减比例的加法 ; <br />
 R6.H = R0 + R7 (RND20 ) ;&nbsp;&nbsp;<br />
 <br />
// 绝对值指令 ; <br />
 R1 = ABS R6 ; <br />
 <br />
//最大最小指令; <br />
 R4 = MAX ( R6, R7 ) ; <br />
 R3 = MIN ( R6, R7 ) ; <br />
 <br />
// 逻辑指令; <br />
 R4 = R4 &amp; R3 ; <br />
 R4 = R4 | R3 ; <br />
 R4 = ~ R4 ; <br />
 R4 = R4 ^ R3 ; <br />
 <br />
// 位方式异或指令 ; <br />
 A0 = R6 ; <br />
 A1 = R2 ; <br />
 R4.L = CC = BXORSHIFT ( A0 , R1 ) ; <br />
 R7.L = CC = BXOR ( A0, R1 ) ; <br />
 A0 = BXORSHIFT (A0, A1, CC ) ; <br />
 R5.L = CC = BXOR (A0, A1, CC ) ; <br />
 <br />
// 指数检测指令; <br />
 R1.H = 0X0010 ; <br />
 R1.L = 0X0800 ; <br />
 R7.L = 7 ; <br />
 R2.L = EXPADJ ( R1, R7.L ) ; <br />
 R2.L = EXPADJ ( R1, R7.L ) (V) ; // 带有选项的指令; <br />
 <br />
//符号位指令; <br />
 R0.L = SIGNBITS R3 ;&nbsp;&nbsp;// 求R3 符号位数; <br />
 R3.L = 0XE711 ; <br />
 R0.L = SIGNBITS R3.L ; <br />
 <br />
// 简单除法指令; <br />
<br />
// 计算两个带符号的整数的商 ; <br />
 P0 = 15 ;&nbsp;&nbsp;// 计算商到16bit ; <br />
 R0 = -130 ;&nbsp;&nbsp;<br />
 R1 = 5 ; <br />
 R0 &lt;&lt;= 1 ; <br />
 DIVS ( R0 , R1 ) ; <br />
 LOOP .DIV_PRIM LC0 = P0 ; <br />
 LOOP_BEGIN .DIV_PRIM ; <br />
 DIVQ (R0, R1 ) ; <br />
 LOOP_END .DIV_PRIM ; <br />
 R0 = R0.L (X) ; <br />
 <br />
 NOP ; <br />
 <br />
<br />
_main.end :
vfdff(作者)
2008-11-16 21:47
13
注册码:<br />
visualDSP5.0<br />
TST-178-346-6228484-85<br />
<br />
visualDSP4.5<br />
ADI-152-256-169871876-2653<br />
KIT-168-256-854540-76<br />
TST-178-511-17041924-85<br />
<br />
visualDSP3.5<br />
ADI-147-256-26412292-464(tIGERSHARCK)<br />
TST-171-346-6226692-85
游客请输入验证码
浏览1940621次