ARM Cortex-M3 学习笔记(4-5)
Cortex-M3寄存器等基础知识

Cortex-M3寄存器等基础知识1.寄存器 CM3拥有R0~R15通⽤寄存器和⼀些特殊功能寄存器 R0~R12这些通⽤寄存器,复位初始值都是不可预料的2.CM3有R0到R15的通⽤寄存器组注:绝⼤部分的16位thumb只能访问R0到R7,⽽32位thumb-2可以访问全部寄存器3.特殊功能寄存器3.1程序状态寄存器组(应⽤程序PSR+中断号PSR+执⾏PSR)3.2中断屏蔽寄存器组:⽤于控制异常的除能和使能3.3控制寄存器:⽤于定义特权级别和当前使⽤哪个堆栈指针4.操作模式和特权级别:两种操作模式(处理器模式):Handler模式和线程模式(⽤于区分异常服务例程的代码和普通程序的代码)两种特权等级:特权级和⽤户级(是指在硬件层⾯上对存储器访问权限的设置)注:CM3在运⾏主程序(即线程模式)可以使⽤特权级别和⽤户级别;但是异常服务例程(即handler模式)只能使⽤特权级别。
当处于线程+⽤户模式时⼀些访问权限将被禁⽌将代码区分成⽤户级和特权级,有利于程序架构的稳定,如某⼀个⽤户代码出问题,不会使其成为害群之狗,因为⽤户级别的代码是禁⽌对⼀些要害寄存器操作的。
5.异常处理5.1CONTROL[0]=0;5.2CONTROL[0]=1;CONTROL[0]只有在特权级别下可以访问,若在⽤户级别想访问先通过"系统服务呼叫指令(SVC)"来触发SVC异常,然后在该异常的服务例程中可以修改CONTROL[0]。
6.下⾯是各操作模式的转换7.异常和中断可以有11个系统异常和最多240个外部中断(IRQ),具体芯⽚使⽤了多少要看芯⽚制造⼚商。
作为中断功能的强化,NVIC 还有⼀条NMI输⼊信号线,具体做什么由芯⽚制造商决定,NMI(not masked interrupted)8.向量表:当⼀个异常被CM3内核接受。
对应的异常Handler就会执⾏,向量表⽤来决定Handler的⼊⼝地址。
ARMCortex-M3学习笔记

ARMCortex-M3学习笔记最近在学ARM Cortex-M3,找了本号称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。
这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。
第一章简介这一章的内容主要是介绍Cortex-M3内核是如何的强悍。
还顺带着介绍了ARM系列的发展历史和路线。
ARM公司成立于1990年,ARM公司是Advanced RISC Machines Ltd.的缩写,当然ARM就是Advanced RISC Machines的缩写了,ARM 公司是由Apple,Acorn和VLSI三家共同出资创建的。
ARM 处理器内核的发展可以用一张图来说明:图 1 ARM处理器内核的发展从上图中可以看到,ARM 7 系列是基于 v4 内核的,ARM9系列是基于v5内核的,ARM11是基于v6内核的,而Cortex 系列则是基于v7内核的。
指令集的演化可以用下图来描述:图 2指令集演进图Cortex-M3 采用Thumb-2指令集,不支持ARM指令集,对Thumb-2指令集其实也只是部分的支持,有很少一部分Thumb-2指令是不支持的。
由于不支持ARM指令集,也就没有了处理器状态在Thumb和ARM之间来回的切换,省去了很多麻烦。
第二章 Cortex-M3 概述Cortex M3 内核的组成可以用一张简图来表示:图 3 Cortex-M3内核简图内核寄存器组包括R0-R15,R0-R12是通用寄存器,部分Thumb 指令只能访问R0-R7。
R13是堆栈指针,实际上有两个,一个是主堆栈指针(MSP)另一个是进程堆栈指针(PSP),堆栈要求4字节对齐。
R14存放程序的返回地址。
R15是PC,记录程序当前的执行地址。
特殊功能寄存器包括:程序状态字寄存器组(PSRs)中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)控制寄存器(CONTROL)运行模式和特权级别两种运行模式:handler mode和thread mode。
ARM嵌入式体系结构与接口技术(Cortex-A53版) 第五章

