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

  本次所介绍内容仍是关于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. 详细讲解:通过composer安装TP5.1(Thinkphp5.1)

    现在TP5越来越火了,TP5也更新到了5.1版本,但是5.1以上版本只能通过composer来进行安装,那么这里贴出详细的步骤 前提:PHP版本必须要5.6以上 参考网址:http://www.thi ...

  2. 【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式

    今天是个好日子,嗯. 信号槽机制是Qt的特色功能之一,类似于windows中的消息机制,在不同的类对象间传递消息时我们经常使用信号槽机制,然而很多时候都没有去关注connect()函数到底有几种重载的 ...

  3. IOS 拦截所有push进来的子控制器

    /** * 能拦截所有push进来的子控制器 */ - (void)pushViewController:(UIViewController *)viewController animated:(BO ...

  4. MMU CPU及思想

    要素: 1)CPU访问寻址地址空间: 2)内存不足以容纳所有进程数据: 3)MMU将进程数据分割,保留当前使用数据. http://baike.baidu.com/link?url=KHyp37Ysi ...

  5. 【转】Android开发学习笔记(一)——初识Android

    对于一名程序员来说,“自顶向下”虽然是一种最普通不过的分析问题和解决问题的方式,但其却是简单且较为有效的一种.所以,将其应用到Android的学习中来,不至于将自己的冲动演变为一种盲目和不知所措. 根 ...

  6. Java连接mysql中遇到的一些问题及解决方法

    1.Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without server's identityverification i ...

  7. 手动安装Apache+PHP+MYSQL及环境配置

    先准备好软件: Apache官方下载地址:apache_2.0.55-win32-x86-no_ssl.msi,更多版本在这里: php官方下载地址:php-5.0.5-Win32.zip,更多镜像下 ...

  8. 刚学不久的python,自己稍微加工了一点,影响不大,因为博主很懒,所以格式什么的,就没有太在意了!

    本人初学python,之前因为有接触过其他语言,但是并没有接触的太深,出于对一个hacker的向往,学习一下Linux和python再说,当然,也是为了高工资啦,啊哈哈哈! 一开始就是一个蛮有意思的小 ...

  9. 开发必看 | iOS开发常用设计模式!

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~(一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则: ...

  10. Vue项目架构设计与工程化实践

    摘自Berwin<Vue项目架构设计与工程化实践>github.com/berwin/Blog/issues/14 1.Vue依赖套件 vuex:项目复杂后,用vuex来管理状态 elem ...