请教各位高手,我的程序现在出现一个怪问题,如果我设断点,然后让它运行的话,程序可以正常运行,但是如果我不设断点,直接运行的话,程序就会跑飞。而且我把不同的程序注掉,每次都会去到0x712144这个地方。
我现在怀疑是我的CMD文件设置有问题。我用的是6747这个片子,由于程序比较大,我在CMD里把.text分配到了外部的SDRAM。
之前另一个程序也碰到跑飞的问题,我单步运行时,发现到了一个函数,我设定的局部变量被划分到了片内ROM的地址,这明显是一个错误的地址,然后程序就跑飞了,而且也是飞到了0x712144这个地方。后来我把这个函数里的变量都改成了全局变量,程序就可以正常运行了。我也不知道为什么这样就可以,是不是还是CMD文件的问题。这两个程序的CMD文件是相同的。
我的程序里用的数组比较多,还有三维数组,这对cmd文件了的stack size设置有没有要求?我设置的是0x1000。
期待您的帮助,谢谢!
rp zhang:
回复 Shine:
感谢您的帮助。
我把stack设大解决了第二个问题,函数里的局部变量不会分配到错误的地址了,但是程序还是跑飞。
又出现了一个新的现象。我把程序都注释掉,然后一点点解开,看到哪里跑飞。当查到其中一段程序时,我在跑飞的程序中间加了几句串口输出的语句,然后突然跑飞的地方不再跑飞了,一直正常运行。不知道是不是我测试的时间不够长。
我还尝试一下另一块板子的程序,那块板子与我出问题的板子架构相同,都是DSP+FPGA的方式,只是接口地址有稍许不同。之前没问题的程序跑到这块板子上以后也会跑飞。按理说接口有差别,只会导致我功能实现不了,程序应该不会跑飞吧,(不知道我这样理解对不对),我在想硬件会不会有问题。
我把我的cmd文件列一下,麻烦您帮我看一下。其实SECTIONS部分的后面几项我都不知道是干嘛的。
-stack 0x00004000
-heap 0x00001000
MEMORY
{
VECS: o = 0x80000000 l = 0x00001000
DSPL2ROM: o = 0x00700000 l = 0x00100000
DSPL2RAM: o=0x00800000 l = 0x00040000
DSPL1PRAM: o=0x00E00000 l = 0x00008000
DSPL1DRAM: o=0x00F00000 l = 0x00008000
DSPL2RAM2: o=ox11800000 l = 0x00040000
DSPL1PRAM2: o = 0x11E00000 l = 0x00008000
DSPL1DRAM2: o = 0x11F00000 l = 0x00008000
SHAREDRAM: o = 0x80001000 l = 0x0001F000
SDRAM: o = 0xC0000000 l = 0x01000000
}
SECTIONS
{
".vectors" > VECS
.bss > DSPL2RAM
.cinit > DSPL2RAM
.cio > DSPL2RAM
.const > DSPL2RAM
.starck > DSPL1DRAM (以前用的是DSPL2RAM)
.sysmem > DSPL2RAM
.text > SDRAM
.switch > DSPL2RAM
.far > SDRAM
.calcbuffer > DSPL2RAM
.compxbuf > DSPL2RAM
.bufs > SHAREDRAM
.buffer > SDRAM
.buffertemp > SDRAM
.compxbuffer > SDRAM
}
Shine:
回复 rp zhang:
试试不要把段分配到下面的memory, 这块memory只能DSP访问,其他外设不能访问。
DSPL2ROM: o = 0x00700000 l = 0x00100000
DSPL2RAM: o=0x00800000 l = 0x00040000
DSPL1PRAM: o=0x00E00000 l = 0x00008000
DSPL1DRAM: o=0x00F00000 l = 0x00008000用DSPL2RAM2: o=ox11800000 l = 0x00040000这种都可以访问的memory,其实他们是同一块物理地址。
rp zhang:
回复 Shine:
DSPL2RAM2的访问速度跟其它没差别吧。
我今天发现我定义的static的数组被分配到SDRAM的地址。这种数组跟定义的非数组静态变量不属于同一块地址空间,它属于什么?
在用这个数组之前我要是加一点延迟,程序就可以正常运行。
Shine:
回复 rp zhang:
我的意思是 DSPL2RAM: o=0x00800000 l = 0x00040000和DSPL2RAM2: o=ox11800000 l = 0x00040000是同一块物理地址。
Shine:
回复 Shine:
你指的DSPL2RAM2访问速度和什么比较? 片外SDRAM?
rp zhang:
回复 Shine:
Shine Zhang
你指的DSPL2RAM2访问速度和什么比较? 片外SDRAM?
rp zhang:
回复 rp zhang:
我现在的情况是函数里用static定义的数组被归于.far,而.far是分配到SDRAM。如果我在代码里把该数组注掉的话,程序是不跑飞的,所以我不知道是因为外部SDRAM的访问速度低吗?
但是如果我把.far分配到DSPL2RAM或者DSPL2RAM2,程序就会出现别的错误,会跑到别的错误地址。
感谢您一直的帮助。
rp zhang:
回复 Shine:
问题解决了。
这批片子最大频率只到375MHz,我的程序设计是到409.2MHz,超频了,所以总是跑飞。
是不是有的片子可以超频使用?
Shine:
回复 rp zhang:
谢谢分享!
所有DSP芯片都不建议超频使用的,特别是在量产阶段。