打印

(keil手册上)所谓的“提高容错能力”的iret语句有用么??

[复制链接]
4622|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2009-12-7 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xlsbz 于 2009-12-8 08:32 编辑

在网上下载了个《KEIL C51使用详解》里面有一段



第八节 Keil C51函数

C51
函数声明对ANSI C作了扩展,具体包括:

1. 中断函数声明:
中断声明方法如下:
void serial_ISR () interrupt 4 [using 1]
{
/* ISR */
}
为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。
/* define not used interrupt, so generate "IRET" in their entrance */
void extern0_ISR() interrupt 0{}
/* not used */

void timer0_ISR () interrupt 1{}
/* not used */

void extern1_ISR() interrupt 2{}
/* not used */

void timer1_ISR () interrupt 3{}

/* not used */

void serial_ISR () interrupt 4{}
/* not used */




我想这5句代码的本意是:若由于干扰啊、静电啊..等因素导致进入某个中断,那么程序就会跑飞。为了防止跑飞,所以就加上这段代码,让程序跑到这5句代码中的某个中断服务程序中。

我就纳闷了!跑进这5句代码了,那还能出的去么?
因为很多的中断标志根本不是硬件清零的。必须进行软件清零啊!
所以说必须软件清零才行!

请问:大家都是怎么认为的?
(注:先不用考虑狗吧,因为狗是万不得已才让它起作用的!)

相关帖子

沙发
原野之狼| | 2009-12-7 17:12 | 只看该作者
觉得这样做意义不大 没用到的中断本身一般都是没有使能的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
板凳
ejack| | 2009-12-7 18:32 | 只看该作者
iret是啥……?
等待高手解答

使用特权

评论回复
地板
ejack| | 2009-12-7 18:33 | 只看该作者
菜鸟弱弱猜测一下……莫不是reti写反了?

使用特权

评论回复
5
xlsbz|  楼主 | 2009-12-7 19:17 | 只看该作者
iret是啥……?
等待高手解答
ejack 发表于 2009-12-7 18:32


IRET是汇编里面的中断返回指令吧

使用特权

评论回复
6
gtw| | 2009-12-7 21:31 | 只看该作者
进去,把不需要的中断关掉,把相应的中断标志位去掉,再撤。

使用特权

评论回复
7
xlsbz|  楼主 | 2009-12-7 21:51 | 只看该作者
进去,把不需要的中断关掉,把相应的中断标志位去掉,再撤。
gtw 发表于 2009-12-7 21:31


你平时都是这么弄的?

你认为是keil手册错了?:lol

使用特权

评论回复
8
arm_fan168| | 2009-12-7 21:59 | 只看该作者
标志不清除也比没有这个空函数强,最起码程序不会乱跑,最多是停在中断里出不来了。

使用特权

评论回复
9
gtw| | 2009-12-7 22:32 | 只看该作者
编译器没办法替你考虑太多,最多也不过给你填个空的中断函数。

要不要关掉,或去掉相关的标志位,那只有你看着办,不用的中断都进去了,除了跑飞进去的之外,就是其他地方反了天,反正不正常是已经客观存在了。

使用特权

评论回复
10
xlsbz|  楼主 | 2009-12-7 22:35 | 只看该作者
我觉得用了清除标志的话,飞一次再飞出来 就正常啦!

使用特权

评论回复
11
bhsdlmj| | 2009-12-8 08:22 | 只看该作者
keil 手册的这个东西确实给人误导

是个严重错误

使用特权

评论回复
12
渤海三叠浪| | 2009-12-8 08:23 | 只看该作者
11楼不懂别乱说

使用特权

评论回复
13
xwj| | 2009-12-8 08:50 | 只看该作者
Re:跑进这5句代码了,那还能出的去么?
进去了当然能出来,51、ARM的大多数中断标志都是中断后就会清除的,就算不清除,至少也不会从这里跑飞。
而且就算频繁中断也还是勉强能运行的。

