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.

请问例程中函数DSP28x_usDelay和InitFlash()不能共用一个段(ramfuncs)嘛?

请问例程中函数DSP28x_usDelay和InitFlash()不能共用一个段(ramfuncs)嘛?

 

我把这个2个函数都加进工程,运行进入DSP28x_usDelay函数后,会进入非法中断,换句话说就是程序跑飞了,是不是函数DSP28x_usDelay和InitFlash()不能共用一个段(ramfuncs)啊?

请专家们指教~!不甚感激!

  • 好奇怪啊,~!!

    刚刚开始连接时,就进入非法中断。

    把DSP28x_usDelay去掉,,就不进入非法中断!!!

    但是呢,不断开连接的情况下,再加入又可以了,此时不进入非法中断了~@!

  • 你好。

    这两个函数是可以放在同一个Section里面的。请检查CMD文件和编译生成的Map文件。

    如果方便请把CMD文件和MAP文件附上。谢谢。

  • 附件为CMD文件和MAP文件,烦请帮忙看看,谢谢~~!!

    片子为28015~!!

    我好像找到问题所在了:

    函数MemCopy()处在DELAY_US()函数的后面,在调用DELAY_US()时,前面没有执行MemCopy(),不知道这是不是导致此问题的原因呢;

     

    cmdAndflash.zip
  • 你好。

    你找到的原因是对的。

    在你的MAP文件中:

    00008000   _InitFlash

    0000801b   _DSP28x_usDelay

    ramfuncs   0    003f4000    0000001f     RUN ADDR = 00008000
                      003f4000    0000001b     DSP280x_SysCtrl.obj (ramfuncs)
                      003f401b    00000004     DSP280x_usDelay.obj (ramfuncs)

    可以看到InitFalsh和usDelay的函数入口都在RAM中。但usDelay原始程序是放在Falsh中的003f401b处。所以,上电后需要先执行Memcopy,如果在这之前调用usDelay函数,CPU会从0000801b处去取指,那样就出现错误了。

  • 这才是正解~!

  • 补充一下:所有放在FLASH中但在后运行在RAM中的函数,都需要保证在做完memcopy之后才去执行这些函数,否则PC跳到RAM里执行这些函数时,因为RAM里的内容是乱的,因此相当于CPU跑分掉了。

  • 我也遇到了这样的问题,请问怎么样解决这个问题呢?难道要删除

    DSP2802x_usDelay.asm这段程序吗?谢谢!

  • 我试了下,把MemCopy函数单纯放在DSP28x_usDelay位置前面,解决不了问题,只有把这个语句删除了,才可以。请问在不删除DSP28x_usDelay程序的前提下

    怎么样做,调试程序才能不进入非法中断里去呢?万分感激!

  •  


          你好,我在调试过程中同样遇到了这个问题,请问您是如何解决  在不删除DSP28x_usDelay程序的前提下,调试程序才能不进入非法中断里去呢?   非常感谢!

  • 两种方法:

    1.把MemCopy放在main最前面,这样程序不会跑飞

    2.把DELAY_US(1000)改成这种for(i=0;i<5000;i++)