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

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

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

12、寄存器简介

名称(for people)

助记符

(in code)

别名

(in code)

详细介绍备注相关指令
Low RegisterR0~R7 

可以被所有指令使用

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

reset并不置零 
High RegisterR8~R12 只能被Thumb-2指令(32位)使用 
Stack PointerR13

MSP

(MainSP)

默认的栈指针,在OS kernel、

中断及Privilege Mode中使用

同时只能使用一个

这取决于当前权限

PUSH

POP

PSP

(ProcessSP)

在User Mode中使用的栈指针
Link RegisterR14LR调用函数之后,返回的地址 

BL func

BX LR

Program CounterR15PC指向应当执行的指令内存

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 NumberAddress OffsetException TypePriorityFunction
00x00并非中断-

Cortex-M3的中断编号是从1开始的,这个位置并非中断,而是用来存储:

Starting value of the MSP

10x04Reset-3(Highest)Reset
20x08NMI-2Non-maskable Interrupt(不可屏蔽中断)
30x0CHard fault-1当任何中断陷入disable或者mask时,便会触发Hard fault
40x10Mem manageSettable当访问无法访问的内存时会触发此中断
50x14Bus faultSettable当prefetch的指令被abort(Inst Bus),或者数据获取有误(Data Bus),则会触发
60x18Usage faultSettable当遇到了无效的指令或者无效的状态转换(例如想要在Cortex-M3中切换为ARM状态),则会触发
7-100x1C-0x28--Reserved
110x2CSVCSettableSystem service call via SVC instruction
120x30Debug monitorSettable-
130x34--Reserved
140x38PendSVSettablePendable request for System Service
150x3CSYSTICKSettableSystem Tick Timer
16-2550x40-0x3FFIRQSettableIRQ(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 registerMSR R0, CONTROL

对Special Register的读写

只能通过register,不能通过Memory

而且,这两个指令

只有Privilege权限下可以使用

MRS <reg>, <special_reg>Read special registerMRS CONTROL, R0
PUSH {reglist}Push the largest numbered register firstPUSH {R0-R7, LR}

PUSH、POP所使用的是SP

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

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

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

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

05-11 22:05