ANDS Wd, Wn, #bimm32 d = Wn AND bimm32,根据结果设置N和Z条件标志位,并清除C和V条件标志位。
ANDS Xd, Xn, #bimm64
Xd = Xn AND bimm64,根据结果设置N和Z条件标志位,并清除C和V条件标志位
// X1中的值右移5位,X0加X1,结果赋值给X2 // X0中的值左移2位,结果赋值给X1 // X0中的值右移4位,X2减X0,结果赋值给X1
内存访问指令寻址方式
在AArch64指令集中的加载/存储寻址模式大致遵循T32,使用通用寄存器Xn(n = 0-30)或当前堆栈指针SP的64位 基址,具有立即数或寄存器偏移量方式。完整的寻址模式如表5-4所示。某些类型的加载/存储指令可能仅支持其中的 一部分。
指令格式
MOVZ Wt, #uimm16{, LSL #pos} MOVZ Xt, #uimm16{, LSL #pos} MOVN Wt, #uimm16{, LSL #pos} MOVN Xt, #uimm16{, LSL #pos} MOVK Wt, #uimm16{, LSL #pos} MOVK Xt, #uimm16{, LSL #pos}
语法
1
#<immediate>
2
<Xm>
3
<Xm>, LSL #<shift_imm>
4
<Xm>, LSL <Rs>
5
<Xm>, LSR #<shift_imm>
6
<Xm>, LSR <Rs>
7
<Xm>, ASR #<shift_imm>
ARMCortex-M3处理器学习总结

ARMCortex-M3处理器学习总结ARMCortex-M3处理器学习总结在学习了《嵌入式Linux系统》这门课后,本人简单学习了ARMCortex-M3处理器,有了一点粗略的认识,下面将从性能,特性,用途这三方面来介绍ARMCortex-M3处理器。
1性能参数Cortex‐M3是一个32位处理器内核。
内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。
CM3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。
这样一来数据访问不再占用指令总线,从而提升了性能。
为实现这个特性,CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。
但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。
比较复杂的应用可能需要更多的存储系统功能,为此CM3提供一个可选的MPU,而且在需要的情况下也可以使用外部的cache。
另外在CM3中,Both小端模式和大端模式都是支持的。
CM3内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。
另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。
2特性ARMCortex-M3的特性总结为以下几方面:●功耗低。
延长了电池的寿命——这简直就是便携式设备的命门(如无线网络应用)。
●实时性好。
采用了很前卫甚至革命性的设计理念,使它能极速地响应中断,而且响应中断所需的周期数是确定的。
●代码密度得到很大改善。
一方面力挺大型应用程序,另一方面为低成本设计而省吃俭用。
●使用更方便。
现在从8位/16位处理器转到32位处理器之风刮得越来越猛,更简单的编程模型和更透彻的调试系统,为与时俱进的人们大大减负。
●低成本的整体解决方案。
让32位系统比和8位/16位的还便宜,低端的Cortex‐M3单片机甚至还卖不到1美元。
●遍地开花的优秀开发工具。
免费的,便宜的,全能的,要什么有什么。
ARM Cortex-M3处理器简介 读后感

读后感:ARM Cortex-M3处理器简介ARM, 读后感, 处理器, 简介首先谈谈我对这个系列先入为主的感觉。
Cortex-M3是ARM7的升级版本。
个人认为:ARM7本身并不是完全针对MCU来设计的,但是众多芯片厂家以ARM7为内核做了很多32位MCU芯片。
例如Atmel和NXP的ARM7系列。
Cortex-M3是真正针对MCU应用来设计的,这一点在功能取舍和性能偏向上得到反映。
那么与ARM7相比较,Cortex-M3有哪些区别和特点呢?加速设计:哈佛结构替代ARM7的冯.诺伊曼结构。
哈佛结构就是指令和数据总线分开。
这样取指令和取数据可以同时进行。
很适合将指令放在片内FLASH,将数据放在片内SRAM的MCU结构。
在ARM7的3级流水线之上增加了分支预测。
减少了程序跳转时流水线被打断的时间消耗。
ALU支持硬件乘法和硬件除法。
数学计算能力增强。
单周期32位乘法。
Bit-Band技术:简单地说,就是增强了位操作性能。
SRAM中有专门的Bit-Band区域,可以按位进行寻址(使用别名地址)。
而且,这样的位操作是原子操作。
这在实现互斥功能时有用。
一些DSP运算专用的位操作指令,比如bit翻转。
节省存储器使用量的技术:位寻址是可以节省bool型变量的存储器使用的。
ARM7的short变量要16位对齐、int变量要32位对齐。
Cortex-M3不用对齐。
这个问题,一般看法是,对齐可以简化设计。
个人认为这个好处有限。
指令集的优化。
现在叫Thumb-2了。
ARM7有两种指令集:ARM和Thumb,两种指令模式可以切换。
个人感觉比较怪。
处理器模式的简化:我们知道ARM7有很多种处理器模式,目的主要应该是支持复杂的操作系统。
Cortex-M3的处理器模式现在有两个:Thread模式和handler模式。
Thread模式相当于用户模式了,有两种访问方式:有特权方式和无特权方式。
结构区别:ARM7是个纯内核,中断控制器和存储器接口是芯片厂家扩展的。
Cortex-M3指令小结

