打印
[STM32F1]

STM32底层中断处理问题,有大神吗?

[复制链接]
1203|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Crashdown|  楼主 | 2016-6-23 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一个很纠结的问题,就是在STM32进入中断程序后,一定要运行完本中断程序才能重新进入该中断吗?STM32内部的中断机制是否是:假设有一个a中断,判断a中断运行结束后才能开始下一个a中断?当在运行a中断时无法再次进入该中断程序?

如果我想在a中断程序运行的时候再次进入a中断程序,不知道有没有大神了解相关方面的?不胜感激!
沙发
Brand2| | 2016-6-23 21:53 | 只看该作者
假设有一个a中断,判断a中断运行结束后才能开始下一个a中断?当在运行a中断时无法再次进入该中断程序?

如果只有这个中断的话是的,如果有其他的中断就得考虑优先级问题了

使用特权

评论回复
板凳
joketinnle| | 2016-6-23 21:53 | 只看该作者
看 抢占优先级和相应优先级,,,如果多个中断函数,抢占相应优先级相同的话,执行相应中断时不会被打断。

你可以在中断函数里引用一个外部函数,就相当于你的中断做一个跳转作用。
(void)XXXXX_IRQHandler(void)
{
    foo(void);
     清除中断标志位;
}

使用特权

评论回复
地板
john_lee| | 2016-6-23 22:23 | 只看该作者
明确的说,ARM Cortex 不允许同一个中断向量的中断服务程序嵌套。
如果你确定在该中断服务程序运行时,该中断又可能再次发生,那么你可以在处理完一次事件后,不退出中断服务程序,而跳回到函数入口处再次检查中断标志,如果发现有新的标志,那么继续处理就行了。
void isr ()
{
  while (检查中断标志,如果有) {
    处理之并清除中断标志
  }
}

但这种方法仅仅适合偶尔的中断突发(快速多次发生),如果不是偶尔而是经常,那么可能表示你的 CPU 处理能力不够(术语过载),你应该换一个更快的 CPU。

使用特权

评论回复
5
Crashdown|  楼主 | 2016-6-23 22:39 | 只看该作者
谢谢楼上各位的回答,十分感谢~~
本来想做一个应用切换程序,因为想节约下时间进入中断后直接利用longjmp()跳到主循环while处,这样就不用等循环结束再切换,实验结果是不行,关闭中断清除标记位也不行
再次感谢楼上各位!

使用特权

评论回复
6
john_lee| | 2016-6-23 22:45 | 只看该作者
ARM Cortex 在内核寄存器中标记了中断的状态,如果不执行中断返回指令(BL EXCE_RETURN),那么该中断将不能再次响应,并且与该中断优先级相同的其它中断也不能响应。

使用特权

评论回复
7
Crashdown|  楼主 | 2016-6-26 21:10 | 只看该作者
谢谢!一直在查找相关方面的,想着应该有一个相关标计位,不知道该标记位可不可以软件清0?

使用特权

评论回复
8
Crashdown|  楼主 | 2016-6-26 21:11 | 只看该作者
john_lee 发表于 2016-6-23 22:45
ARM Cortex 在内核寄存器中标记了中断的状态,如果不执行中断返回指令(BL EXCE_RETURN),那么该中断将不 ...


谢谢!一直在查找相关方面的,想着应该有一个相关标计位,不知道该标记位可不可以软件清0?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

20

帖子

0

粉丝