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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不是问题的问题为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?相关的知识,希望对你有一定的参考价值。

这个问题之前一直理所当然,没有深究过,认为就是复位中断服务程序退出后进入到main的,实际不然。

【视频版】

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

【引出问题】

我们这里以MDK,IAR和GCC分别进行说明:

(1) MDK的处理:

main函数确实是在复位中断服务程序里面执行的:

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

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

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

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

 

 

(2)IAR的处理:

跟MDK的__main类似:

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

 

 

(3)GCC的处理:

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

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

 

【问题分析】

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

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

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

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

特别是最后一句: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​

微信公众号:armfly_com



以上是关于不是问题的问题为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?的主要内容,如果未能解决你的问题,请参考以下文章

stm32定时器复位重启

不是问题的问题为什么STM32的Flash地址要设置到0x08000000

stm32 WWDG 没进中断

AVR开发 Arduino方法 中断子系统

ARM中的异常中断是如何实现进入中断程序的,比如如何进入...

操作系统的中断异常和系统调用