Cortex-M3指令小结此附录实际上是从Cortex-M3技术参考手册中译版摘抄并改编的。
并且在可能的情况下,使用类C 语言的风格来讲解指令的功能。
另外要解释的是U8表示unsigned char,无符号16位整数U16表示unsigned short,无符号16位整数S8表示signed char,带符号8位整数S16表示signed short,带符号16位整数缺省情况下,如果使用普通的char和short,都是指带符号整数当借C语言的数组表示法,如Rn[Rm]时,是按整数运算的方式求得Rn+Rm的值,然后把该值当作一个32位地址,再取出该地址的值。
在计算地址时,并不乘以“数据类型所占用的字节数”,这与C语言的数组/指针运算是概念上的不同,切记切记!简单地概括,这里的Rn[Rm]等效于*( (U32 *) (Rn+Rm) ),其中Rn,Rm均为32位整数类型还有两条重要的通用规则:z凡是在指令中有可选的预移位操作的,预移位后的值是中间结果,不写回被移位的寄存器z凡是在{S}的指令中使用了S后缀的,都按照运算结果更新APSR中的标志位。
表1-1 16位Cortex-M3指令汇总操作 汇编指令Rd+= Rm+C ADC <Rd>, <Rm>Rd= Rn+Imm3ADD <Rd>, <Rn>, #<immed_3>Rd+= Imm8ADD <Rd>, #<immed_8>Rd=Rn+Rm ADD <Rd>, <Rn>, <Rm>Rd+=Rm ADD <Rd>, <Rm>Rd=PC+Imm8*4ADD <Rd>, PC, #<immed_8>*4Rd=SP+Imm8*4ADD <Rd>, SP, #<immed_8>*4Rd=SP+Imm7*4 或SP+=Imm7*4ADD <Rd>, SP, #<immed_7>*4或 ADD SP, SP, #<immed_7>*4AND <Rd>, <Rm>Rd &= RmASR <Rd>, <Rm>, #<immed_5> Rd = Rm 算术右移 Imm5Rd 算术右移= Imm5 ASR <Rd>, <Rs>操作汇编指令 按<contd>条件决定是否分支B<cond> <target address> 无条件分支B<tartet address> Rd &= ~RsBIC <Rd>, <Rs> 软件断点BKPT <immed_8> 带链接分支BL <Rm> 比较结果不为零时分支CBNZ <Rn>, <label> CBZ <Rn>, <Rm> 比较结果为零时分支CMN <Rn>, <Rm> 将Rm取二进制补码后再与Rn比较(注意:不是取反)CMP <Rn>, #<immed_8> Rn与 8位立即数比较 ,并根据结果更新标志位的值CMP <Rn>, <Rm> Rn与Rm比较,并根据结果更新标志位的值CMP <Rn>, <Rm> 高寄存器与高或低寄存器比较,并根据结果更新标志位的值。
arm cortex m3权威指南读书笔记
chapterI 介绍ARMv7 A:用于高性能的“开放应用平台”——越发接近电脑R:用于高端嵌入式系统,尤其是那些带有实时要求的——既要快又要实时M:用于深度嵌入的、单片机风格的系统中Chapter II CORTEX-M3概览哈佛结构拥有独立的指令总线和数据总线,但这两条总线共享一个存储器空间CM3拥有R0~R15的寄存器组,其中R13作为堆栈指针SP。
SP有两个,但在同一时刻只能看到一个,这就是所谓的"banked"寄存器。
1.R0~R12是32位通用寄存器,用于数据操作。
!!:绝大多数16位的thumb指令只能访问R0~R7,而32位的thumb指令可以访问全部寄存器。
2.banked R13:两个堆栈指针主堆栈指针(MSP):复位后默认使用进程堆栈指针(PSP):由用户的应用程序代码使用堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
实际上,R13的最低两位被硬线连接到0。
3.R14:连接寄存器:当调用一个子程序时,由R14存储返回地址4.R15:程序计数寄存器:只向当前程序地址5.特殊功能寄存器:程序状态子寄存器组(PSR)中断屏蔽寄存器组(primask,faultmask,besepri)控制寄存器(control)还支持两级特权操作:特权级和用户级在CM3运行主应用程序时(thread mode),既可以使用用户特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。
复位后,默认进入thread mode,特权级访问。
在特权级下,程序可以访问所有范围的存储器(如果有MPU,则必须在MPU规定范围之外),并且可以执行所有指令。
一旦进入用户级,想要进入特权级必须:执行一条系统调用指令(SVC),这会出发SVC异常,然后由异常服务例程接管,如果批准进入,则异常服务例程修改control寄存器,才能在用户级的thread mode 下重新进入特权级。
CortexM3中断优先级分组的理解
CortexM3中断优先级分组的理解Cortex M3中断优先级分组的理解学习了《EasyARM1138开发指南》中的《中断控制(Interrupt).pdf》,接触了一个新的概念——中断优先分组(Interrupt priority grouping),一开始自己不是很懂,在参考官方手册《DS-LM3S1138-11108》之后有所了解,在此分享一下自己的理解过程。
——2012/4/5以下是《中断控制(Interrupt).pdf》中的关于中断优先分组(Interrupt priority grouping)的介绍。
ARM Cortex-M3处理器内核可以配置的中断优先级最多可以有256级。
虽然Stellaris系列ARM只实现了8个中断优先级,但对于一个实际的应用来说已经足够了。
在较为复杂的控制系统中,中断优先级的设置会显得非常重要。
函数IntPrioritySet( )和IntPriorityGet( )用来管理一个片内外设的优先级。
当多个中断源同时产生时,优先级最高的中断首先被处理器响应并得到处理。
正在处理较低优先级中断时,如果有较高优先级的中断产生,则处理器立即转去处理较高优先级的中断。
正在处理的中断不能被同级或较低优先级的中断所打断。
函数IntPriorityGroupingSet( )和IntPriorityGroupingGet( )用来管理抢占式优先级和子优先级的分组设置,参见表1和表2的描述。
重要规则:多个中断源在它们的抢占式优先级相同的情况下,子优先级不论是否相同,如果某个中断已经在服务当中,则其它中断源都不能打断它(可以末尾连锁);只有抢占式优先级高的中断才可以打断其它抢占式优先级低的中断。
由于Stellaris系列ARM只实现了3个优先级位,因此实际有效的抢占式优先级位数只能设为0~3位。
如果抢占式优先级位数为3,则子优先级都是0,实际上可嵌套的中断层数是8层;如果抢占式优先级位数为2,则子优先级为0~1级,实际可嵌套的层数为4层;依次类推,当抢占式优先级位数为0时,实际可嵌套的层数为1层,即不允许中断嵌套。
Cortex-M3学习小结ppt课件
4
ARM 各种架构版本
5
CM3芯片
6
CM3内核
9
堆栈指针R13
• 主堆栈指针(MSP),或写作SP_main。 这是缺省的堆栈指针,它由OS内核、异常 服务例程以及所有需要特权访问的应用程 序代码来使用。
• 进程堆栈指针(PSP),或写SP_process。 用于常规的应用程序代码(不处于异常服 用例程中时)。
突破性的32位硬件除法指令,如下所示:
SDIV.W Rd, Rn, Rm
UDIV.W Rd, Rn, Rm
运算结果是 Rd= Rn/Rm,余数被丢弃。例如:
LDR
r0,
=300
MOV
R1,
#7
UDIV.W R2,
R0, R1
则R2= 300/7 =44
为了捕捉被零除的非法操作,你可以在NVIC的配置控制寄存器中置位 DIVBYZERO位。这样,如果出现了被零除的情况,将会引发一个用法 fault 异常。如果没有任何措施,Rd将在除数为零时被清零。
在CM3中,非对齐的数据传送只发生在常规的数据传送指令中,如 LDR/LDRH/LDRSH。其它指令则不支持,包括:
多个数据的加载/存储(LDM/STM) 堆栈操作PUSH/POP 互斥访问(LDREX/STREX)。如果非对齐会导致一个用法fault 位带操作。因为只有LSB有效,非对齐的访问会导致不可预料的结果。
Cortex-M3 学习小结 2012.11
2
内容
• Cortex-M3 • 汇编指令集 • AMBA总线AHB & APB • 流水线技术 • 异常和中断 • 与ARM7的比较
3
内容
• Cortex-M3 • 汇编指令集 • AMBA总线AHB & APB • 流水线技术 • 异常和中断 • 与ARM7的比较
ARMCortexM3指令集
ARMCortexM3指令集⼀、跳转指令跳转指令⽤于实现程序流程的跳转,在ARM 程序中有两种⽅法可以实现程序流程的跳转:Ⅰ.使⽤专门的跳转指令。
Ⅱ.直接向程序计数器PC 写⼊跳转地址值。
通过向程序计数器PC 写⼊跳转地址值,可以实现在4GB 的地址空间中的任意跳转,在跳转之前结合使⽤ MOV LR,PC 等类似指令,可以保存将来的返回地址值,从⽽实现在4GB 连续的线性地址空间的⼦程序调⽤。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4 条指令:1、 B 指令B 指令的格式为:B{条件} ⽬标地址B 指令是最简单的跳转指令。
⼀旦遇到⼀个 B 指令,ARM 处理器将⽴即跳转到给定的⽬标地址,从那⾥继续执⾏。
注意存储在跳转指令中的实际值是相对当前PC 值的⼀个偏移量,⽽不是⼀个绝对地址,它的值由汇编器来计算(参考寻址⽅式中的相对寻址)。
它是 24 位有符号数,左移两位后有符号扩展为 32 位,表⽰的有效偏移为 26 位(前后32MB 的地址空间)。
以下指令:B Label ;程序⽆条件跳转到标号Label 处执⾏CMP R1,#0 ;当CPSR 寄存器中的Z 条件码置位时,程序跳转到标号Label 处执⾏BEQ Label2、 BL 指令BL 指令的格式为:BL{条件} ⽬标地址BL 是另⼀个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执⾏。
该指令是实现⼦程序调⽤的⼀个基本但常⽤的⼿段。
以下指令:BL Label ;当程序⽆条件跳转到标号Label 处执⾏时,同时将当前的PC 值保存到R14 中3、 BLX 指令BLX 指令的格式为:BLX ⽬标地址BLX 指令从ARM 指令集跳转到指令中所指定的⽬标地址,并将处理器的⼯作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM Cortex-M3 学习笔记(4-5)
最近在学ARMCortex-M3, 找了本号称很经典的书An Definitive Guide to The ARM Cortex-M3 在看。
这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。
Barrier 指令DMB, DSB, ISB
这三个指令的区别如下表所示。
指令名
功能描述
DMB
数据存储器隔离。
DMB 指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交(commit)在它后面的存储器访问操作。
DSB
数据同步隔离。
比DMB 严格:仅当所有在它前面的存储器访问操作都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访问操作译者注)
ISB
指令同步隔离。
最严格:它会清洗流水线,以保证所有它前面的指令都执行
完毕之后,才执行它后面的指令。
其他一些有用的指令Cortex-M3 中支持的指令很多。
这里不可能全都介绍到。
下面就再提几个我认为比较有特色的指令来介绍。
REV, REVH,REV16 以及REVSH
REV 反转32 位整数中的字节序,REVH 则以半字为单位反转,且只反转低
半字。
REVSH 在REVH 的基础上,还把转换后的半字做带符号扩展。