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

[复制链接]
1509|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 不允许同一个中断向量的中断服务程序嵌套。
如果你确定在该中断服务程序运行时,该中断又可能再次发生,那么你可以在处理完一次事件后,不退出中断服务程序,而跳回到函数入口处再次检查中断标志,如果发现有新的标志,那么继续处理就行了。
  1. void isr ()
  2. {
  3.   while (检查中断标志,如果有) {
  4.     处理之并清除中断标志
  5.   }
  6. }

但这种方法仅仅适合偶尔的中断突发(快速多次发生),如果不是偶尔而是经常,那么可能表示你的 CPU 处理能力不够(术语过载),你应该换一个更快的 CPU。
 楼主| Crashdown 发表于 2016-6-23 22:39 | 显示全部楼层
谢谢楼上各位的回答,十分感谢~~
本来想做一个应用切换程序,因为想节约下时间进入中断后直接利用longjmp()跳到主循环while处,这样就不用等循环结束再切换,实验结果是不行,关闭中断清除标记位也不行
再次感谢楼上各位!
john_lee 发表于 2016-6-23 22:45 | 显示全部楼层
ARM Cortex 在内核寄存器中标记了中断的状态,如果不执行中断返回指令(BL EXCE_RETURN),那么该中断将不能再次响应,并且与该中断优先级相同的其它中断也不能响应。
 楼主| Crashdown 发表于 2016-6-26 21:10 | 显示全部楼层
谢谢!一直在查找相关方面的,想着应该有一个相关标计位,不知道该标记位可不可以软件清0?
 楼主| Crashdown 发表于 2016-6-26 21:11 | 显示全部楼层
john_lee 发表于 2016-6-23 22:45
ARM Cortex 在内核寄存器中标记了中断的状态,如果不执行中断返回指令(BL EXCE_RETURN),那么该中断将不 ...


谢谢!一直在查找相关方面的,想着应该有一个相关标计位,不知道该标记位可不可以软件清0?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部