硬汉嵌入式论坛

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

[STM32H7] 【不是问题的问题】为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2022-10-20 01:51:33 | 显示全部楼层 |阅读模式
这个问题之前一直理所当然,没有深究过,认为就是复位中断服务程序退出后进入到main的,实际不然。

【视频版】

https://www.bilibili.com/video/BV1Le411V7jS[




【引出问题】

我们这里以MDK,IAR和GCC分别进行说明:
(1) MDK的处理:
main函数确实是在复位中断服务程序里面执行的​:

image.png

​下面是__main的具体执行流程,其中调用了main,进入到main后,我们的程序就是一个死循环,一般不会退出main去执行exit():

image.png

image.png


(2)IAR的处理:
跟MDK的__main类似:

image.png

(3)GCC的处理:

这个过程是全开源的,也是类似流程。

image.png

【问题分析】
经过调试会发现个细节,正常情况下这个复位中断服务程序代码应该处于handler模式,而实际测试下竟然处于Thread线程模式。

image.png

进一步看官方文档,锁定问题了:

image.png

特别是最后一句:Execution restarts as privileged execution in Thread mode ,异常重新作为特权级线程模式执行。 也就是说上电复位或者手动复位,此时的复位中断服务器程序就是作为普通程序来执行的,已经不再是中断式的处理机制,就是简单的函数跳转到了main里面。

参考资料:
1、https://developer.arm.com/docume ... del/exception-types
2、MDK的C库启动过程和初始化,即__main函数的执行全过程
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111658
3、https://github.com/raspberrypi/p ... tandard_link/crt0.S



评分

参与人数 3金币 +23 收起 理由
sugar + 2
emwin + 1 赞一个!
missfox + 20

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2022-10-20 01:51:45 | 显示全部楼层
更新完毕
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-10-20 10:11:10 | 显示全部楼层
问得我又迷糊了,再看看手册,加深下印象。
image.png
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2022-10-20 12:18:38 | 显示全部楼层
好帖,
代码不规范,亲人两行泪!
回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
发表于 2022-10-20 15:12:01 | 显示全部楼层
写的不错
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
QQ
发表于 2022-11-8 06:34:31 | 显示全部楼层
认真学习,感谢分享
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 07:38 , Processed in 0.219296 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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