• 296查看
  • 0回复

[芯片硬件] 单片机启动分析(上)单核单片机的启动

[复制链接]


该用户从未签到

发表于 25-4-2024 19:46:45 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


单片机在启动后,为什么会运行到main函数,这中间经历了什么呢?本篇以ARM内核的S32K1xx来分析单核单片机的启动过程。上电后首先执行复位函数,其实现如下所示。
单片机启动分析(上)单核单片机的启动w1.jpg

Reset_Handler实现
从上图可以看出,进入复位函数后: 1 通过CPSID I汇编指令关闭中断;2 首先初始化通用寄存器(arm寄存器的描述见<<玩转μcos-II(二)之任务切换>>);3 初始化主堆栈指针(sfe是IAR的“段操作符,表示取某个段的后一个字节的地址,所以此时正好指向栈顶);4 然后调用SystemInit执行系统初始化;5 再调用init_data_bss初始化.data和.bss数据段;6 通过CPSIE I打开中断;7 跳到用户的main函数。其中第4步SystemInit函数的实现如下图所示。
单片机启动分析(上)单核单片机的启动w2.jpg

SystemInit的函数实现
可以看出,系统初始化根据配置包括:使能内核浮点运算单元(FPU)和关闭看门狗。而init_data_bss的部分代码如下图所示。
单片机启动分析(上)单核单片机的启动w3.jpg

init_data_bss函数的部分实现
可以看出init_data_bss的主要作用为: 1 将中断向量表从flash拷贝到RAM,并让VTOR(向量表偏移寄存器)指向新的中断向量表; 2 初始化.data段(有初始化值的数据段); 3 初始化.code段; 4 初始化.bss段(未初始化和初始化值为0的段)。
       至此,完成所有初始化,跳到用户的第一个函数main。


该用户从未签到

发表于 12-3-2025 05:28:00 | 显示全部楼层
回复:

关于ARM内核的单片机启动过程,确实非常具有研究价值。在您提供的分析中,我们看到了Reset_Handler的具体实现步骤。下面是一些更专业的解读和进一步的理解。

当单片机启动后,它首先会进入复位函数Reset_Handler。在这个函数中,首先通过CPSID I指令关闭中断以防止意外中断影响启动过程。接着初始化通用寄存器以确保系统正常运行的基础环境。然后初始化主堆栈指针,这是程序运行的重要基础。随后,通过调用SystemInit函数进行系统初始化,这是设置单片机运行环境的关键步骤。紧接着调用init_data_bss来初始化.data和.bss数据段,为程序运行准备数据空间。这一系列操作完成后,单片机最终会跳转到main函数开始执行用户程序。这个过程是单片机启动过程中的核心环节,确保了程序的正常运行和用户逻辑的顺利执行。具体到ARM内核的S32K1xx系列单片机,其启动流程大致相同,但在具体实现上可能会有一些差异。希望以上分析能对您有所帮助。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 12-3-2025 05:28:00 | 显示全部楼层
尊敬的网友,针对您提出的关于单核单片机启动过程的问题,以ARM内核的S32K1xx为例,我会做出如下专业的回答:

单片机上电后,首先执行复位函数,该函数的主要任务包括关闭中断、初始化通用寄存器以及主堆栈指针等。在此过程中,会先通过CPSID I汇编指令关闭中断以确保系统稳定性。随后,初始化通用寄存器以确保程序运行的正确性。主堆栈指针的初始化则确保了程序执行过程中的数据存储和调用操作的正确性。接着,会调用SystemInit执行系统初始化,包括硬件设备的初始配置等。最后,通过调用init_data_bss来初始化.data和.bss数据段,为程序的正常运行做好准备。这一系列操作完成后,单片机最终会运行到main函数,开始执行用户程序。

以上就是对单核单片机启动过程的基本分析,如有更多问题,欢迎继续交流。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

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

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 02:25 , Processed in 0.341198 second(s), 36 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.