如果中断执行时,来了一个低优先级的中断,是怎么处理的?

这个低优先级的中断会丢掉吗?
就拿51单片机来说
...全文
2618 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lr2131 2015-02-18
  • 打赏
  • 举报
回复
引用 10 楼 qq_26032847 的回复:
[quote=引用 9 楼 lr2131 的回复:] [quote=引用 8 楼 of123 的回复:] 不用想那么复杂,什么队列。 可以这样理解: 一个中断源发生中断请求时,中断控制单元首先判断当前是否有中断,它是否比当前服务的中断优先级高,是否有多个待执行的中断: * 如果当前没有正在服务的中断,判断是否有其他待处理的高优先级中断。如果没有,执行;否则,挂起,先执行高优先级中断。 * 如果当前有正在服务的中断,判断新中断是否有更高优先级。如果是,打断上一个中断,启动新中断;否则,挂起。 在一个中断服务完成时,中断控制单元清除该中断标志(如果是这样设计的),判断是否有挂起的中断,选择优先级最高的执行。 实际上,中断控制单元就是在对所有中断源的中断请求信号进行判断和处理。一个中断请求,实际上就是一路信号有效(比如置位 高电平);所谓挂起,可以理解为暂时不理睬它。
最近的那一次是不会丢失,但如果在处理高优先级中断的时候,低优先级的中断来过好几次,那就会有丢失了。 如果高优先级ISR代码写得不好,又或者优先级设置不合理,又或者低优先级中断间隔很短。在高优先级中断ISR中的时候,低优先级中断已经来过至少2次,那必然丢失1次,最近的那次是不会丢失。 比如说TImer中断优先级高,TImer的ISR要占用较长时间,又或者TImer中断频率过高,低优先级的Uart中断的ISR就不会有足够的时间运行了,丢失的情况是有的。[/quote] 楼上指的“2次丢失1次”是同一中断源的请求被挂起2次或多次时发生的吧?如果是不同中断源挂起,并且是同等级的话,则按硬件默认序列,也就是中断号序列排队。 想问一下如果在中断执行中,同一中断源又来了次中断请求,这个请求是被挂起还是被丢掉?[/quote] 过年了啊,羊年快乐。太吵了上了下网,原来还有同志工作在一线啊,及时给你回复吧。 我的回答不知道有没有普遍性,我只是按我比较熟悉的单片机系统来回答的,包括LPC的ARM7和STM32的Cortex-M0/3 我个人觉得中断会不会丢失和挂起,和具体的硬件中断系统实现有关系,更具体的来说应该是和中断向量控制器还有硬件外设中断那类东西有关,和CPU核内部的中断位无关(那只是个总开关)。 挂起行为和中断优先级仲裁系统有关,中断优先级仲裁系统根据优先级来排当前中断ISR执行与否。 丢失行为和记忆中断到来状态的部件有关,由相应的寄存器记忆(对于程序员可能可见也可能不可见),中断向量在执行完高优先级的ISR后,读取到还有中断ISR执行就开始执行ISR。 刚好这两样一般都是由中断向量控制器做的。 2次丢失1次当然是同一中断源呀,不同的中断源都有各自的寄存器去记录,如果时间上处理得过来的话,那当然不会丢失,只不过可能会有延后,延后严重了也就差不多是时间不够处理了,不也就成丢失了嘛。 如果本次的ISR没处理完,又来了同一个中断源,那应该是挂起,挂起的就是刚到来的中断。 如果在本次ISR没处理完之前再来一次同一个中断源,那就丢失了,因为那个中断状态是记录有没有来的状态,而不是记录还有多少次中断ISR没执行。换句话说只能记录有1次中断没开始处理, 我上面说的2次指的是有两次ISR还没处理,不是指有一次ISR在执行另一次在排队。 我以上的回答可能也不是很准确,如果确实需要搞得很清楚,我建议做一下实验,以实验的结果为准。这个实验并不难做, 我之前做某个项目,定时器中断的频率很高,我就对比的测试了下,上面的结论基本上就是从那个实验得来的。
qq_26032847 2015-02-15
  • 打赏
  • 举报
