ARM单片机从上电开始做了哪些事情(启动流程)

ARM单片机从上电开始做了哪些事情(启动流程)ARM 单片机深度分析从上电到跳转到 main 中执行的过程 包含操作系统的双堆栈的使用原理 单片机上电过程

大家好,欢迎来到IT知识分享网。

一、ARM架构

1.ARM MCU的复位系统(CM3)

  在ARM Cortex-M3内核中提供了多个复位信号,但是各厂商在设计自己的MCU系统时一般只使用以下三个复位信号,其他的复位信号在MCU内部实现(如:看门狗复位信号,软件复位)。

注意:软件复位(寄存器AIRCR的第0位)只能复位内核,内核以外的不受影响

图片来源于Cortex-M3权威指南

2.中断向量表

异常类型 表项地址偏移量 异常向量
0 0x00 MSP
1 0x04 复位
2 0x08 NMI
3 0x0C 硬 fault
4 0x10 MemManage fault
5 0x14 总线 fault
6 0x18 用法 fault
7‐10 0x1c‐0x28 保留
11 0x2c SVC
12 0x30 调试监视器
13 0x34 保留
14 0x38 PendSV
15 0x3c SysTick
16 0x40 IRQ #0
17 0x44 IRQ #1
18‐255 0x48‐0x3FF IRQ #2 ‐ #239

  在 MCU 的内核汇编启动文件中可以找到每一个中断向量表中存储的中断服务函数入口:
在这里插入图片描述

二、MCU初次上电

1.产生上电复位(nPORESET)

  上电第一时刻产生一个上电复位(nPORESET)状态,在等待时钟信号稳定后退出复位状态。

注意:上电复位信号不是中断,并不会进入某个中断

2.堆栈初始化

  在退出复位状态后,CM3 做的第一件事就是读取下列两个 32 位整数的值:

  上电后,通过从向量表中取出 0 号向量,仅初始化了 MSP。MSP 初始化好后就为复位中断服务(和其他特权级态服务)准备好了堆栈。

在这里插入图片描述

3.进入复位中断服务程序

1.裸机的复位中断服务程序

  在裸机程序中通常只是用一个sp指针(MSP)。下图是裸机的复位中断服务程序,直接对系统进行初始化后,跳转到main中去运行。
在这里插入图片描述

2.带操作系统的复位中断服务程序

  一般来讲带操作系统的复位中断服务程序也是对系统进行初始化,然后跳转到main中去执行应用程序,与裸机不同的是带操作系统的复位中断复服务程序还会对操作系统内核的一些东西进行初始化(不细节讨论初始化了些什么东西)。

在这里插入图片描述

4.跳转到main应用程序

  在完成复位中断复位程序后,就会跳转到main里面去执行应用程序了,至此从上电到程序跳转到main的整个流程就结束了。

三.双堆栈的使用

  一般来讲,操作系统为了避免出现应用程序恶意修改内核,都会使用双堆栈(MSP和PSP)。
  由于从向量表中取出 0 号向量,仅初始化了 MSP。而对于 PSP 指针的初始化(或修改)需要在 PendSV 中断服务中对各个线程的 PSP 指针进行保护和更新。
  如下图在RT-Thread操作系统对任务进行切换时设置PSP指针的部分程序:
在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/145346.html

(0)
上一篇 2024-11-24 21:26
下一篇 2024-11-24 21:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信