Cortex-M3芯片简介
1
、关于ARMv7
的知识了解
在这个版本中,内核架构首次从单一款式变成3
种款式。
款式A
:设计用于高性能的
“
开放应用平台
”——
越来越接近电脑了 。
款式R
:用于高端的嵌入式系统,尤其是那些带有实时要求的
——
又要快又要实时。
介绍A:
用于高性能的
“
开放应用平台
”
,应用在那些需要运行复杂应用程序的处理器。支持大型嵌入式操作系统。
R:用于高端的嵌入式系统,要求实时性的。
M:用于深度嵌入的、单片机风格的系统中。
2
、Cortex-M3
处理器的舞台
高性能+
高代码密度
+
小硅片面积,使得
CM3
大面积地成为理想的处理平台,主要应用在以下领域:
(1
)低成本单片机
(4
)工业控制
(5
)消费类电子产品
3
、Cortex-M3
概览
(1
)简介
Cortex-M3
是一个 32
位处理器内核。内部的数据路径是
32
位的,寄存器是
32
位的,存储器接口也是
32
位的。
CM3
采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性,
CM3
内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)
比较复杂的应用可能需要更多的存储系统功能,为此CM3
提供一个可选的
MPU
,而且在需要的情况下也可以使用外部的
cache
。另外在
CM3
中,
Both
小端模式和大端模式都是支持的。
(2
)寄存器组
处理器拥有R0-R15
的寄存器组,其中
R13
最为堆栈指针
SP,SP
有两个,但是同一时刻只能有一个可以看到,这就是所谓的
“banked”
寄存器。
a
、R0-R12
都是
32
位通用寄存器,用于数据操作。但是注意:绝大多数
16
位
Thumb
指令只能访问
R0-R7
,而
32
位
Thumb-2
指令可以访问所有寄存器。
b
、Cortex-M3
拥有两个堆栈指针,然而它们是
banked
,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP
):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP
):由用户的应用程序代码使用。
---
堆栈指针的最低两位永远是0
,这意味着堆栈总是
4
字节对齐的。
---
c
、R14
:连接寄存器
--
当呼叫一个子程序时,由
R14
存储返回地址
d
、R15
:程序计数寄存器
--
指向当前的程序地址,如果修改它的值,就能改变程序的执行流(这里有很多高级技巧)
e
、Cortex-M3
还在内核水平上搭载了若干特殊功能寄存器,包括:
程序状态字寄存器组(PSRs
)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI
)
控制寄存器(CONTROL
)
Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作。
两种操作模式分别为:处理者模式和线程模式(thread mode
)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码
——
包括中断服务例程的代码。
Cortex-M3
的另一个侧面则是特权的分级
——
特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。
在 CM3
运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有
MPU
,还要 在
MPU
规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——
切换到用户级。一旦进入用户级,再想回来就得走
“
法律程序
”
了
——
用户级的程序不能简简单单地试图改写
CONTROL
寄存器就回到特权级,它必须先
“
申诉
”
:执行一条系统调用指令
(SVC)
。这会触发
SVC
异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改
CONTROL
寄存器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态。
通过引入特权级和用户级,就能够在硬件水平上限制某些不受信任的或者还没有调试好的程序,不让它们随便地配置涉及要害的寄存器,因而系统的可靠性得到了提高。进一步地,如果配了 MPU
,它还可以作为特权机制的补充
——
保护关键的存储区域不被破坏,这些区域通常是操作系统的区域。
(4)内建的嵌套向量中断控制器
Cortex-M3
在内核水平上搭载了一颗中断控制器——
嵌套向量中断控制器
NVIC(Nested Vectored InterruptController)
。它与内核有很深的
“
亲密接触
”——
与内核是紧耦合的。
NVIC提供如下的功能:
可嵌套中断支持
向量中断支持
动态优先级调整支持
中断延迟大大缩短
中断可屏蔽
可嵌套中断支持:
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在
xPSR
的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常
——
即立即抢占。
向量中断支持:
当开始响应一个中断后,
CM3
会自动定位一张向量表,并且根据中断号从表中找出
ISR
的入口地址,然后跳转过去执行。不需要像以前的
ARM
那样,由软件来分辨到底是哪个中断发生了,也无需半导体厂商提供私有的中断控制器来完成这种工作。这么一来,中断延迟时间大为缩短。
(5
)总线接口
Cortex-M3
内部有若干个总线接口,以使CM3
能同时取址和访内(访问内存),它们是:
指令存储区总线(两条)
系统总线
私有外设总线
有两条代码存储区总线负责对代码存储区的访问,分别是 I-Code
总线和
D-Code
总线。前者用于取指,后者用于查表等操作,它们按最佳执行速度进行优化。
系统总线用于访问内存和外设,覆盖的区域包括 SRAM
,片上外设,片外
RAM
,片外扩展设备,以及系统级存储区的部分空间。
私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级存储区。
(6
)存储器保护单元(
MPU
)
Cortex-M3
有一个可选的存储器保护单元。配上它之后,就可以对特权级访问和用户级访问分别施加不同的访问限制。当检测到犯规(violated
)时,
MPU
就会产生一个
fault
异常,可以由
fault
异常的服务例程来分析该错误,并且在可能时改正它。
MPU
有很多玩法。最常见的就是由操作系统使用 MPU
,以使特权级代码的数据,包括操作系统本身的数据不被其它用户程序弄坏。
MPU
在保护内存时是按区管理的。它可以把某些内存
region
设置成只读,从而避免了那里的内容意外被更改;还可以在多任务系统中把不同任务之间的数据区隔离。一句话,它会使嵌入式系统变得更加健壮,更加可靠(很多行业标准,尤其是航空的,就规定了必须使用
MPU
来行使保护职能
——
译
注) 。
(7
)
Cortex-M3
的简评
1、高性能
许多指令都是单周期的——
包括乘法相关指令。并且从整体性能上,
Cortex-M3
比得过绝大多数其它的架构。
指令总线和数据总线被分开,取值和访内可以并行不悖 。
Thumb-2
的到来告别了状态切换的旧世代,再也不需要花时间来切换于 32
位
ARM
状态和
16
位
Thumb
状态之间了。这简化了软件开发和代码维护,使产品面市更快。
Thumb-2
指令集为编程带来了更多的灵活性。许多数据操作现在能用更短的代码搞定,这意味着
Cortex-M3
的代码密度更高,也就对存储器的需求更少。
取指都按 32
位处理。同一周期最多可以取出两条指令,留下了更多的带宽给数据传输。
Cortex-M3
的设计允许单片机高频运行(现代半导体制造技术能保证 100MHz
以上的速度)即使在相同的速度下运行,
CM3
的每指令周期数
(CPI)
也更低,于是同样的
MHz
下可以做更多的工作;另一方面,也使同一个应用在
CM3
上需要更低的主频。
2、先进的中断处理功能
内建的嵌套向量中断控制器支持240
条外部中断输入。向量化的中断功能大大减少了中断延迟,因为不在需要软件去判断中断源。中断的嵌套也是在硬件水平上实现的,不需要软件代码来实现。
Cortex-M3
在进入异常服务例程时,自动压栈了 R0-R3, R12, LR, PSR
和
PC
,并且在返回时自动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语言代码了
NVIC
支持对每一路中断设置不同的优先级,使得中断管理极富弹性。最粗线条的实现也至少要支持 8
级优先级,而且还能动态地被修改。
优化中断响应还有两招,它们分别是“
咬尾中断机制
”
和
“
晚到中断机制
”
。
有些需要较多周期才能执行完的指令,是可以被中断-继续的——
就好比它们是一串指令一样。这些指令包括加载多个寄存器(
LDM
),存储多个寄存器(
STM
),多个寄存器参与的
PUSH
,以及多个寄存器参与的
POP
。
除非系统被彻底地锁定,NMI
(不可屏蔽中断)会在收到请求的第一时间予以响应。对很多安全
-
关键
(safety-critical)
的应用,
NMI
都是必不可少的(如化学反应即将失控时的紧急停机)。
通过上面我们可以很容易理解STM32
的一些基本知识和结构,为学习
STM32
打好了基础。
|