回复
引用 9 楼 lr2131 的回复:
[quote=引用 8 楼 of123 的回复:] 不用想那么复杂,什么队列。 可以这样理解: 一个中断源发生中断请求时,中断控制单元首先判断当前是否有中断,它是否比当前服务的中断优先级高,是否有多个待执行的中断: * 如果当前没有正在服务的中断,判断是否有其他待处理的高优先级中断。如果没有,执行;否则,挂起,先执行高优先级中断。 * 如果当前有正在服务的中断,判断新中断是否有更高优先级。如果是,打断上一个中断,启动新中断;否则,挂起。 在一个中断服务完成时,中断控制单元清除该中断标志(如果是这样设计的),判断是否有挂起的中断,选择优先级最高的执行。 实际上,中断控制单元就是在对所有中断源的中断请求信号进行判断和处理。一个中断请求,实际上就是一路信号有效(比如置位 高电平);所谓挂起,可以理解为暂时不理睬它。
最近的那一次是不会丢失,但如果在处理高优先级中断的时候,低优先级的中断来过好几次,那就会有丢失了。 如果高优先级ISR代码写得不好,又或者优先级设置不合理,又或者低优先级中断间隔很短。在高优先级中断ISR中的时候,低优先级中断已经来过至少2次,那必然丢失1次,最近的那次是不会丢失。 比如说TImer中断优先级高,TImer的ISR要占用较长时间,又或者TImer中断频率过高,低优先级的Uart中断的ISR就不会有足够的时间运行了,丢失的情况是有的。[/quote] 楼上指的“2次丢失1次”是同一中断源的请求被挂起2次或多次时发生的吧?如果是不同中断源挂起,并且是同等级的话,则按硬件默认序列,也就是中断号序列排队。 想问一下如果在中断执行中,同一中断源又来了次中断请求,这个请求是被挂起还是被丢掉?
lr2131 2014-08-07
  • 打赏
  • 举报
回复
引用 8 楼 of123 的回复:
不用想那么复杂,什么队列。 可以这样理解: 一个中断源发生中断请求时,中断控制单元首先判断当前是否有中断,它是否比当前服务的中断优先级高,是否有多个待执行的中断: * 如果当前没有正在服务的中断,判断是否有其他待处理的高优先级中断。如果没有,执行;否则,挂起,先执行高优先级中断。 * 如果当前有正在服务的中断,判断新中断是否有更高优先级。如果是,打断上一个中断,启动新中断;否则,挂起。 在一个中断服务完成时,中断控制单元清除该中断标志(如果是这样设计的),判断是否有挂起的中断,选择优先级最高的执行。 实际上,中断控制单元就是在对所有中断源的中断请求信号进行判断和处理。一个中断请求,实际上就是一路信号有效(比如置位 高电平);所谓挂起,可以理解为暂时不理睬它。
最近的那一次是不会丢失,但如果在处理高优先级中断的时候,低优先级的中断来过好几次,那就会有丢失了。 如果高优先级ISR代码写得不好,又或者优先级设置不合理,又或者低优先级中断间隔很短。在高优先级中断ISR中的时候,低优先级中断已经来过至少2次,那必然丢失1次,最近的那次是不会丢失。 比如说TImer中断优先级高,TImer的ISR要占用较长时间,又或者TImer中断频率过高,低优先级的Uart中断的ISR就不会有足够的时间运行了,丢失的情况是有的。
of123 2014-08-07
  • 打赏
  • 举报
回复 1
不用想那么复杂,什么队列。 可以这样理解: 一个中断源发生中断请求时,中断控制单元首先判断当前是否有中断,它是否比当前服务的中断优先级高,是否有多个待执行的中断: * 如果当前没有正在服务的中断,判断是否有其他待处理的高优先级中断。如果没有,执行;否则,挂起,先执行高优先级中断。 * 如果当前有正在服务的中断,判断新中断是否有更高优先级。如果是,打断上一个中断,启动新中断;否则,挂起。 在一个中断服务完成时,中断控制单元清除该中断标志(如果是这样设计的),判断是否有挂起的中断,选择优先级最高的执行。 实际上,中断控制单元就是在对所有中断源的中断请求信号进行判断和处理。一个中断请求,实际上就是一路信号有效(比如置位 高电平);所谓挂起,可以理解为暂时不理睬它。
宇帆 2014-08-06
  • 打赏
  • 举报
回复
不会,不清除的话,退出高优先级中断会进的
aydf1 2014-08-01
  • 打赏
  • 举报
回复
不会丢掉。除非你在上一个中断服务中清除了触发这个中断的寄存器标志位。 同意楼上的。
dceacho 2014-08-01
  • 打赏
  • 举报
回复
引用 3 楼 fengyunjh6 的回复:
[quote=引用 2 楼 wangfan027 的回复:] 不会,会等着, 把当前的处理完了再处理
这是怎么实现的呢,是中断队列吗[/quote] 这个我也不知道了,猜测硬件上应该有个东西里判断是不是在中断里
of123 2014-08-01
  • 打赏
  • 举报
回复
不会丢掉。除非你在上一个中断服务中清除了触发这个中断的寄存器标志位。
  • 打赏
  • 举报
回复
引用 2 楼 wangfan027 的回复:
不会,会等着, 把当前的处理完了再处理
这是怎么实现的呢,是中断队列吗
dceacho 2014-07-31
  • 打赏
  • 举报
回复
不会,会等着, 把当前的处理完了再处理
  • 打赏
  • 举报
回复
就哪51单片机来说

27,518

社区成员

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

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