单片机main函数在中断函数里执行?

发布者:DelightfulGaze最新更新时间:2023-09-12 来源: zhihu关键字:单片机  main函数  中断函数 手机看文章 扫描二维码
随时随地手机看文章

最近看了硬汉分享的一个内容:为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?




首先,Reset_Handler 是单片机的一个中断,其次,main 函数也确实被 Reset_Handler 中断调用了。那不是,main函数在中断里执行?


看到这个问题,你是否也曾想过这个问题,难道我们以前的认识错了?


说实话,我都没曾想过这个问题,我觉得绝大多数人都没有想过这个问题。所以,这里顺便分享一下这个问题的内容。


单片机的操作模式

这里的单片机,主要指 ARM Cortex-M 内核单片机。


要回答开篇那个问题,就要提到单片机的操作模式,这里以 Cortex‐M3 单片机为例,Cortex‐M3 支持两种模式和两个特权等级。


两种模式:

  • Handler 模式

  • Thread 模式


两个等级:

  • 特权级

  • 用户级


在 Cortex‐M3 手册中有这么一段:


其中,开篇问题的答案,我圈出来了。


官方的在线文档也提到了相关的说明:


地址:

developer.arm.com/docum


示例分析

上面圈出了答案,可能你还是蒙的,这里结合 Keil MDK + STM32 的工程代码给大家简单对比分析一下。


1.进入Reset_Handler中断我们在线调试时,复位状态,进入 Reset_Handler 复位中断:




此时,就是文档中提到的:在复位后,处理器进入特权级的Thread模式。

2.进入SysTick_Handler中断当我们进入普通中断,比如这里进入 SysTick_Handler 时钟滴答中断:




此时,我们进入的是特权级的Handler模式。

看到这里,想必你应该明白了。


总结

这个问题,关键点就是:

复位中断(Reset_Handler)和普通中断(SysTick_Handler)的操作模式不一样。


其他IDE,比如Keil、GCC等编译环境道理类似,这个问题主要在于内核,也就是由内核决定。


可能你从来没有关心过这个问题,当然,我们也很少遇到与之对应的问题。


这是一个不是问题的问题,不了解也没关系,你今天看到了也算进一步了解了 Cortex-M 单片机内核的一个知识点。


关键字:单片机  main函数  中断函数 引用地址:单片机main函数在中断函数里执行?

上一篇:MCU复位和程序启动那些事
下一篇:单片机自定义协议FIFO高效发送数据方法

推荐阅读最新更新时间:2024-11-09 18:01

