dsp擦除死机

dsp擦除死机,第1张

DSP和FPGA不一样,在DSP上运行的程序可能会会出现死机,也就是跑飞的情况,查死机基本是每个DSP或嵌入式工程师debug时都会经历过的。DSP死机可能是硬件造成的也可能是软件造成。

先说一下硬件造成的可能原因,遇到过的就一下4类,

1、复位电路不稳定;2.电源不稳定;3、时钟不稳;4、总线不稳定。下面分别讲解一下。

1、复位电路不稳定

很好理解,就是运行中突然有复位信号过来,这时DSP复位自然就DSP程序跑飞了或者程序重新跑一遍的情况。如果是在线硬件仿真基本就是跑飞或死机(程序不跑了)。

出现复位不稳定的情况我遇到了两种情况:

第一种情况是复位电路设计时,复位的时间不够,即低电平保持的时间不够,这样上电加载时,有时能够正常加载,有时不行,有时加载运行一段时间就死机了。

第二种情况是复位电路加有watchdog电路,watchdog不光监测喂狗(WDI)信号,而且还监测DSP工作电压值,如果小于某个电压范围就产生复位信号。一般在常温的时候,不会出现工作电压值的变化,而当DSP工作环境的温度发生变化时,就可能出现频繁复位的情况。

2、电源不稳定

电源不稳定主要是内核电源不稳定的情况,在一块电路板上可能同时有DSP、FPGA等芯片,可能内核电压相同,而采用同一路电源供电,而在DSP芯片有大负荷工作量时,造成工作电路继续增大, 从而拉低内核电压,造成瞬时电压不足,从而可能造成DSP程序跑飞,而这种情况对于FPGA基本没有影响。

复位电路不正常的第二种情况也可以认为是电源不稳定的情况。

3、时钟不稳

时钟不稳造成DSP、ARM死机的情况遇到比较多,下面举几个例子。

时钟信号幅度较小能量较弱,在常温工作时正常,长时间工作也没有问题,而在低温时(-40度),这时时钟信号可能会已经弱到不能持续的给DSP工作,从而DSP死机,被watchdog复位的情况。但是FPGA对于时钟基本不受影响,时钟有了继续工作。这种情况的解决办法是增加时钟的幅度,增加比较器将时钟幅度变大等办法解决。

DSP通过FPGA的锁相环(PLL)生成时钟(这样频率比较灵活)工作,但FPGA输出时钟的引脚不是专用时钟引脚时,可能在某些情况下会造成时钟不稳,从而造成DSP死机或跑飞。解决办法:更换FPGA上的其他时钟管脚输出时钟。

可能是堆栈溢出、数组溢出、访问指向空地址的指针未声明的函数调用跑飞等原因。

1、堆栈溢出:以TI CCS3.3为例,程序运行的堆与栈的空间大小都是由软件设计师自己定义分配大小的。一般出现问题就是为DSP软件运行设置的堆或栈的空间太小,而导致程序不能正常运行。堆或栈空间太小编译生成out文件时,是不会报错的。TI ccs3.3中Stack Size是0x400(即默认的配置),Heap Size是0x200(即默认配置)。如果程序出现莫名的跑飞情况可以试试改改这两个参数值。

2、数组溢出:数组溢出就是定义数组的空间大小,而通过数组下表访问时,下标超过了数组的边界,这样可能改写其他地址的数据,造成程序跑飞。有可能是使用未初始化的变量作为下标方位数组(这种情况编译器通常会有warning提示);还有可能是通过计算关系计算下标,而在异常的情况下下标会越界(应用下标前对下标的范围进行判定,正常后再使用)。

3、访问指向空地址的指针:访问未初始化的空指针也可能出现DSP跑飞的情况;或者将指针作为函数参数传递时,指针未指向具体的地址,而在函数中使用,可能出现死机的情况(也可能不会,在ccs3.3下)。这些“指针未初始化”或“指针未指向具体变量”的问题编译器不会提示错误,最多提示警告。而“指针未指向具体变量”作为函数参数传递,在VC2005中,编译时不会报错,但有警告,但是在debug状态下运行时直接就跑死了,也算是暴露问题了。

4、未声明的函数调用跑飞:在TI ccs3.3中一些函数没有显式声明,而直接调用可能达不到函数预期的效果或者就是跑飞。以前写过一个CCS环境下因printf函数跑飞的问题。其实未声明函数调用,在zynq的开发平台vivado的SDK中也出现过,编译不报错,运行就是达不到预期的效果。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11974048.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存