51单片机中的中断优先级总结

comdoc 2009-10-26 03:55:52
这段时间编写51的控制板程序,两个大牛技术指导对51中断嵌套问题的看法不一样,后来亲自验证了一下,得到了一下的一些结论,发上来大家参考,表达不清的地方还望理解,呵呵。

51单片机的中断可嵌套,但至多支持二级嵌套。

51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
但这种优先级只是逻辑上的优先级,当同时有几种中断到达时,高优先级中断会先得到服务。这种优先级实际上是中断同时到达的情况下,谁先得到服务的优先级,而不是可提供中断嵌套能力的优先级。这种优先级被称为逻辑优先级。
例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。

要实现真正的嵌套形式的优先级,也即高优先级中断服务可以打断低优先级中断服务的情况,必须通过设置中断优先级寄存器IP来实现;这种优先级被称为物理优先级。
例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
...全文
6044 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aloohaa 2011-10-12
  • 打赏
  • 举报
回复
受教了
wangjinniuxing 2011-08-03
  • 打赏
  • 举报
回复
感谢楼主,我这几天也遇到了这个问题了,用的是UPSD3234的芯片,52的内核,增加了串口SCON2,I2C的中断,这两个优先级发生了冲突,导致我的程序每次运行20分钟就莫名的死机,谢谢!
shengqinwushuang 2011-04-21
  • 打赏
  • 举报
回复
我想知道有没有可以运行的代码?
sainimu78 2011-01-23
  • 打赏
  • 举报
回复
没早看着你的帖 ~!
最近我是弄了两天了才只知道这事
支持你一下
rpf413 2010-10-21
  • 打赏
  • 举报
回复
中断通过“IP”如何提高优先级呢?谢谢
嗯不事体 2010-09-01
  • 打赏
  • 举报
回复
学习ing
XU757012 2010-09-01
  • 打赏
  • 举报
回复
很有用;我用定时器去刷LCD,中断服务程序就比较长,要想得到一个1k的完整pwm,51就显得有些吃力;只能用定时器嵌套解决;

谢谢楼主,省了我不少时间;
xiangsicao 2010-08-09
  • 打赏
  • 举报
回复
谢谢楼主的分享!
青草根儿 2010-08-08
  • 打赏
  • 举报
回复
总结的不错,顶一下
code&bug 2010-08-07
  • 打赏
  • 举报
回复
正在学
Great_Bug 2010-08-07
  • 打赏
  • 举报
回复
现在有些扩展了的51可以有更多的中断嵌套,不过也只最多到4层.
xiangfei241 2010-08-07
  • 打赏
  • 举报
回复
学习了
jianjiaximufeng 2010-08-06
  • 打赏
  • 举报
回复
设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何“其他”的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数;

在楼主说的上面这种情况下,串口中断执行完后程序是返回到“其他”中断服务函数,还是返回到其他中断服务执行时的main函数,求高人给出解释;
he_meng 2010-06-03
  • 打赏
  • 举报
回复
各位 我请教一下 通过IP设置的优先级应该如何设置呢
he_meng 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hjf0102 的回复:]
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断
89C51单片机不是只有2级优先级的吗??
怎么有5级啦??
[/Quote]

怎么会有5级呢 这个说的只是在同一优先级中 cpu执行的顺序了啦
空影 2010-06-03
  • 打赏
  • 举报
回复
[/Quote]那显然是不行的了,我的意思是说只要高优先级的才能中断低优先级的中断服务程序,除非还有一个更高的优先级3
kkady 2010-05-25
  • 打赏
  • 举报
回复
正在学啊,多多指教
Peasant_Lee 2010-05-22
  • 打赏
  • 举报
回复
应该不关中断深度的问题,而是51本来就只有两级优先级,何来三级中断嵌套?那是不可能的吧?
橙蓄源 2010-05-20
  • 打赏
  • 举报
回复
正在学啊,多多指教
gelu1040 2010-05-10
  • 打赏
  • 举报
回复
当然,你要使系统能够支持无限中断嵌套(看你能扩展多少个中断源了)也还是有办法的。
51面。不管什么中断都有中断向量,中断一发生,下条指令直接进入中断向量空间实行。
在所有的 中断向量空间内部,跳转到同一个公共的中断服务程序,统一处理。判断优先级(这个有优先级已经不是51硬件的优先级,而是软件设置的全局变量),是否调用相应的处理函数(是否嵌套).

PS,这个公共的中断服务程序是可重入的哦。写的时候别出错了。
如果你想让同一优先级也可嵌套,那么,处理函数也必须是可重入的。

你的中断系统是否稳定,看你能否处理好可重入函数的编写。(因为优先级等变量是全局变量。)

加载更多回复(21)

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