找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1196|回复: 12
收起左侧

关于51单片机中断的理解

[复制链接]
ID:1091094 发表于 2023-11-20 20:06 | 显示全部楼层 |阅读模式
  我使用的是STC89C51RC单片机,在芯片手册中关于中断处理是这么介绍的:
  6.4 中断处理
    当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作:
   1. 当前正被执行的指令全部执行完毕;
   2. PC值被压入栈;
   3. 现场保护;
   4. 阻止同级别其他中断;
   5. 将中断向量地址装载到程序计数器PC;
   6. 执行相应的中断服务程序。
   中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,
将PC值从栈中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
  而且我在开发板上试验,在没有设置中断优先级的情况下,当正在执行一个中断服务程序时,有即使外部有中断信号来,
也一样会被忽略。
  所以是不是51中断的机制就是这样子的,而且跟它的芯片手册的介绍也对的上。  是不是其他内核的单片机的中断也是这样子的?


回复

使用道具 举报

ID:235200 发表于 2023-11-22 00:29 | 显示全部楼层
中断优先级只有2级,只有当低优先级的中断设置优先时,才能中断高优先级的中断,如果均不设置优先级,按自然优先处理(中断编号小的优先级高)
回复

使用道具 举报

ID:879348 发表于 2023-11-22 08:09 | 显示全部楼层
一般应用默认中断就行了,最关键的不要在中断里运行辅助函数
回复

使用道具 举报

ID:123289 发表于 2023-11-22 09:25 | 显示全部楼层
【在没有设置中断优先级的情况下】
无论你设置与否,它都是存在的,你不设置,它取默认值。
回复

使用道具 举报

ID:1091094 发表于 2023-11-22 11:42 | 显示全部楼层
yzwzfyz 发表于 2023-11-22 09:25
【在没有设置中断优先级的情况下】
无论你设置与否,它都是存在的,你不设置,它取默认值。

我觉得默认的优先级是指同时接收到多个中断时,应该执行哪个中断。不被执行的中断就被舍弃。
  而且在不设置优先级的情况下,正在执行中断服务函数时,有中断信号产生都是无效的。
  起码,在STC的51单片机上是这样子的。
回复

使用道具 举报

ID:1100538 发表于 2023-11-22 13:40 | 显示全部楼层
51自定义中断优先级是:INT0-T0-INT1-T0-ES
回复

使用道具 举报

ID:1100538 发表于 2023-11-22 13:42 | 显示全部楼层
3038838599 发表于 2023-11-22 11:42
我觉得默认的优先级是指同时接收到多个中断时,应该执行哪个中断。不被执行的中断就被舍弃。
  而且在不 ...

不会舍弃,高的执行了在执行下一级
回复

使用道具 举报

ID:647261 发表于 2023-11-22 14:35 | 显示全部楼层
我看到这个问题在论坛上讨论过很多很多次了,怎么还有人搞不清楚
51的优先级只有2个,分别是高优先级和低优先级
高优先级中断可以打断低优先级中断,执行完后再回到低优先级中断
相同优先级的中断不能相互打断,也没有先后顺序之分
不设置优先级就只有查询顺序,这个顺序仅在有中断同时触发时,顺序号小的先执行
所以2楼说的“中断编号小的优先级高”,4楼说的“无论你设置与否,它都是存在的”,6楼说的“
51自定义中断优先级是:INT0-T0-INT1-T0-ES”,7楼说的,都是错误的,你的理解是对的
回复

使用道具 举报

ID:1091094 发表于 2023-11-22 16:36 | 显示全部楼层
sttt300 发表于 2023-11-22 14:35
我看到这个问题在论坛上讨论过很多很多次了,怎么还有人搞不清楚
51的优先级只有2个,分别是高优先级和低 ...

其实我也是看到论坛上的回答,感觉不怎么正确,所以就自己再通过开发板求证的。
可能AT89C51的优先级只有两个,但是在STC89c51rc这个型号上,中断优先级是有四个的。
回复

