打印

离题**!要是考试,0分

[复制链接]
楼主: wangkj
手机看帖
扫描二维码
随时随地手机跟帖
41
awey| | 2008-4-15 22:38 | 只看该作者 回帖奖励 |倒序浏览

对程序受干扰而“跑飞”该怎么定义?

 wxj1952 对“跑飞”的定义,就是只要指令系统是“单字节指令”的MCU程序都不会跑飞。
我所认为的程序跑飞就是PC指针没有按照预定的程序变更,可能PC指针指向一个不确定的或者根本就没有存放用户代码的程序存贮空间里运行。

对于“程序跑飞”,不知道有没有一个官方的正式的定义?

使用特权

评论回复
42
john_light| | 2008-4-16 08:41 | 只看该作者

讨论和主题无关的话题了

在我看来,只要程序不按正确的序列执行,它就是跑飞。而不是看它还能不能执行下去(死不死循环不能作为评判的标准)。

使用特权

评论回复
43
xwj| | 2008-4-16 09:20 | 只看该作者

不只“PC值乱”会“跑飞”,存储器、标志乱了也一样会“跑

电脑死机、报程序错误等都是“跑飞”,
只不过报错的是被错误检测抓住的,蓝屏的也是被抓住的
没报错就黑屏死了的是没被抓住的

看看电脑的各种死机情况,我们可以看到:程序和硬件错误造成内存错最终死机的情形是占绝大多数的。
而PC值错误造成死机的可能性四非常小的,这是个明显的概率问题

放在单片机上也是一样的。

使用特权

评论回复
44
dld2| | 2008-4-16 09:33 | 只看该作者

本来是俗话,应该没有官方定义

但一般死机和跑飞不太一样。

比如while循环,退出条件永远无法满足,这算死机,但没有跑飞。当然这里的死循环不是指程序或任务中的主循环。
死机是指对外部事件无法正常响应。还分半死和死翘翘两种情况。

跑飞一般是对PC而言,比如RET、RETI、JMP等要修改PC,但却给了一个错误的值。跑飞往往是堆栈异常。
硬干扰造成的寄存器或存储器错误,也可以算跑飞。
跑飞的定义同意43楼:“只要程序不按正确的序列执行,它就是跑飞。而不是看它还能不能执行下去(死不死循环不能作为评判的标准)。”
跑飞后还可能回到正确的轨道的,不一定死机。

使用特权

评论回复
45
xwj| | 2008-4-16 09:43 | 只看该作者

只要程序不能俺正常要求运行,就是“死机”

比如某个程序功能散失、或者对通讯、操作没响应,我们都会说它“死机了”


硬件寄存器:中断开关、重载值等的异常变动或错误操作,或者错误的查询等待写法,这些是很多程序软件“死机”的常见原因
--这个可以从软件上做一定的补救和增强鲁棒性设计

而器件过热、超额使用、受电源干扰电磁干扰等造成的寄存器、RAM数据的异常变动、丢失,可以说是硬件不正常时最常见的“死机”原因
--这个就只能从硬件上去找根本原因,从源头解决了,软件是没办法修复的,只能做更多检测,以尽量避免程序在异常条件下运行

总之,“死机”的原因和现象太多太多了,这是个系统的问题,而不单单只是PC值改变,只有“异常程序轨道”上的死循环才是“死机”

使用特权

评论回复
46
木头东瓜| | 2008-4-16 09:47 | 只看该作者

好不厉害

你说的那种义隆的片子叫什么??

使用特权

评论回复
47
computer00| | 2008-4-16 10:07 | 只看该作者

设计不好的程序,故意用错误的操作也能导致程序跑飞

例如常见的缓冲区溢出错误,可以人为的让它飞起来~~~~

使用特权

评论回复
48
wangkj|  楼主 | 2008-4-16 10:15 | 只看该作者

离题**!要是考试,0分

使用特权

评论回复
49
xwj| | 2008-4-16 10:53 | 只看该作者

呵呵,LS真是笨,因为跑飞了啊...

要不,
你去查查干扰源吧...

使用特权

评论回复
50
dld2| | 2008-4-16 10:54 | 只看该作者

哈哈,说得妙

使用特权

评论回复
51
soso| | 2008-4-16 11:25 | 只看该作者

RE:

同意19楼的观点。

使用特权

评论回复
52
wxj1952| | 2008-4-16 11:58 | 只看该作者

个人观点:一位机与8位机/PC机不同。

“程序跑飞”。顾名思义,如果程序还在程序员设计的预定轨道上运行,它算不算“异常”?(尽管它已经由于PC值受干扰,在正常轨道上向前/向后跳跃了几下。)
   一位机的超级循环程序,PC值好像不能修改!它就是一个永远向前的计数器,更没有堆栈,中断,... 等等,所以无论程序跳到哪里开始运行,它最终会回到循环初始点(0000H)从头开始新一轮循环。以前的“事件”已经忘掉了。从头来了。
 wxj1952 对“跑飞”的定义,就是只要指令系统是“单字节指令”的MCU程序都不会跑飞。


“我所认为的程序跑飞就是PC指针没有按照预定的程序变更,可能PC指针指向一个不确定的或者根本就没有存放用户代码的程序存贮空间里运行。”

没错:可是一位机中,那些“根本就没有存放用户代码的程序存贮空间里”存放的都是空操作码。就像8051在那些没有存放用户代码的程序存贮空间里预先固化了020202H/020000H一样。是一种抗干扰基本措施——陷阱设置。也可算是预定轨道。

 

使用特权

评论回复
53
aijun02| | 2008-4-16 12:03 | 只看该作者

确实如此

使用特权

评论回复
54
server11| | 2008-4-16 12:04 | 只看该作者

努力学习中

使用特权

评论回复
55
john_light| | 2008-4-17 18:54 | 只看该作者

53楼的说法令人担忧

方向对就行了吗?

问题后都从0000重新来过问题就不存在了?

使用特权

评论回复
56
wxj1952| | 2008-4-17 19:11 | 只看该作者

相当于51看门狗复位以后的软件处理。

实际应用中没那么简单。

异常循环当然有事件记录表征的。程序员需要根据这些表征设计很多可能的逻辑“如果...如果...如果...”。

   一位机好在所有异常事件都是可以预测到的。它不需要看门狗之类,程序只有一条循环轨道(起始分支都没有),PC程序计数器必将回到0000H,正常运行轨道也是000—FFFh—000遍历。

   不像8位机多字节指令造成的不可预测异常轨道,程序员无法参考什么表征,只好用陷阱、看门狗之类于事件发生后的弥补措施。

使用特权

评论回复
57
fsaok| | 2008-4-17 21:09 | 只看该作者

辩论得很精彩

听课中,

使用特权

评论回复
58
dfgeoff| | 2008-4-17 21:37 | 只看该作者

这么看来,1位机没有JUMP之类了?

用8位机的概念来理解1位机的确有些不妥。1位机太简单了,反而不会有什么陷阱。就好像普通手机没病毒,而PC机大堆病毒似的。

使用特权

评论回复
59
远上寒山| | 2008-4-17 21:41 | 只看该作者

晚上也来顶一下

使用特权

评论回复
60
chunyang| | 2008-4-17 21:42 | 只看该作者

几天没来,怎么“跑飞”了?

    本帖中要是用了看门狗,那应该回到“其实,从制造成本来讲,51已经没有任何优势”的主程序上啊……

使用特权

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

本版积分规则