硬汉嵌入式论坛

 找回密码
 立即注册
查看: 365|回复: 7
收起左侧

[STM32H7] 中断服务函数疑问

[复制链接]

7

主题

21

回帖

42

积分

新手上路

积分
42
QQ
发表于 2023-6-21 17:06:40 | 显示全部楼层 |阅读模式
寻求大佬解答,实际工程里没有,仅仅是有点疑惑?

STM32H7平台,假如有下面的中断服务函数。

void irq(void){
     清理中断;
     fun1();
     fun2();
     fun3();
     fun4();
     fun5();
     fun6();
}


fun1~6  用时较久,且内部仅仅是纯数据处理不涉及其他中断,如果此时 CPU 运行到fun4, irq的触发源到了  问:此时CPU会跳转到 irq的入口地址从新开始运行吗?

本地实测是不会跳转到irq的入口从新开始运行,但是irq函数对代码来说也仅仅是一个函数地址,为什么CPU不从新开始运行,非要等所有的irq函数运行完呢?CPU是取指令运行,难道它知道IRQ的结束?




回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-6-21 18:16:00 | 显示全部楼层
相同优先级的中断无法抢占执行吧,高优先级的中断才会抢占
Snipaste_2023-06-21_18-15-08.png
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-6-21 20:17:09 | 显示全部楼层
中断发生后,相关寄存器的某个标志位会被标志。中断函数运行结束后,相关标志位会复位。中断运行中标志位已经被标志了,这时来一个相同的中断那当然没反应了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2023-6-22 10:43:12 | 显示全部楼层
自己不能抢占自己。
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2023-6-22 18:58:05 | 显示全部楼层
1:
高优先级的来了抢占这个没有理解障碍,这里也不涉及。
2:
中断发生后,pending 标记都是需要用户自己手动处理的,确实找不的相关文档说明CPU会自动处理。我个人觉得如果cpu仅仅是去指令运行的话,
cpu应该都不知道结束。

3:
自己不能抢占自己。
从实验效果来看是这样的。
但是同样是fun4,在主循环里也可以调用该api.  如果在主循环里调用相同的fun4,该irq来了。我相信一定会执行irq函数。
fun4的指令是固定的。这个和自己不能抢占自己有点相悖,对cpu来说都是在执行fun4里的指令。

这里涉及到如果irq的服务函数较多,较深。如果在进入irq时就清除了pending isr 相关寄存器,此时cpu知道中断结束吗?
都清楚了cpu如何得知? 如果不知道,中断信号来了,为什么不从中断向量表里找到irq的指针然后跳转过去呢?
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2023-6-22 18:58:29 | 显示全部楼层
1:
高优先级的来了抢占这个没有理解障碍,这里也不涉及。
2:
中断发生后,pending 标记都是需要用户自己手动处理的,确实找不的相关文档说明CPU会自动处理。我个人觉得如果cpu仅仅是去指令运行的话,
cpu应该都不知道结束。

3:
自己不能抢占自己。
从实验效果来看是这样的。
但是同样是fun4,在主循环里也可以调用该api.  如果在主循环里调用相同的fun4,该irq来了。我相信一定会执行irq函数。
fun4的指令是固定的。这个和自己不能抢占自己有点相悖,对cpu来说都是在执行fun4里的指令。

这里涉及到如果irq的服务函数较多,较深。如果在进入irq时就清除了pending isr 相关寄存器,此时cpu知道中断结束吗?
都清楚了cpu如何得知? 如果不知道,中断信号来了,为什么不从中断向量表里找到irq的指针然后跳转过去呢?
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2023-6-22 18:59:01 | 显示全部楼层
1:
高优先级的来了抢占这个没有理解障碍,这里也不涉及。
2:
中断发生后,pending 标记都是需要用户自己手动处理的,确实找不的相关文档说明CPU会自动处理。我个人觉得如果cpu仅仅是去指令运行的话,
cpu应该都不知道结束。

3:
自己不能抢占自己。
从实验效果来看是这样的。
但是同样是fun4,在主循环里也可以调用该api.  如果在主循环里调用相同的fun4,该irq来了。我相信一定会执行irq函数。
fun4的指令是固定的。这个和自己不能抢占自己有点相悖,对cpu来说都是在执行fun4里的指令。

这里涉及到如果irq的服务函数较多,较深。如果在进入irq时就清除了pending isr 相关寄存器,此时cpu知道中断结束吗?
都清楚了cpu如何得知? 如果不知道,中断信号来了,为什么不从中断向量表里找到irq的指针然后跳转过去呢?
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
QQ
 楼主| 发表于 2023-6-22 21:19:04 | 显示全部楼层
1:
高优先级的来了抢占这个没有理解障碍,这里也不涉及。
2:
中断发生后,pending 标记都是需要用户自己手动处理的,确实找不的相关文档说明CPU会自动处理。我个人觉得如果cpu仅仅是去指令运行的话,
cpu应该都不知道结束。

3:
自己不能抢占自己。
从实验效果来看是这样的。
但是同样是fun4,在主循环里也可以调用该api.  如果在主循环里调用相同的fun4,该irq来了。我相信一定会执行irq函数。
fun4的指令是固定的。这个和自己不能抢占自己有点相悖,对cpu来说都是在执行fun4里的指令。

这里涉及到如果irq的服务函数较多,较深。如果在进入irq时就清除了pending isr 相关寄存器,此时cpu知道中断结束吗?
都清楚了cpu如何得知? 如果不知道,中断信号来了,为什么不从中断向量表里找到irq的指针然后跳转过去呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 22:54 , Processed in 0.215617 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表