程序跑飞,就是程序跑得跟设计想法完全不一样,而且单片机此时对于各种外接的设备(按键、显示屏、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/
问题九:单片机程序跑飞 一种可能是硬件上抗干扰设计有缺陷。
另一种可能是软件处理有问题,需要提供软件才能具体分析问题所在。
1. 设置堆栈空间大小在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。一般默认的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。
这也是为什么一个基础的工程编译后,RAM的空间也占用了1.6K左右的原因,因为堆栈的空间均分配在RAM中,可在编译的map文件中查看RAM资源占用的情况。
若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。
当工程中使用了malloc动态分配内存空间时,这时分配的空间就为堆的空间。所以若默认的堆空间大小不满足工程需求时,就需要手动调整堆空间的大小。
1. 直接在启动文件中修改堆栈空间的大小,如图1所示的位置;
2. 打开启动文件,点击下方Configuration Wizard,可在Option的设置框中设置堆栈空间的大小。
2. 相关理论补充
bss段:
bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
bss是英文Block Started by Symbol的简称。
bss段属于静态内存分配。
data段:
数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
数据段属于静态内存分配。
text段:
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):
堆是用于存放进程运行中被动态分配的内存段,它的大
不是跑飞的问题,其实是选择语句上的问题,回答者: 碱杯已经看出来了,他只是没指明掉if(CGQ==0)
{
delay(100)
if(!CGQ) //注意这个分号,这里的意思是CGQ=0时候,空 *** 作次,继续执行后面的
{
alarm_silencer() //该指令不管CGQ为何值,都会被执行
}
}
delay(1000)
}
另外,CGQ值对alarm_silencer()影响的逻辑关系有点乱,所以我没看alarm_silencer(),但发现了以下问题,希望对你有帮助
1.中断服务不用判断,或加延迟判断,已经下降沿触发了,进入中断的时候INTF就已经是0了;
2.延迟
void delay(uint x) //#define uint unsigned int定义过,最大可以到65355,原来的int知道32677
{
uint y
for(xx>0x--) //注意这里是没有分号的,加分号时间上就错了
for(y=10000y>0y--)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)