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

  本次所介绍内容仍是关于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开始详细学习。

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

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

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

  2. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  3. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  4. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  5. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  6. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  7. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

  8. Embedded System.

    Soc ( System on Chip) Soc is an integrated circuit (IC) that integrates all components of a computer ...

  9. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  10. 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度

    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...

随机推荐

  1. PHP:global全局变量的使用

    global全局变量能够让我们更好的去运用,直接上例子: 1.一个函数,获取函数外的内容: 得到的结果: 2.两个函数,函数2获取函数1的全局变量内容:(重点) 结果: 以上就是我的总结啦 END

  2. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

      c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...

  3. 支付宝快速集成ios

    看一下这篇文章,非常不错,并在此感谢这篇文章的作者. 惯例,先写出嵌入支付宝的核心代码 - (IBAction)payWithAli:(UIButton *)sender { //生成订单信息NSSt ...

  4. http长链接

    之前说过http的请求是再tcp连接上面进行发送的,那么tcp连接就分为长连接 和 短连接这样的概念,那么什么是长链接呢?http请求发送的时候要先去创建一个tcp的连接,然后在tcp的连接上面发送h ...

  5. 2018.8.19 mybatis 环境搭建---配置mysql 。(Windows环境下面)

    安装mysql Install/Remove of the Service Denied!错误的解决办法 在windos 的cmd下安装mysql 在mysql的bin目录下面执行: mysqld - ...

  6. 第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

    第38章     I2S—音频播放与录音输入 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  7. 微信H5单页面滑动的时候如何避免出界,出现头部和底部的黑底?

    ios系统微信浏览器.safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法 ios偶现下拉出现黑底时,界面第一次上拉时拉不动的解决方案: document.querySelector('# ...

  8. 3.Netty的粘包、拆包(二)

    Netty提供的TCP数据拆包.粘包解决方案 1.前言 关于TCP的数据拆包.粘包的介绍,我在上一篇文章里面已经有过介绍. 想要了解一下的,请点击这里 Chick Here! 今天我们要讲解的是Net ...

  9. jquery-ui-custom autocomplete

    //jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8& ...

  10. 【动态规划】cf1034C. Region Separation

    质因数分解套路的复杂度分析的动态规划 题目大意 有一颗$n$个节点有点权的树,初始整棵树为$1$号区域,要求满足下列规则: 除非$i$是最后一个等级,否则每一个$i$级区域都要被分成至少两个$i+1$ ...