DSP是TI的C6416T,主频设置为720MHz,只用了片上RAM,程序使用了CCSv3.3的DSP/BIOS v5.31.02,主要使用它提供的硬件中断分派和软件中断调度,以及周期触发事件,没有使用TSK等其他模块,使用了一个外部中断INT6,以及EDMA操作完成中断,由于程序较大,编译时使用了o1级别的优化编译选项,但1M bytes的L2 SRAM仍然只剩下约85K bytes的空余空间。
程序执行后约3~7分钟即跑飞,且跑飞前执行的代码位置固定,但软件排查未发现有内存溢出、访问越界的情况,也未发现有代码被错误更改的情况,并且未发现有比跑飞时的软件中断优先级高的软件或硬件中断执行;跑飞后PC指针指向中断向量表中未开放使用的INT7或INT15中断向量,由于DSP/BIOS对未使用的中断在中断向量表中设置了死循环代码,因而造成程序无**常执行。
将代码段和数据段的位置交换后,发现另一个异常:一个定义时赋初值的全局变量(例如:int test_a_value = 0;),在初始化完成后进入main函数执行时,发现其值并不是预想的初值0,而是0x0C0FFEE0,经过跟踪汇编代码后发现在执行DSP/BIOS的初始化程序GBL_init时会初始化STACK,而在初始化STACK的某个位置时,这个全局变量的值被同时改变为0x0C0FFEE0了,而此时写指针并未指向该全局变量。
另外,这些问题均是在编译后加了o1优化之后产生的,在之前程序还没这么大时,未使用任何编译优化,占用的空间比现在还大(仅剩余约30KBytes空间),也未出现这些奇怪的问题。
问题:
1.为什么在RAM中程序正常的情况下会触发未开放的中断?
2.为什么在执行初始化STACK时,另外地址的内存空间也会被改变?
3.是否DSP的片上内存对编译优化后的代码有使用限制?
我对这些问题百思不得其解,恳请高手赐教! |