嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(下)

  随着课内的学习,我想把每节课所学记录下来,以作查阅、以饲读者。由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文。

  本次所介绍内容仍是关于Cortex-M3的基础内容,相对上一篇来说,介绍的内容更加具体和细致了。

------------------------------------------------------------------------------------------------------------------------------------------------

12、寄存器简介

名称(for people)
助记符

(in code)


别名

(in code)

详细介绍 备注 相关指令
Low Register R0~R7  
可以被所有指令使用

包括Thumb指令(16位)和Thumb-2指令(32位)

reset并不置零  
High Register R8~R12   只能被Thumb-2指令(32位)使用  
Stack Pointer R13
MSP

(MainSP)


默认的栈指针,在OS kernel、

中断及Privilege Mode中使用


同时只能使用一个

这取决于当前权限


PUSH

POP


PSP

(ProcessSP)

在User Mode中使用的栈指针
Link Register R14 LR 调用函数之后,返回的地址  
BL func

BX LR

Program Counter R15 PC 指向应当执行的指令内存
PC永远指向

当前指令+4的位置

(详细原理不知)

 

Special

Registers


Program

Status

Register

PSR
APSR

(Application)


包含5个值(N、Z、C、V、Q),

每个一位,分别对应 PSR[31~27]


PSR剩余位是空的

注意:

IPSR、EPSR只读


MRS

MSR

注意:

这两个指令

都无法在

User Mode

中调用


IPSR

(Interrupt)


包含3个值(ICI/IT、T、ICI/IT),

分别对应 PSR[26:25]、PSR[24]与PSR[15:10]


EPSR

(Execution)


包含1个值(Exception Number),

对应 PSR[8:0]


Interrupt

Mask

Register

PRIMASK  
1位,设为1则表示:

允许NMI和hard fault,其余中断mask

常在时序调度中用于暂时忽略某些中断


默认是0

表示没有mask

FAULTMASK  
1位,设为1则表示:

只允许NMI,其余中断mask(忽略)

常被OS kernel用于清理拥挤的mask队列

BASEPRI  
9位,用来设定mask的优先级,设为1则表示:

不高于这个优先级的中断将都被mask

常在时序调度中用于暂时忽略某些中断


Control

Register

CONTROL  
2位,

CONTROL[1] 表示 Stack Status:

  0表示使用Default Stack(即MSP),

  1则表示使用Alternate Stack(即PSP)。

CONTROL[0] 表示 Privilege Level in Thread mode:

  0表示Thread mode处于Privilege Mode下,

  1表示Thread mode处于User Mode下。


如果在Handler中

那么这两位

都只能为0

13、操作模式简介

  -> 当处理器reset之后,会默认初始化为Thread mode,权限是Privileged access level。

  -> 在User access level(此时必然处于Thread mode)中,无法访问SCS(System Control Space,是Memory中存储配置寄存器和debug相关内容的部分)。

  -> 在User access level中,也无法访问Special Registers,一旦尝试访问则会触发Fault exception。

  -> 在Privileged access level + Thread mode中,可以利用代码进入User access level中,方式就是把CONTROL[0]设为1。

  -> 当一个Exception出现时,处理器会自动切换为Privilege state;而当退出Exception时,则会回到Exception出现之前的状态。(处理器是通过CONTROL[0]的值来判断进入中断之前的权限状态的,而在中断过程中,必然是Privilege mode,根本不看CONTROL[0]也不改)

  -> 因此,如果想要从User mode切换为Privilege mode + Thread mode,则应该去调用一个中断,在中断中把CONTROL[0]设为0即可。

14、异常和中断简介

Exception Number Address Offset Exception Type Priority Function
0 0x00 并非中断 -
Cortex-M3的中断编号是从1开始的,这个位置并非中断,而是用来存储:

Starting value of the MSP

1 0x04 Reset -3(Highest) Reset
2 0x08 NMI -2 Non-maskable Interrupt(不可屏蔽中断)
3 0x0C Hard fault -1 当任何中断陷入disable或者mask时,便会触发Hard fault
4 0x10 Mem manage Settable 当访问无法访问的内存时会触发此中断
5 0x14 Bus fault Settable 当prefetch的指令被abort(Inst Bus),或者数据获取有误(Data Bus),则会触发
6 0x18 Usage fault Settable 当遇到了无效的指令或者无效的状态转换(例如想要在Cortex-M3中切换为ARM状态),则会触发
7-10 0x1C-0x28 - - Reserved
11 0x2C SVC Settable System service call via SVC instruction
12 0x30 Debug monitor Settable -
13 0x34 - - Reserved
14 0x38 PendSV Settable Pendable request for System Service
15 0x3C SYSTICK Settable System Tick Timer
16-255 0x40-0x3FF IRQ Settable IRQ(Interrupt Request中断请求) input #0-239

  这便是整个中断向量表(IVT,Interrupt Vector Table)的内容了,在内存中的起始地址是0。

  另外,PPT中还有一句话,我没看懂,在此存疑,有明白的同学望请解答!原文如下:

The base address of the vector table is re-locatable (set the relocation register in the NVIC); initially, the base address is 0x0.

15、指令集标识位

  在Cortex-M3中只有Thumb指令集,而并非所有ARM处理器都只有Thumb指令集。因此,ARM处理器中,用PC[0]来标识所指指令类型。原因很简单,指令只有16位和32位两种,也就是2个或者4个字节,因此PC[0]永远是0(实际上PC[1]或许也永远是0,这个存疑,了解的同学希望能够解答我的疑惑)。那么,ARM中也就干脆不去看PC[0],用它来标识指令类型了。

  因此,我们在Cortex-M3中应当永远将PC[0]设为1,这表示指令是Thumb指令;而一旦设为0,则表示所指为ARM指令,便会触发Usage fault(具体见上表)。

