arm - 当我在进入中断处理程序之前清除中断标志时发生了什么?
问题描述
假设一个中断(中断 1)发生在我处于另一个具有相同或更高优先级的中断(中断 2)的 ISR 中。那么在退出当前的ISR之前,我清除了中断1的中断标志,请问中断1的中断处理程序还是会被执行还是会忽略中断1呢?
对于上下文,我使用的是 STM32 微控制器。
谢谢
解决方案
AFAIK 从其他 CPU 的过去经验来看,你失去了中断。
在这种情况下,在清除中断 1 标志之前:
- 只需读取中断 1 标志位并临时存储
- 清除中断标志(在某些读取它的 CPU 中,会自动清除它)
- 在中断 2 结束时检查存储的位
- 如果未设置,则离开中断 2 例程
- 如果它被设置并且两个中断具有相同的优先级(或者没关系!):
- 只是跳转/调用另一个中断 1 例程(“停留”在中断 2 例程执行中)
- 如果它已设置并且中断 1 的优先级不同,那么您确实必须为其分配正确的优先级:
- 然后它变得困难,这里有一些选择:
- 一旦我强迫cpu触发另一个与中断1相同优先级的未使用中断3,所以使用中断3执行“中断1”例程
- 根据您的需要和可以在代码中构建中断优先级处理,使用上述技巧等等......
- 然后它变得困难,这里有一些选择:
PS:这应该在处理器的手册中描述,清除中断位是否会失去其执行 - 大多数是的,中断位只是一个“中断挂起”位。有时不容易找到描述,而是日常业务。
推荐阅读
- javascript - 如何获取文本框的客户端 ID,它是 Gridview EditItemTemplate,用于使用 JAVASCRIPT 将文本框值转换为马拉地语
- data-visualization - 按日期绘制百分比变化
- ios - iOS 13,Photos 框架崩溃,PHCompositeMediaResult 类
- python - 将 celery 与 flask_restful 一起使用
- javascript - 保留手风琴和扩展表行的状态
- html - 定位偏移 div / 图像
- java - 如何让 Maven 忽略本地存储库版本的本地项目
- linux-kernel - AOSP 内核调试
- python - 如何使用dict将字符分配给整数?
- cytoscape.js - Cytoscape.js,将标签文本放置在边缘顶部