嵌入式(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开始详细学习。
嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(下)的更多相关文章
- 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(上)
随着课内的学习,我想把每节课所学记录下来,以作查阅.以饲读者.由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文. 本次所介绍内容是关于Cortex-M3的基础内容. - ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- 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 ...
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...
- 【freertos】002-posix模拟器设计与cortex m3异常处理
目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...
- Embedded System.
Soc ( System on Chip) Soc is an integrated circuit (IC) that integrates all components of a computer ...
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ...
- 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度
嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度 上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法.这一篇详细介绍RTX的任务调度原理. RTX主要有 ...
随机推荐
- BZOJ 4502: 串 AC自动机
4502: 串 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 195 Solved: 95[Submit][Status][Discuss] Des ...
- Git由来
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与 ...
- C4C和CRM里获取当前登录用户分配的Organization Unit信息
C4C 如何查看某个用户分配的组织单元ID: 在Employee的Organization Data区域内看到分配的组织名称,如下图红色下划线所示: 现在的需求就是使用ABSL获取当前登录用户分配的O ...
- jade文档声明和头尾标签
作为一个页面,首先需要一个doctype的声明,它位于文档最上面的位置,放置html标签以前,用来告知浏览器当前这个页面用哪种html,或者xml的规范并解析页面 doctype html htm ...
- 2017.11.24 算法分析与设计------Gay格雷码
1. 格雷码问题: 对于给定的正整数n,格雷码为满足如下条件的一个编码序列: (1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串. (2) 序列中无相同的编码. (3) 序列中位置相邻的两 ...
- Mysql常见的引擎
常用的引擎是:Innodb和Myiasm这两种引擎: innodb: 提供了对事务的ACID操作,还提供了行级锁和外键约束,,他的优势就是处理大量数据,在msql启动的时候,首先会建立一个缓存池,主要 ...
- Spring框架基础2
Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...
- MySQL自增锁等待问题解决
有网友再群里问:在做基准测试时候,批量插入数据时,有很多自增锁等待,我告诉他解决办法: 1.innodb_autoinc_lock_mode=2 2.innodb_autoextend_increme ...
- Dnsmasq域名解析系统安装配置
Dnsmasq使用上比bind要简便得多,可以做正向.反向dns解析,支持DHCP服务.也可以做内部dns服务器用. 默认下,dnsmasq使用系统的/etc/resolv.conf,并读取/etc/ ...
- LVM(扩展)
LVM(扩展)======================== [root@aminglinux newdir]# fdisk -l /dev/sdb 磁盘 /dev/sdb:10.7 GB, 107 ...