16、Stack(栈)以及Reset简介

  -> 选用哪个栈,是根据权限自动选择的,具体见第12点“寄存器简介”中对R13的介绍。

    不过,能不能手动选择,我有些记不得了,在此存疑。

  -> Reset之后,处理器会从Memory中读取两个内容:

    Address 0:default value of R13(MSP)

    Address 4:Reset vector(the starting address of startup program)

  原本打算给出PPT中的图片,但是Linux系统升级出了点bug,无法保存图片,等回来能抓出来了再补上。

17、指令简介

  这里仅仅对几个上文提及的指令进行详细解释

指令写法 用法与详解 代码实例 备注
MSR <special_reg>, <reg> Write to special register MSR R0, CONTROL
对Special Register的读写

只能通过register,不能通过Memory

而且,这两个指令

只有Privilege权限下可以使用

MRS <reg>, <special_reg> Read special register MRS CONTROL, R0
PUSH {reglist} Push the largest numbered register first PUSH {R0-R7, LR}
PUSH、POP所使用的是SP

例句中注意,PC[0]必须得是1

POP {reglist} Pop the lowest numbered register first POP {R0-R7, PC}

------------------------------------------------------------------------------------------------------------------------------------------------

  至此,关于Cortex-M3的基础介绍完毕。下一篇,将从Memory开始详细学习。

时间: 2024-12-10 18:55:10

嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(下)的相关文章

嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(上)

随着课内的学习,我想把每节课所学记录下来,以作查阅.以饲读者.由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文. 本次所介绍内容是关于Cortex-M3的基础内容. ------------------------------------------------------------------------------------------------------------------------------------------------ 1.什么是嵌

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )

发现放到Blog之后排版全乱套了.. 已经把PDF上传到资源页了  http://download.csdn.net/detail/lyy289065406/8934637 那边排版好看一点...看官们随意吧 >...< · 目 录 导 航 1. 引言 1.1. 编写目的 1.2. 阅读范围 1.3. 声明 1.4. 缩写词/名词解释 1.5. 参考资料 2. 嵌入式开发学习笔记 2.1. 开发环境/测试环境 2.2. 开坑:提要 2.3. 入坑:JNI 2.3.1. navicate 接口定

Embedded System.

Soc ( System on Chip) Soc is an integrated circuit (IC) that integrates all components of a computer or otherelectronic system into a single chip. It may contain digital, analog, mixed-signal, and often radio-frequency functions—all on a single chips

嵌入式驱动学习笔记

驱动学习笔记 输入子系统概念介绍 嵌入式驱动学习笔记,布布扣,bubuko.com

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二)

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二) RTX的进程间通讯主要依赖于四种机制,分别是事件(Event),互斥锁(Mutex),旗语或信号量(Semaphore),和邮箱(Mailbox).前三种机制侧重进程间的同步,邮箱则侧重进程间的数据通讯.这次讲一下信号量和邮箱. 1.信号量(Semaphore) 1.简介 信号量其实是一个很抽象的操作系统原语,它最早由荷兰计算机科学家Dijkstra提 出,用于解决多项资源的分配问题.实际上信号量的适用范围非常广,可以很好地解决很

嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板

嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板 当调度涉及优先度的时候,会出现不少问题,本文关于优先度调度的主要问题和一些应付的策略.主要有以下几个概念:优先度翻转(priority inversion),优先度继承(priority inheritance)策略和优先度天花板(priority ceiling)策略. 1.优先度翻转(priority inversion) 大部分的RTOS都支持给不同进程分配优先度,一定程度上能够让调度和时间管理灵活性更大.但是当涉及到

嵌入式Linux学习笔记之LED驱动

最近在学习嵌入式Linux驱动开发,大致了解了驱动的基本开发流程,本文主要针对字符设备驱动开发做一个简要介绍,也当作是对这几天工作的一个小小总结. 计算机系统是由软硬件相互协调共同完成工作的,作为专用计算机系统的嵌入式系统也不例外,既要有CPU.SDRAM.FLASH.IO等硬件,同时也少不了操作系统和应用软件等软件的支持,而作为应用程序与硬件的桥梁--驱动程序,是整个嵌入式系统开发过程中的关键环节.驱动开发涉及底层,而了解底层作用机制对于整个系统的开发意义重大. Linux内核中有60%以上是

嵌入式Linux学习笔记(基于S5PV210 TQ210)

基于S5PV210.TQ210平台. 本文更多的是教会大家如何学习! 包括如下内容: 1.前言 2.开发环境搭建 3.制作交叉编译器 4.裸机编程 4.1.汇编学习 4.2.S5PV210启动流程 4.3.点亮一个LED 4.4.串口 4.5.实现printf 4.6.时钟配置 4.7.重定位 4.8.DDR 4.9.NAND读写 4.11.LCD操作 5.移植u-boot(基于u-boot-2014.4版本) 5.1.概述 5.2.u-boot配置过程分析 5.3.u-boot编译过程分析 5

ARM cortex M3寄存器及指令集

1.cortex M3拥有通用寄存器R0-R15及一些特殊寄存器: R0‐R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. R8‐R12 也被称为高组寄存器.这是因为只有很少的 16 位 Thumb 指令能访问它们, 32位的指令则不受限制.它们也是 32 位字长,且复位后的初始值是不可预料的 . R13 是堆栈指针.在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈.当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那