使用道具 举报

ID:883242 发表于 2023-11-22 20:56 | 显示全部楼层
楼主位帖子的理解最大问题是“忽略”这两个字。

事实是不可能被忽略,只会被挂起pending

中断执行过程中,同等级中断不会立刻响应,但是会被挂起。

中断执行完毕,同等级中断就会执行。
回复

使用道具 举报

ID:123289 发表于 2023-11-23 10:53 | 显示全部楼层
举例说明下,中断何时会被丢弃与不会被丢弃:
假设正在执行INT0中断服务程序中,程序执行时间很长,还未结束(遇RETI指令视为结束!)
而外设正通过串口向CPU发送数据1,2,3,4……
这时收到发来了【1】,RI被置位,由于INT0未结束,而串口无法响应中断;
須臾【2】又收到了,RI再次置位,不过RI原本已是1,置位也是白置,SBUF中的【1】,被【2】挤掉了。
这时INT0结束了,RI=1的申请被执行,于是转串口中断服务,也就收到了【2】,这样【1】就丢失了。
这时【3】又发来了,RI又被硬件置1。由于程序写的很糟糕,应在开始就清RI,结果,在中断服务程序结束前才清RI。这样【3】也丢了。
然后【4】来了,当然就收到了。

【关键点】记住:
1、每个中断源有一个IF标记,中断源动作(起效)时,IF被硬件置1,但它只是【申请】中断,是否被被批准【响应】,还取决于其它条件(被允许、已打开、无更高、同级在执行、CPU当前指令执行完毕……)。
2、由于一个中断源只有一个标记IF,会出现以下三种情况:
2.1、中断源动作了,IF被置1,但未被响应(如串口收到【1】未被响应),又来了N次动作(如串口又陆续收到【2】……【N】),那么只有中断响应前的一个【N】会被收到,在N之前的全部丢失。
2.2、中断响应后IF未被清除保持1,在中断服务退出后,会再次进入中断。也即数据【1】被无限次当作串入的数据。
所以必须及时清除中断标记IF。提示:注意看手册,有的IF在中断响应后会由硬件自动清除。
2.3、中断源动作让IF=1,在未被响应之前,误将IF清成0,则中断申请取消,无法响应,即丢失。这在共用一个中断入口的中断源中时易发生。
例如,串行中断服务程序:先看了TI=0无发送中断,于是转至查看RI=1,就在处理接收数据过程中,TI变1了、之后服务程序也结束了,不过程序写的比较差,在退出中断前,才清除了RI、TI。这样就丢失了一个TI。

回复

使用道具 举报

ID:1100910 发表于 2023-11-23 16:12 | 显示全部楼层
标准51只有一个中断优先级管理的寄存器IP,只有两级,默认都是0(低优先级),你没有设置,也即都是低优先级,此时只有与硬件相关的所谓自然优先级(但与IP决定的高低可嵌套中断响应的优先级不同,只是多个中断同时发生的情况下先响应哪个中断,也叫查询顺序,不可以嵌套中断响应,CPU响应一个中断后,其他的都得等待,相当于排队)。对于宏晶的单片机说实话有点乱,看看网站内容及Datasheet就可窥见一斑。按照手册说明(如果描述内容属实),它增设了一个IPH寄存器,跟IP一样,也是其中一位对应某一个中断源,从而构成四级中断优先级,但默认值都为0,跟没有增设是一样的。不同的单片机的架构是不一样的,支持的中断工作机制也不同,比如ARM的中断管理。😄
回复

使用道具 举报

ID:1100910 发表于 2023-11-23 16:15 | 显示全部楼层
3038838599 发表于 2023-11-22 16:36
其实我也是看到论坛上的回答,感觉不怎么正确,所以就自己再通过开发板求证的。
可能AT89C51的优先级只 ...

不管它有多少级优先级,你没设置跟没有是一样的。除非你设置为不同的优先级才能测试中中断优先级带来的中断嵌套效果!😄
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表