This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求助,程序跑飞



请教各位高手,我的程序现在出现一个怪问题,如果我设断点,然后让它运行的话,程序可以正常运行,但是如果我不设断点,直接运行的话,程序就会跑飞。而且我把不同的程序注掉,每次都会去到0x712144这个地方。

我现在怀疑是我的CMD文件设置有问题。我用的是6747这个片子,由于程序比较大,我在CMD里把.text分配到了外部的SDRAM。 

之前另一个程序也碰到跑飞的问题,我单步运行时,发现到了一个函数,我设定的局部变量被划分到了片内ROM的地址,这明显是一个错误的地址,然后程序就跑飞了,而且也是飞到了0x712144这个地方。后来我把这个函数里的变量都改成了全局变量,程序就可以正常运行了。我也不知道为什么这样就可以,是不是还是CMD文件的问题。这两个程序的CMD文件是相同的。

我的程序里用的数组比较多,还有三维数组,这对cmd文件了的stack size设置有没有要求?我设置的是0x1000。

期待您的帮助,谢谢!

  • 先把heap, stack size设大一点试试。

    如果还是不行,把cmd文件贴出来看看。

  • 感谢您的帮助。

    我把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

    }

  • 试试不要把段分配到下面的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,其实他们是同一块物理地址。 

  • DSPL2RAM2的访问速度跟其它没差别吧。 我今天发现我定义的static的数组被分配到SDRAM的地址。这种数组跟定义的非数组静态变量不属于同一块地址空间,它属于什么? 在用这个数组之前我要是加一点延迟,程序就可以正常运行。
  • 我的意思是 DSPL2RAM:   o=0x00800000    l = 0x00040000和DSPL2RAM2:    o=ox11800000   l = 0x00040000是同一块物理地址。

  • 你指的DSPL2RAM2访问速度和什么比较? 片外SDRAM?

  • Shine Zhang 说:

    你指的DSPL2RAM2访问速度和什么比较? 片外SDRAM?

    我指的是和DSPL2RAM的比较。我没注意到您说的它们是同一块物理地址。

    .far的分配有什么要求吗?我把.far分配到DSPL2RAM2或者DSPL2RAM时,程序运行都会出错,跑到别的错误的地址,放到SDRAM反而不会。

  • 我现在的情况是函数里用static定义的数组被归于.far,而.far是分配到SDRAM。如果我在代码里把该数组注掉的话,程序是不跑飞的,所以我不知道是因为外部SDRAM的访问速度低吗?

    但是如果我把.far分配到DSPL2RAM或者DSPL2RAM2,程序就会出现别的错误,会跑到别的错误地址。

    感谢您一直的帮助。

  • 问题解决了。

    这批片子最大频率只到375MHz,我的程序设计是到409.2MHz,超频了,所以总是跑飞。

    是不是有的片子可以超频使用?

  • 谢谢分享!

    所有DSP芯片都不建议超频使用的,特别是在量产阶段。

  • 你好,请问怎么设置频率的?