Cortex-M3概览
文章目录
Cortex-M3简介
Cortex-M3是ARM公司推出的一款32位处理器内核,广泛应用于嵌入式系统中。它具有高性能、低功耗、易于使用等特点,适用于各种应用场景,如消费电子、工业控制、汽车电子等。
主要特点
- 32位处理器内核:
- 内部数据路径、寄存器和存储器接口均为32位。
- 采用哈佛结构,具有独立的指令总线和数据总线,可以并行取指和数据访问,提升性能。
- 统一的存储器系统:
- 指令总线和数据总线共享同一个存储器空间,可寻址空间为4GB。
- 支持小端模式和大端模式。
- 可选的MPU(存储器保护单元):
- 提供存储系统功能,用于保护存储器区域,防止非法访问。
- 调试支持:
- 内置多种调试组件,如指令断点、数据观察点等。
- 支持高级调试功能,如指令跟踪和多种类型的调试接口(如JTAG、SWD等)。
架构特点
- 哈佛结构:
- 独立的指令总线和数据总线,允许取指和数据访问并行进行,提高性能。
- 数据访问不再占用指令总线,从而提升性能。
- 多总线接口:
- 内部含有多条总线接口,每条总线接口都为特定应用场合优化,可以并行工作。
- 统一的存储器系统:
- 指令总线和数据总线共享同一个存储器空间,可寻址空间为4GB。
- 支持小端模式和大端模式。
- 可选的MPU:
- 提供存储系统功能,用于保护存储器区域,防止非法访问。
- 在需要的情况下,可以使用外部的cache。
- 调试支持:
- 内置多种调试组件,如指令断点、数据观察点等。
- 支持高级调试功能,如指令跟踪和多种类型的调试接口(如JTAG、SWD等)。
Cortex-M3寄存器组
Cortex-M3处理器拥有一组丰富的寄存器,用于支持高效的数据操作和系统控制。以下是Cortex-M3寄存器组的详细介绍:
通用寄存器(R0-R12)
- R0-R12:这些寄存器是32位通用寄存器,用于数据操作。
- R0-R7:低寄存器,大多数16位Thumb指令只能访问这些寄存器。
- R8-R12:高寄存器,32位Thumb-2指令可以访问所有寄存器。
堆栈指针(R13)
- R13:堆栈指针(SP),用于管理堆栈。
- 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)。
- 进程堆栈指针(PSP):由用户的应用程序代码使用。
- Banked R13:Cortex-M3拥有两个堆栈指针,但同一时刻只能使用其中的一个。
- 堆栈对齐:堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
连接寄存器(R14)
- R14:连接寄存器(LR),用于存储子程序的返回地址。
- 子程序调用:当调用一个子程序时,由R14存储返回地址。
- 减少访存次数:ARM为了减少访问内存的次数,把返回地址直接存储在寄存器中,从而提高了子程序调用的效率。
程序计数寄存器(R15)
- R15:程序计数寄存器(PC),指向当前的程序地址。
- 修改执行流:通过修改PC的值,可以改变程序的执行流。
特殊功能寄存器
Cortex-M3内核还搭载了若干特殊功能寄存器,用于系统控制和状态管理。
- 程序状态字寄存器组(PSRs):
- 记录ALU标志:包括零标志(Z)、进位标志(C)、负数标志(N)、溢出标志(V)。
- 执行状态:记录当前的执行状态。
- 当前正服务的中断号:记录当前正在处理的中断号。
- 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI):
- PRIMASK:除能所有中断,但不可屏蔽中断(NMI)不受影响。
- FAULTMASK:除能所有fault,NMI不受影响,被除能的faults会“上访”。
- BASEPRI:除能所有优先级不高于某个具体数值的中断。
- 控制寄存器(CONTROL):
- 定义特权状态:决定当前的特权级别。
- 决定使用哪一个堆栈指针:选择使用MSP还是PSP。
寄存器功能总结
寄存器 | 功能 |
---|---|
xPSR | 记录ALU标志(Z, C, N, V),执行状态,当前正服务的中断号 |
PRIMASK | 除能所有中断,NMI不受影响 |
FAULTMASK | 除能所有fault,NMI不受影响,被除能的faults会“上访” |
BASEPRI | 除能所有优先级不高于某个具体数值的中断 |
CONTROL | 定义特权状态,决定使用哪一个堆栈指针 |
操作模式和特权级别
Cortex-M3处理器支持两种操作模式和两级特权操作,以提供灵活的系统控制和安全性。
操作模式
Cortex-M3处理器支持两种操作模式:
- 处理者模式(Handler Mode):
- 用于执行异常服务例程(包括中断服务例程)。
- 异常服务例程必须在特权级下执行。
- 线程模式(Thread Mode):
- 用于执行主应用程序代码。
- 线程模式下既可以使用特权级,也可以使用用户级。
特权级别
Cortex-M3处理器支持两级特权操作:
- 特权级(Privileged):
- 具有完全的系统访问权限,可以访问所有范围的存储器,并执行所有指令。
- 在特权级下,程序可以为所欲为,但也可能会切换到用户级。
- 用户级(User):
- 具有有限的系统访问权限,不能访问某些资源。
- 用户级的程序不能直接修改CONTROL寄存器以回到特权级,必须通过系统调用(SVC)触发异常,由异常服务例程批准后才能重新进入特权级。
操作模式和特权级别的转换
- 复位后:
- 处理器默认进入线程模式,特权级访问。
- 从用户级到特权级的转换:
- 唯一途径是通过异常。当触发异常时,处理器总是先切换到特权级,并在异常服务例程执行完毕后返回先前的状态。
- 合法的操作模式转换:
- 线程模式(特权级) ↔ 处理者模式(特权级)
- 线程模式(用户级) ↔ 处理者模式(特权级)
特权机制的作用
- 提高系统可靠性:
- 通过特权级和用户级的划分,限制不受信任或未调试好的程序访问关键资源,防止系统受损。
- MPU的补充:
- 如果配置了MPU(存储器保护单元),可以进一步保护关键的存储区域不被破坏,这些区域通常是操作系统的区域。
- 操作系统内核:
- 操作系统内核通常在特权级下执行,可以访问所有未被MPU禁掉的存储器。
- 用户程序:
- 用户程序通常在用户级下执行,防止因程序崩溃或恶意破坏导致系统受损。
内建的嵌套向量中断控制器(NVIC)
Cortex-M3内核搭载了一个嵌套向量中断控制器(NVIC),用于管理中断和异常。NVIC与内核紧密耦合,提供了多种功能,包括可嵌套中断支持、向量中断支持、动态优先级调整支持、中断延迟缩短和中断屏蔽。
可嵌套中断支持
- 作用范围:覆盖所有的外部中断和绝大多数系统异常。
- 优先级管理:每个异常都可以被赋予不同的优先级。当前优先级存储在xPSR的专用字段中。
- 抢占机制:当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果新异常的优先级更高,处理器会中断当前的中断服务例程(ISR),并服务新异常,实现立即抢占。
向量中断支持
- 自动定位向量表:当开始响应一个中断时,Cortex-M3会自动定位向量表,并根据中断号从表中找出ISR的入口地址,然后跳转过去执行。
- 减少中断延迟:无需软件分辨中断类型,减少了中断延迟时间。
动态优先级调整支持
- 运行时调整优先级:软件可以在运行时期更改中断的优先级。
- 避免重入风险:如果在某ISR中修改了自己所对应中断的优先级,且该中断有新的实例处于悬起状态(pending),也不会自己打断自己,从而避免了重入风险。
中断延迟大大缩短
- 自动现场保护和恢复:Cortex-M3引入了自动的现场保护和恢复机制,缩短了中断嵌套时的ISR间延迟。
- 咬尾中断和晚到中断:通过引入咬尾中断(Tail-Chaining)和晚到中断(Late-Arriving)等新特性,进一步缩短了中断延迟。
中断可屏蔽
- 优先级屏蔽:可以通过设置BASEPRI寄存器,屏蔽优先级低于某个阈值的中断/异常。
- 全体封杀:可以通过设置PRIMASK和FAULTMASK寄存器,全体封杀中断。
- 时间关键任务:这些屏蔽机制可以让时间关键(time-critical)的任务在死线(deadline)到来前完成,而不被干扰。
存储器映射
Cortex-M3处理器支持4GB的存储空间,并将其划分为若干区域,以支持不同的功能和外设。以下是Cortex-M3存储器映射的详细介绍:
总体存储器映射
Cortex-M3支持4GB的存储空间,如图所示,被划分为若干区域。这些区域包括:
- 代码区:用于存储程序代码和常量数据。
- 数据区:用于存储全局变量和堆栈数据。
- 外设区:用于访问片上外设的寄存器。
- 系统级存储区:用于存储系统级组件,如中断控制器、MPU和调试组件。
存储器映射的特点
- 预定义的映射关系:Cortex-M3预先定义了存储器映射,使得片上外设的寄存器可以简单地以访问内存的方式来访问,从而控制外设的工作。
- C语言操作:这种预定义的映射关系使得片上外设可以使用C语言来操作,简化了编程和调试。
- 优化访问速度:通过预定义的映射关系,可以对访问速度进行高度的优化,提高系统性能。
- 易于集成:预定义的映射关系使得片上系统的设计更易于集成,减少了移植工作量。
总线基础设施
Cortex-M3内部拥有一个总线基础设施,专用于优化对存储器结构的使用。这个基础设施允许在不同区域之间进行“越权使用”,例如:
- 数据存储器放在代码区:数据存储器可以放在代码区,提高访问速度。
- 代码在外部RAM区执行:代码可以在外部RAM区中执行,但会变慢。
系统级存储区
系统级存储区位于最高地址,用于存储系统级组件,包括:
- 中断控制器:管理中断和异常。
- MPU(存储器保护单元):提供存储器保护功能。
- 调试组件:支持调试和跟踪功能。
固定地址
系统级组件使用固定的地址,这在内核水平上为应用程序的移植扫清了障碍。通过固定地址,可以确保不同平台上的应用程序具有一致的访问方式,提高了系统的可移植性。
总线接口
Cortex-M3处理器内部有若干个总线接口,以支持同时取址和访内(访问内存)。这些总线接口包括:
- 指令存储区总线(两条):
- I-Code总线:用于取指操作,优化指令执行速度。
- D-Code总线:用于查表等操作,优化数据访问速度。
- 系统总线:
- 用于访问内存和外设,覆盖的区域包括SRAM、片上外设、片外RAM、片外扩展设备以及系统级存储区的部分空间。
- 私有外设总线:
- 负责访问一部分私有外设,主要用于访问调试组件,这些组件位于系统级存储区。
存储器保护单元(MPU)
Cortex-M3内核有一个可选的存储器保护单元(MPU),用于对特权级访问和用户级访问分别施加不同的访问限制。MPU的主要功能包括:
- 访问限制:检测到犯规(violated)时,MPU会产生一个fault异常,可以由fault异常的服务例程来分析和改正错误。
- 内存保护:MPU按区管理内存,可以设置某些内存区域为只读,避免数据被意外更改。
- 多任务隔离:在多任务系统中,MPU可以将不同任务的数据区隔离,提高系统的健壮性和可靠性。
指令集
Cortex-M3只使用Thumb-2指令集,这是一个突破性的进展,因为它允许32位指令和16位指令混合使用,兼顾了代码密度和处理性能。Thumb-2指令集的特点包括:
- 统一操作模式:在单一的操作模式下处理所有指令,无需在ARM状态和Thumb状态之间切换。
- 性能优化:32位指令提供高性能,16位指令提供高代码密度。
- 易于使用:简化了软件开发和管理,无需再反复求证和测试何时何地切换状态。
一些有趣的指令
- UBFX,BFI,BFC:位段提取、位段插入、位段清零,支持C位段,简化了外设寄存器操作。
- CLZ,RBIT:计算前导零指令和位反转指令,组合使用能实现一些特技。
- UDIV,SDIV:无符号除法和带符号除法指令。
- SEV,WFE,WFI:发送事件、等待事件以及等待中断指令,用于实现多处理器之间的任务同步,还可以进入不同的休眠模式。
- MSR, MRS:访问特殊功能寄存器。
中断和异常
ARMv7-M架构引入了全新的异常模型,Cortex-M3(CM3)采用了这一模型。这种异常模型与传统ARM处理器的异常模型完全不同,支持16-4-1=11种系统异常和240个外部中断输入。CM3取消了FIQ(快中断请求),引入了中断优先级管理和嵌套中断支持,这些功能由NVIC(嵌套向量中断控制器)实现。NVIC还支持11个内部异常源,用于fault管理。CM3共有256个预定义的异常类型。
表2.2 Cortex-M3异常类型
编号 | 类型 | 优先级 | 简介 |
---|---|---|---|
0 | N/A | N/A | 没有异常在运行 |
1 | 复位 | -3(最高) | 复位 |
2 | NMI | -2 | 不可屏蔽中断 |
3 | 硬(hard) fault | -1 | 所有被除能的fault,都将“上访”成硬fault |
4 | MemManage fault | 可编程 | 存储器管理fault |
5 | 总线 fault | 可编程 | 总线错误 |
6 | 用法(usage) Fault | 可编程 | 由于程序错误导致的异常 |
7-10 | 保留 | N/A | N/A |
11 | SVCall | 可编程 | 系统服务调用 |
12 | 调试监视器 | 可编程 | 调试监视器 |
13 | 保留 | N/A | N/A |
14 | PendSV | 可编程 | 可悬挂请求 |
15 | SysTick | 可编程 | 系统滴答定时器 |
16 | IRQ #0 | 可编程 | 外中断#0 |
17 | IRQ #1 | 可编程 | 外中断#1 |
… | … | … | … |
255 | IRQ #239 | 可编程 | 外中断#239 |
CM3支持240个外中断,具体数量由芯片生产商决定。CM3还有一个NMI输入脚,用于不可屏蔽中断。
调试支持
Cortex-M3在内核水平上搭载了多种调试特性,包括程序执行控制、指令断点、数据观察点、寄存器和存储器访问、性能速写和跟踪机制。调试系统基于ARM的CoreSight架构,内核提供DAP(调试访问接口)总线接口,用于访问芯片寄存器和系统存储器。
调试端口(DP)设备
类型 | 支持协议 |
---|---|
SWJ-DP | JTAG, 串行线调试协议 |
SW-DP | 仅串行线调试协议 |
调试动作可由断点、数据观察点、fault条件或外部调试请求触发。所有调试组件由DAP总线接口控制,运行中的程序也能控制这些组件。