程序跑飞,就是程序跑得跟设计想法完全不一样,而且单片机此时对于各种外接的设备(按键、显示屏、LED灯等等),还有之前程序中设置的外中断,计时器,串口中断等等本来应有的反应也彻底没有了,单片机进入了一个不可控的死机状态。比方说我现在写的程序,主程序正常的,但是一旦按了0号外中断,LCD1602显示屏上就出现了一串乱码,然后本来应该过一会儿中断程序完成退回主程序,恢复正常显示,结果等了几倍的相应时间也没反应,肯定是彻底死机了,对于这个我的老师就认定为程序跑飞了,不过跑飞其实是我们认定的,单片机不认为自己跑飞了,只要不是外部强电磁干扰引起的跑飞(工控现场的恶劣使用环境引起的),那么人家单片机可是按照我们写给它的程序兢兢业业地执行着呢,只是我们自己写错程序了,要是LZ也是正在学单片机,我们一起探讨下吧?另外,求采纳啊~~~ ^-^ 我也在百度上提了个问题,也是单片机的,一起探讨吧~
问题二:程序跑飞一般是什么原因造成的 我是在DM642上做jpeg2000编解码的,先是调通了板子的VIVO,然后再把代码移植进去,编译通过,就是下载进去后跑不起来我的配置基本上都是在BOIS里面做的,cmd文件里面没写什么东西,能不能帮忙分析下大概是哪些原因导致程序跑步起来啊?谢了!
忽略一切硬件因素,例如是电压不稳或者外部干扰等等问题。因为我这程序用keil软件仿真的时候PC指针都会都飞开,所以应该不关硬件的事。光从软件上看,怎么样的原因会使单片机跑飞呢?程序是用C写的,编译时keil没有报错,也没有warning。ram用了218B,flash用了16kB。
用的芯片是SM5964,ram大小是256+768,flash是64k。按理来说都没超标,求大神解围!
问题三:什么是跑飞? 程序(常见于单片机,DSP中)因编写问题没有按照作者意思运行而进入死循环或者毫无意义地乱运行.
问题四:51单片机程序跑飞什么意思?怎么解决? 程序跑飞就是程序执行错误,程序不知道运行到哪里,这就需要设定标志位,寻找跑飞的地方,再改
问题五:程序跑飞一般是什么原因造成的 原因很多啊
1)程序没有结尾或不是循环的程序。
2)nmi管脚没有上拉。
3)在看门狗动作的时候程序会经常跑飞。
4)程序编制不当也会引起程序跑飞。
5)硬件系统有问题。
问题六:程序跑飞一般是什么原因造成的 原因很多啊
1)程序没有结尾或不是循环的程序。
2)nmi管脚没有上拉。3)在看门狗动作的时候程序会经常跑飞。
4)程序编制不当也会引起程序跑飞。
5)硬件系统有问题。
问题七:c语言程序跑飞的原因有哪些?指针? 跑飞指的是程序指针混乱,堆栈被破坏,跑飞算是程序运行问题中较严重的一类,对指针未初始化或未指向值就解引用常会引起跑飞
如: struct AA
{
int i
char j
} *p
如未p = (AA *)malloc(sizeof(struct AA))等之类进行初始化就 使用p->i,j等就会使得程序跑飞
问题八:程序跑飞是怎么回事? 10分 看看这两个吧,或许对你有用
baike.soso/v4640480
h触tp:/...15547/
问题九:单片机程序跑飞 一种可能是硬件上抗干扰设计有缺陷。
另一种可能是软件处理有问题,需要提供软件才能具体分析问题所在。
跑飞指的是程序指针混乱,堆栈被破坏,跑飞算是程序运行问题中较严重的一类,对指针未初始化或未指向值就解引用常会引起跑飞如: struct AA
{
int i
char j
} *p
如未p = (AA *)malloc(sizeof(struct AA))等之类进行初始化就 使用p->i,j等就会使得程序跑飞
程序主逻辑无法执行,但是各个中断服务程序能够正常运行。解决方法:
1)在中断程序中点灯或者打印,判断中断程序是否能够正常运行;
2)keil的debug模式在线调试运行,即可知道程序卡死位置。
3)在2)无法满足时,在程序主逻辑中打印或者点灯,多次编译烧录,判断卡死位置。
2、程序卡死在中断中,中断程序中没有清除中断标志位,或者中断服务程序的触发频率太高,中断没有执行完毕又触发了中断标志位,单片机在循环执行中断服务程序。
例如在高频率的中断服务程序中增加printf打印信息容易造成该现象。
现象:程序主逻辑无法执行,部分中断程序也无法执行。
解决方法:
1)在问题发生时,调整没有执行的中断程序的优先级为最高优先级,例如SysTick中断优先级、TIMER有限级等,在该对应中断服务程序中点灯或者低频定时打印,观察是否执行。
2)如果执行,则说明肯定卡死在中断中,仔细检查所有的中断程序。仍无法判断问题点,则逐步降低调整优先级的中断服务程序,直到其不被执行,确定问题程序优先级,缩小范围,再找问题。
3、程序进入HardFault,HardFault本身也是一个中断,只不过其中断优先级为-1,高于一切用户可设置中断。
产生原因(常见的均为地址类问题):
1)访问了单片机无法到达的地址;
2)访问地址不对齐,尤其是在*(int *) *(float *)等多字节强制取值时容易出现,检测强制取值的地址是否为四字节对齐。
3)PC指针跑飞,该现象在我多年经验中只遇到过一次,是在强干扰情况下,芯片PC指针突然变为非常异常值,芯片直接进入HardFault。该情况实际很少遇到,通常情况下芯片不会无缘无故跑飞,多数都为自身程序问题。
解决办法(出现问题后只能断电重启,但可以找出造成问题的点):
1)代码中增加HardFault中断服务程序,在中断向量表中可以找函数名称。
2)服务程序中增加特殊的点灯提示即可。后期任何进入HardFault的问题都能一目了然。
3)HardFault中断服务程序中可以保存芯片信息到Flash中,以便重新上电时检查问题点,保存的信息主要是进入HardFault前的PC指针,通过在该PC指针在.map文件中查找对应区间的函数,即可确认是什么函数造成了HardFault。该 *** 作的详细步骤自行百度。
4、芯片不停的高频重启(此处不讨论硬件造成的问题),不是所有的地址异常等都会进入HardFault,有些是造成芯片重启。
现象:
1)看上去芯片主程序、中断程序、HardFault 什么都不执行了。
解决方法:
1)在main()函数的最开始(注意要先配置外设),增加点灯和延时处理,或打印。观察上电后是否有输出。并且反复输出,或者灯闪烁。
2)逐步调整点灯位置,确认造成死机点。
3)在程序执行到main之前,是先执行芯片的RESET中断服务程序,这之间会初始化中断向量表,初始化堆栈等,在.s文件中有相应的汇编代码。如果死在main之前,可尝试在RESET中断服务程序中直接 *** 作寄存器,配置时钟和GPIO外设,控制点灯,观察是否能够点亮,以确认问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)