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.

2812数组溢出或者程序代码量过大,如何修改CMD文件?



在用例程pmsm3_3验证旋变解码功能的时候,发现只要把旋变解算功能加进去之后,

程序就会跳到非法中断ILLEGAL_ISR(void)  // ILLegal operation TRAP,网上查询相关问题有说数组溢出或者程序代码量过大会导致相关问题,查看RESOLVER.H 文件是定义了几个数组,做滤波用的,会是这个原因导致的么?如果是我想修改CMD文件该修改哪部分呢?

附上我用的CMD配置F2812_EzDSP_RAM_lnk.cmd:

  • 如果是定义的数组溢出,应该修改.ebss对应的DRAMH0的空间长度,但是要确保不和其他块冲突

  • 但我认为如果是全局变量或是代码过大,程序编译就过不去了。假如是溢出的问题,那最有可能的也是堆栈溢出,也即使局部变量的溢出。

    如果是这种情况,可以增大堆栈的大小,在工程属性》Build>c2000 linker > basic options中将堆栈设大。

    另外看一下程序是否跑飞了。

    Eric

  • 你好,我的编译是可以过去的。按照你说的我把堆栈从0x0400放大到0x0480,修改了cmd对应部分的长度为0x0480,运行仍然会跳到非法中断。如果堆栈相应再放大,比如0x0500之上,编译出错,显示堆栈重叠:RAMM1 memory range overlaps existing memory range DEV_EMU。是因为堆栈长度0x0480不够,需要继续加大吗?如果继续加大,那编译出错显示的与 DEV_EMU堆栈重叠问题应该在那个cmd模块修改呢?好像没看到cmd里定义DEV_EMU的部分,还是这部分是固化在片子里的?

  • 我修改了DRAMH0的空间长度,从0x0B00到0x2B00,编译通过,但运行仍然会显示进入非法中断,好像不是定义的数组溢出问题。

  • 我在DSP281x_Headers_nonBIOS.cmd中找到DEV_EMU的地址设置了,然后把.stack的堆栈长度从0x0400扩大到0x0600,然后再把DSP281x_Headers_nonBIOS.cmd中涉及到会重叠的部分DEV_EMU、PIE_VECT、FLASH_REGS、CSM、XINTF、CPU_TIMER0、PIE_CTRL都分别向后扩展了0x0200的地址,编译之后可以通过,可是这次再把旋变算法的程序从屏蔽变成放开之后,系统的TIUFINT主中断干脆就不进去了。是因为我改地址的时候把TIUFINT中断入口地址改变了导致的这个问题么?求解答

  • 问题解决了,原来我在写配置的时候,调用算法的一个变量写错了,导致跳到了错误地址,然后进了非法中断。检查不够细心……