毕竟中断开关只是个寄存器,很容易受干扰或错误操作而误打开,所以留出中断入口这一段是完全必要的。
当然,完美点的方法是在里面放上对应的错误报警、恢复代码或者复位代码,那就是你自己的事了。
(汇编下留出这一段,并把复位程序放后面就是不错的方法,C下你自己最好用嵌入汇编写一句LJMP 0到空函数里)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
14
xlsbz|  楼主 | 2009-12-8 09:15 | 只看该作者
毕竟中断开关只是个寄存器,很容易受干扰或错误操作而误打开,所以留出中断入口这一段是完全必要的。
这个我同意!
-------------------------------------------------------------------------------------------------
51、ARM的大多数中断标志都是中断后就会清除的,就算不清除,至少也不会从这里跑飞。
这个我也同意
--------------------------------------------------------------------


而且就算频繁中断也还是勉强能运行的。
这个我有疑问!??因为在受干扰情况下中断寄存器打开情况下,如果没有清除中断标志,那么就会不断进入中断,除非遇到高优先级中断。

--------------------------------------------------------------------

当然,完美点的方法是在里面放上对应的错误报警、恢复代码或者复位代码,那就是你自己的事了。
那么请问 在没有用到的中断程序里面放上清除中断标志的语句不就行了么?为什么还要复位呢?


请xwj大侠指点

使用特权

评论回复
15
myfaith| | 2009-12-8 09:40 | 只看该作者
而且就算频繁中断也还是勉强能运行的。
这个我有疑问!??因为在受干扰情况下中断寄存器打开情况下,如果没有清除中断标志,那么就会不断进入中断,除非遇到高优先级中断。
----------------------------
按照51的说法,中断返回后必须至少执行一条指令才能再次进入中断服务程序,所以也是边跑边中断拉,勉强运行.

使用特权

评论回复
16
xlsbz|  楼主 | 2009-12-8 14:51 | 只看该作者
期待继续................

使用特权

评论回复
17
xwj| | 2009-12-8 15:13 | 只看该作者
呵呵,15楼正解。

标准的51每次中断退出后必须执行一条指令后才会再次进入中断,早期有些仿真器就是靠这个特性来实现但不运行的。

复位的原因是基于这样的考虑:既然这里不正常了,那就也不确定其他地方是否正常,所以干脆重启、重新初始化。

就好比电脑中了木马、病毒,就算杀掉了,但我也愿意重新GHOST一样。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
18
xlsbz|  楼主 | 2009-12-8 16:16 | 只看该作者
本帖最后由 xlsbz 于 2009-12-8 16:20 编辑
呵呵,15楼正解。

标准的51每次中断退出后必须执行一条指令后才会再次进入中断,早期有些仿真器就是靠这个特性来实现但不运行的。

复位的原因是基于这样的考虑:既然这里不正常了,那就也不确定其他地方是否正常, ...
xwj 发表于 2009-12-8 15:13


恩 中断响应需要时间 我也是清楚的!至少三个机器周期 一般不超过8个!
看我的帖子https://bbs.21ic.com/viewthread.php?tid=146568&highlight=
“复位的原因是基于这样的考虑:既然这里不正常了,那就也不确定其他地方是否正常”这种观点很有说服力啊!哈哈

所以用了iret语句,再加上看门狗 就完美无缺了!


但是除了xwj大侠 为什么别的大侠没回复这个帖子呢?
难道他们都是假大侠?:lol

使用特权

评论回复
19
Wxy8030| | 2009-12-8 17:13 | 只看该作者
防止乱进入中断,确实是程序必须考虑的事情!

使用特权

评论回复
20
冷漠| | 2009-12-9 16:32 | 只看该作者
都是瞎扯!文不对题。好像比keil还高明似地。

为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。
/* define not used interrupt, so generate "IRET" in their entrance */
void extern0_ISR() interrupt 0{}
/* not used */
void timer0_ISR () interrupt 1{}
/* not used */



这段话的意思说的主题是“为了提高代码的容错能力”。也就是说,当程序跑飞异常事件已经发生时,可以采用这种方法,把跑飞的程序拉回正常的轨道。

如何拉回的?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