打印
[应用相关]

裸机中断执行模式架构

[复制链接]
389|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OKAKAKO|  楼主 | 2024-2-28 23:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
中断执行模式

针对于上面的问题,很多人就会使用中断来解决。对于一些需要立即响应的操作,将其放在中断中,从而避免其被主程序中的其他逻辑所影响,此时代码可能如下所示:
<p>
</p><p>//按键中断</p><p>void key_isr(void){</p><p>    do_b(); //按键按下的操作</p><p>}</p><p>
</p><p>int main(void) {</p><p>    while(1){</p><p>        do_a();</p><p>        do_c();</p><p>    }</p><p>}</p>

主循环中还是正常执行非交互式的逻辑,而对于上例中按键交互的逻辑 do_b,则放到对应的按键信号捕获中断中(如 GPIO 外部中断)。此时即使在执行主循环中的其他逻辑,由于中断会打断主循环立即运行,所以按键信号会被立刻检测到并响应。
无法及时得到响应的问题解决了,对于一些非常简单的逻辑,这种模式就足够了,但如果主循环中的逻辑有一定的周期性要求,如 do_a 需要每隔 100 毫秒执行一次, do_c 需要 50 毫秒执行一次,于是 do_a 和 do_c 下就会存在 delay(100) 和 delay(50) 的代码:
<p>// 按键中断</p><p>void key_isr(void) {</p><p>    do_b();  // 按键按下的操作</p><p>}</p><p>
</p><p>void do_a(void) {</p><p>    delay(100);  // 延时100ms</p><p>    // do_a 逻辑</p><p>}</p><p>
</p><p>void do_c(void) {</p><p>    delay(50);  // 延时50ms</p><p>    // do_c 逻辑</p><p>}</p><p>
</p><p>int main(void) {</p><p>    while (1) {</p><p>        do_a();</p><p>        do_c();</p><p>    }</p><p>}</p>

此时无论 do_a 和 do_c 谁前谁后,他们的执行周期都会拉长到至少 150 毫秒!因为顺序执行的原因,你必须等待上一个逻辑执行完才能执行下一个逻辑。


这种情况下 do_a 和 do_c 任何一个逻辑的周期都无法被满足,这种模式的缺陷也就显现出来了。

使用特权

评论回复
沙发
digit0| | 2024-2-29 13:52 | 只看该作者
中断向量表是一个地址表,每个表项对应一个中断源,包含着中断服务例程(ISR)的入口地址。

使用特权

评论回复
板凳
LinkMe| | 2024-2-29 13:52 | 只看该作者
在ARM Cortex-M系列处理器中,中断控制器是NVIC(Nested Vectored Interrupt Controller),支持嵌套中断和多级中断优先级。

使用特权

评论回复
地板
理想阳| | 2024-2-29 13:52 | 只看该作者
根据具体需求设置中断源的优先级,确保重要的中断能够及时得到响应。

使用特权

评论回复
5
呈兴| | 2024-2-29 14:52 | 只看该作者
此时无论 do_a 和 do_c 谁前谁后,他们的执行周期都会拉长到至少 150 毫秒!因为顺序执行的原因,你必须等待上一个逻辑执行完才能执行下一个逻辑,设置中断源的优先级是很重要的哦~

使用特权

评论回复
6
ClarkLLOTP| | 2024-2-29 16:46 | 只看该作者
中断优先级如何分配才合适啊

使用特权

评论回复
7
Henryko| | 2024-2-29 22:46 | 只看该作者
ClarkLLOTP 发表于 2024-2-29 16:46
中断优先级如何分配才合适啊

重要的任务优先级高

使用特权

评论回复
8
Charlene沙| | 2024-2-29 22:55 | 只看该作者
裸机然后配合中断嵌套的话,有些时候容易懵,所以建议嵌套业务比较多时,建议用操作系统

使用特权

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

本版积分规则

209

主题

1446

帖子

4

粉丝