打印

在DSP上遇到奇怪的程序跑飞问题,请高手赐教!

[复制链接]
8057|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JohnYork|  楼主 | 2012-9-7 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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的片上内存对编译优化后的代码有使用限制?
我对这些问题百思不得其解,恳请高手赐教!

相关帖子

沙发
JohnYork|  楼主 | 2012-9-7 23:00 | 只看该作者
另外用示波器量了板子上C6416T的内核输入电压,约1.2V±3mV左右;
又用示波器量了ECLKIN的60MHz输入时钟,发现时钟波形是近似于三角波的一个波形,而不是手册上要求的方波信号。对此硬件设计师的解释是:示波器的探头可探测的频率范围有限,因此看不到方波信号。我的疑问是:既然受频率范围限制,那么得到的
信号波形也应该是接近正弦波的形式啊?为何是三角波的形式呢?
在此请教高手:
4.硬件设计师的解释是否合理?
5.非方波的输入信号是否会影响DSP的工作?
谢谢!

使用特权

评论回复
板凳
JohnYork|  楼主 | 2012-9-16 20:15 | 只看该作者
没人能回答吗?
好吧,说下自己的调试进展然后结贴吧。
貌似这回是遇到极品代码了,有部分C代码编译之后的汇编代码比较可疑,屏蔽之后就再也没有跑飞过了。C代码的原型是这样的:
if(workptr->specialwork_enable == true
&& specialworkfunction(workptr,intinput,doubleinput,doubleinput2,&doubleval1,&doubleval2) == true) {
    //do something....
}
编译器优化之后的编译结果汇编代码是:
          LDB *+A0[123],B0
      [!B0] B    PC+1306
               LDDW *+SP[8],A7:A6
               LDDW *+SP[0x10],A9:A8
      [ B0] B    PC+36508                         ;specialworkfunction的入口地址
  ||         LDW *+SP[4],B5
; .... some more assembler codes....
似乎第一个条件跳转后跟着两个读取64位浮点数的指令不太正常,将“workptr->specialwork_enable == true”的条件判断移动至specialworkfunction中之后,编译出的结果不再出现上面的汇编结果,程序也不再跑飞了。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
biechedan + 2 很给力!
地板
happybird21| | 2012-9-16 21:09 | 只看该作者
说的有点太复杂了,没搞懂

使用特权

评论回复
5
id_dingjia| | 2013-4-15 21:42 | 只看该作者
厉害、、、、、、、、、、、、、、、、、、、、、、、、、、、、

使用特权

评论回复
6
biechedan| | 2013-4-17 19:12 | 只看该作者
楼主自己解决了的,牛!

使用特权

评论回复
7
shenmu2012| | 2013-4-23 17:24 | 只看该作者
我来围观的,顺道来学习哈

使用特权

评论回复
8
mmbs| | 2013-4-25 01:25 | 只看该作者
学习

使用特权

评论回复
9
firstblood| | 2013-4-25 09:56 | 只看该作者
DSP是TI的C6416T,主频设置为720MHz,只用了片上RAM,程序使用了CCSv3.3的DSP/BIOS v5.31.02,主要使用它提供的硬件中断分派和软件中断调度,以及周期触发事件,没有使用TSK等其他模块,使用了一个外部中断INT6,以及EDMA操作完成中断,由于程序较大,编译时使用了o1级别的优化编译选项,但1M bytes的L2 SRAM仍然只剩下约85K bytes的空余空间。

使用特权

评论回复
10
caoyunfei2012| | 2016-5-28 14:02 | 只看该作者
楼主你好,我在调试DSP28027电机控制时遇到了相同的问题:
if((pUserParams->motor_Rr > (float_t)0.0) && (pUserParams->motor_Rs > (float_t)0.0))
    {
      pUserParams->powerWarpGain = sqrt((float_t)1.0 + pUserParams->motor_Rr/pUserParams->motor_Rs);
    }
  else
    {
      pUserParams->powerWarpGain = USER_POWERWARP_GAIN;
    }
在if里面会直接跑飞,能麻烦您帮我分析下原理么?是不是编译环境不兼容的问题,我用的是CCS5.5,列程是TI的自带的Mororwave程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

0

粉丝