【不是问题的问题】为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?
2023-09-14 09:02:15 时间
这个问题之前一直理所当然,没有深究过,认为就是复位中断服务程序退出后进入到main的,实际不然。
【视频版】
https://www.bilibili.com/video/BV1Le411V7jS
【引出问题】
我们这里以MDK,IAR和GCC分别进行说明:
(1) MDK的处理:
main函数确实是在复位中断服务程序里面执行的:
下面是__main的具体执行流程,其中调用了main,进入到main后,我们的程序就是一个死循环,一般不会退出main去执行exit():
(2)IAR的处理:
跟MDK的__main类似:
(3)GCC的处理:
这个过程是全开源的,也是类似流程。
【问题分析】
经过调试会发现个细节,正常情况下这个复位中断服务程序代码应该处于handler模式,而实际测试下竟然处于Thread线程模式。
进一步看官方文档,锁定问题了:
特别是最后一句: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
相关文章
- linux设置crontab任务_定时任务crontab每天7点执行
- 【说站】python程序的执行原理
- 【错误记录】Ubuntu 中执行 Java 程序报错 ( Error: Could not find or load main class TCPServer )
- 【错误记录】在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称 )
- PHP continue:跳过本次循环执行下次循环
- linux 上在指定时间段内每隔多少分钟自动执行任务计划crontab
- 稳定(固定)执行计划详解程序员
- 快速执行MySQL脚本命令(mysql执行脚本命令)
- Linux C程序可执行文件的编译与生成(linuxc执行文件)
- 脚本实现Linux系统自动开机运行脚本(linux开机自动执行)
- C程序在Linux下的执行方式(C文件Linux运行命令)
- Linux下执行Python程序的方法(linux执行py文件)
- MySQL: 执行最新SQL语句(mysql最近执行语句)
- Linux中的exec命令:执行外部程序的终极利器(linux执行exec)
- Linux下C语言程序的执行步骤(linux执行c文件)
- 用C语言控制Linux执行命令(c语言执行linux命令)
- 数据库中的 c 程序如何在Oracle数据库中运行C语言程序(c 如何执行oracle)
- linux操作系统安装MONO执行C#程序的详解步骤