干货分享:DSP程序跑飞的原因?你是如何解决的?
定;3.地线不稳定。
软件:1.不小心操作到了子函数返回地址值。
2.数值溢出,读写了超过范围的存储空间,堆栈溢出等 。
我的程序是带有BIOS的程序,当程序跑飞后我就在主函数的最后一行设置断点,结果程序可以跑到主函数的最后一行,接下来就是初始化BIOS操作系统了,操作系统的源代码又是不可见的,所以一时陷入了僵局。不知道该怎么办好。
我是在移植程序的时候跑飞的,后来我就拿我的程序的BIOS配置和另一个正常的BIOS配置比较,结果发现Stack Size是0x400(即默认的配置),而另一个是0x1000,然后我改过来之后程序恢复正常。
一开始的时候我也意识到可能是堆栈溢出造成的程序跑飞,所以我就增大了每块存储器上的动态堆栈,即:create a heap in this memory heap size:0x08000 。结果不管用。
后来才修改的Stack Size (MAUs)选项,即全局的堆栈大小,从0x400改到0x1000.然后问题排除。后来才明白,动态堆栈是用来动态的创建任务用的,并非是我想要的那个堆栈。经过反思感觉还是对BIOS系统不熟悉造成的大错!
wjw1989:
朋友也有一些分享,这里总结如下:
我所知道的DSP程序跑飞的原因有:
硬件:1.复位电路不稳定;2.电源不稳定;3.地线不稳定。
软件:1.不小心操作到了子函数返回地址值。
2.数值溢出,读写了超过范围的存储空间,堆栈溢出等 。
我的程序是带有BIOS的程序,当程序跑飞后我就在主函数的最后一行设置断点,结果程序可以跑到主函数的最后一行,接下来就是初始化BIOS操作系统了,操作系统的源代码又是不可见的,所以一时陷入了僵局。不知道该怎么办好。
我是在移植程序的时候跑飞的,后来我就拿我的程序的BIOS配置和另一个正常的BIOS配置比较,结果发现Stack Size是0x400(即默认的配置),而另一个是0x1000,然后我改过来之后程序恢复正常。
一开始的时候我也意识到可能是堆栈溢出造成的程序跑飞,所以我就增大了每块存储器上的动态堆栈,即:create a heap in this memory heap size:0x08000 。结果不管用。
后来才修改的Stack Size (MAUs)选项,即全局的堆栈大小,从0x400改到0x1000.然后问题排除。后来才明白,动态堆栈是用来动态的创建任务用的,并非是我想要的那个堆栈。经过反思感觉还是对BIOS系统不熟悉造成的大错!
我个人觉得,关于硬件,问题无非就是一个:电源。
电源不稳,芯片工作肯定不正常。不正常会出现什么问题呢?
(1)芯片不工作。哈哈。这是我这次却发现,当IO输出短路,会造成芯片不工作,现象是:芯片io电平不死3.3v,而是1.768v
(2)芯片不断复位,这个问题不说了,如同芯片不断上电断电。
- 电子工程师不得不知的十大设计诫条(10-26)
- 遭遇设计“阴谋”,单片机(MCU)输出都跑哪去了?(07-29)
- 电子工程师们都在用哪些APP?(10-18)
- 电子工程师常犯的20个错误,你搞错哪些?(05-14)
- 电子工程师必备10大免费DIY工具(五):DesignSpark PCB、gplEDA(06-07)
- 电子工程师必备10大免费DIY工具(六):DraftSight、eDrawings(06-14)