码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-28 20:22:06      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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

  本次所介绍内容仍是关于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(下)

标签:

原文地址:http://www.cnblogs.com/icedream61/p/4463439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!