学习STM32单片机之结构体思想
学习内容: 1.我们在操作寄存器的时候,操作的是寄存器的绝对地址,如果每个寄存器都这样操作,那将非常麻烦。 2.我们考虑到外设寄存器的地址都是基于外设基地址的偏移地址,都是在外设基地址上逐个连续递增的,每个寄存器占32 个或者16 个字节,这种方式跟结构体里面的成员类似。 3.定义一种外设结构体,结构体的地址等于外设的基地址,结构体的成员等于寄存器,成员的排列顺序跟寄存器的顺序一样。这样我们操作寄存器的时候就不用每次都找到绝对地址,只要知道外设的基地址就可以操作外设的全部寄存器,即操作结构体的成员即可。 下面先定义一个GPIO 寄存器结构体,结构体里面的成员是GPIO 的寄存器,成员的顺序按照寄存器的偏移地址从低到高排
[单片机]
[keil][python][单片机] keil 集成bin文件生成 boot+app合并 dfu生成
一、 首先配置keil执行工具 .file_handling.bat @L !L $K 输出文件名根据自身定义 二、 编写bat脚本(此处需要根据工具存放路径进行更改 xBin2Dfu/merge_file) @echo off set bin=%1 set axf=%2 set keilpath=%3 echo current file:%bin%.bin echo current axf:%axf% echo current keilpath:%keilpath% :: 生成bin %keilpath%ARMARMCCbinfromelf.exe --bin --output=.outbin%bin%.b
[单片机]
[keil][python][<font color='red'>单片机</font>] keil 集成bin文件生成 boot+app合并 dfu生成
51单片机: A/D 模数转换实验
51单片机: A/D 模数转换实验 一、实验内容 利用实验台上的0809做A/D转换实验,实验台上的W1电位器提供模拟量输入。编制程序,将模拟量转换成数字量。(要求模拟量由0809的IN2采集) 二、仿真图 三、代码 C语言实现: #include reg51.h #include absacc.h #define AD XBYTE //定义AD0808的地址 Y4(20) Y1(01) Y7(31) #define PA XBYTE //定义8255A中PA段的地址 #define PB XBYTE //定义8255A中PB段的地址 #define PC XBYTE
[单片机]
51<font color='red'>单片机</font>: A/D 模数转换实验
STM8单片机学习总结初步03
实物焊接及对应驱动程序全部调试完成,视屏地址为: 自制蓝牙灯操作视屏 网络地址:http://v.youku.com/v_show/id_XMjk0ODk1MjUyMA==.html; 实物图01为: 实物图02为: --------------- 对程序代码均使用“函数分割”形式实现,并添加“适当注释”,这种代码编写方式在初期编写时,会很繁琐,因为其将本可使用“1个函数”实现的代码分割为“2个或2个以上”的“函数”,但在后期维护或是别人接手你的“代码”时,会大大缩短所需时间; 在实际工作中,个人建议,所有东西留2份,若你是个好人,请直接忽略“02”所说内容!!!: 01、第一份:带详细内容注释、问题注释、注意
[单片机]
STM8<font color='red'>单片机</font>学习总结初步03
MSP430G2553的原理图
MSP430G2553单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片机”解决方案。该系列单片机多应用于需要电池供电的便携式仪器仪表中。
[单片机]
MSP430G2553的原理图
51单片机中断主要关于计时--定时--计算定时器初值--的简介
看到的关于中断 计时器定时器的介绍,个人看明白了。 目录: 1、单片机中断简介 2、中断允许寄存器IE 3、中断优先级寄存器IP 4、定时器中断 TMOD:定时器/计数器的工作方式寄存器,确定工作方式和功能。 TCON:控制寄存器,控制T0,T1的启动和停止及设置溢出标志。 工作方式 5、如何计算定时器的初值 6、中断服务程序的写法 7、代码示例 单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0 - 定时器/计数器0中断, 由
[单片机]
51<font color='red'>单片机</font><font color='red'>中断</font>主要关于计时--定时--计算定时器初值--的简介
51单片机波形发生器程序设计
一、 作品简介:可以通过按键控制STC89C52单片机输出 不同波形 信号。通过usb给pcb板通5v的电压可以发出方波,三角波,锯齿波,正弦波并在LCD显示屏上显示波形类别,频率和幅值。通过按键可调波形类别,可调节频率步进值有1Hz,10Hz和50Hz。最低频率为10Hz最高频率为800Hz。 二、设计原理:将各种波形的每个周期平均分成255份,把每份的值依次发给P0口,每份的时间间隔通过开启定时器0来控制,当定时时间到时单片机就产生中断,在中断服务程序里面通过P0口将每份的值发出去,这个值通过向D/A换器的输入端按一定的规律发生数据,从而在转换电路的输出端得到相应的电压波形。 三、 功能说明:能够产生方波、锯齿
[单片机]
51<font color='red'>单片机</font>波形发生器程序设计
基于89C51单片机和VB5.0实现通信和数据管理系统软件的设计
1.引言 随着通信技术的不断发展,计算机网络系统通信是当今技术发展的一个重要的方向,然而在网络系统中利用现有电话网作为通信信道则是最经济、最方便和最可靠的方法。当前现代电话通信网已经进入程控交换时代,技术比较先进,速度快,容量大,因此采用电话通信网建立数据通信系统确实具有其独特的优越性。 利用单片机系统采集灌区水位、水流量,实现无人职守和科学的管理水资源具有实际意义,特别对少雨缺水地区更具有应用价值。 2.系统硬件设计 本系统采用了MODEM将前端单片机采集的数据通过电话网远程传输到中心站PC机,并实现一对多点通信(站点数、通信距离均不限),后台PC机通过拨号的方式对各站点进行数据接收并实时存储记录、查询、打印。系统框图如
[单片机]
基于89C51<font color='red'>单片机</font>和VB5.0实现通信和数据管理系统软件的设计

