TI中文支持网
TI专业的中文技术问题搜集分享网站

求助,程序跑飞

请教各位高手,我的程序现在出现一个怪问题,如果我设断点,然后让它运行的话,程序可以正常运行,但是如果我不设断点,直接运行的话,程序就会跑飞。而且我把不同的程序注掉,每次都会去到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芯片都不建议超频使用的,特别是在量产阶段。

赞(0)
未经允许不得转载:TI中文支持网 » 求助,程序跑飞
分享到: 更多 (0)