推荐帖子

这个电路最小输出怎么计算?
当uA7805与431这么连接,求最小输出的计算公式?这个电路最小输出怎么计算?TL431是个带有内部基准电压的反馈放大器,其特性可以简单地概括为总是使REF端保持2.5V。所以此电路Vo等于2.5V*(R1+R2)/R2。但TL431的K端(图中与7805相联接的那一端)最小电压为2.5V,而7805的OUT端与公共端总是5V,所以Vo不能小于(2.5V+5V),即R1应该大于R2的二倍。【这个电路最小输出怎么计算?】由前述,该电路最小输出电压为7.5V。要
Knight97538 电源技术
【GD32E503评测】基于uCOSIII项目实现U盘功能1
前言:在驱动LCD屏幕的时候,需要用到字库、图片等数据,。比方我们要显示汉字那么流程如下制作字库生成.bin文件,例如通过字库制作文件生成gb2312.bin文件,并将gb2312.bin文件写入flash。Mcu解析中文字符,得到gb2312索引值,根据字库的大小计算得到flash的位置。读取相应数据。Mcu将读取到的数据发送给lcd屏幕进行显示。在实现上述过程时,遇到了个问题,那就是gb2312.bin这个文件该如何传输到flash中呢?我有如下几个方法: 通
eew_YeKTCB 国产芯片交流
【CW32L052测评】+彩色LCD屏驱动显示
尽管开发板已配置了液晶显示屏,但在图像的表现力上还是离不开彩色LCD屏的使用。这里所用的是一种0.96寸的彩色屏,并采用SPI接口工作。显示屏与开发板的连接关系为:CLK---PB08DIN---PB09RST---PF04DC---PF05CS---PF06BLK---PF07所用引脚输出高低电平的语句定义为:#defineOLED_SCLK_Set()PB08_SETHIGH()#defineOLED_SCLK_Clr()
jinglixixi 国产芯片交流
华晨1.8T动力系统细节解读
转:一提到发动机,国人心中就充满了痛楚,中国的汽车工业走过了风风雨雨的五十年,这五十多年却被国外讥笑为“没有自己发动机工业的五十年”,做为后起之秀的华晨、吉利、奇瑞坚持自主路线,都各自在核心技术上获得突破。和做低端起步的吉利、奇瑞不同,华晨集合各项关键技术,从高端做起,着手研发1.8T发动机,已于26日正式量产。华晨1.8T发动机可以说是拉开了国机时代的序幕,各大网站都在报道相关事件,但是您知道这款发动机的详细参数和技术特性么
gaoyanmei 汽车电子
IIC学习经历以及CAT1024/25
对于IIC来说只有两条线来控制数据的传输,SDA和SCL。对于IIC协议的学习,要掌握四种模式,主发送,主接收,从发送和从接收。在对设备的读写操作信号是在发送从地址时将其一起发送出去,比如主发送模式,它要从从设备中读取数据,那么在主设备就要在发送完地址后,再改变模式,改为主接收模式才能接收数据。在S3C2440A的处理器中,里面已经集成了IIC控制器了,在控制器中已经集成了IIC的时序,我们不需要去管时序该怎么走,而是设置好寄存器来控制IIC的发送和传输数据。在IIC控制器的寄存器中有几个寄
wangfwk ARM技术
【花雕体验】09 行空板硬件控制pinpong库的系列测试(之二)
行空板板身集成了光线传感器、麦克风、蜂鸣器、Wifi、蓝牙、加速度传感器、按键,正面配置有一块LCD彩屏,可实时呈现多种Python运行结果,包括文字、图片、视频,游戏画面,以及数据图表等。【花雕体验】01上手行空板https://bbs.eeworld.com.cn/thread-1206624-1-1.html【花雕体验】02行空板简单使用https://bbs.eeworld.com.cn/thread-1206649-1-1.html【花雕体验】0
eagler8 MicroPython开源版块
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved