初稿第2章Cortex-M3权威指南16IRQ#0可编程外中断#017IRQ#1可编程外中断#1.....255IRQ#2395可编程外中断#239虽然CM3是支持240个外中断的,但具体使用了多少个是由芯片生产商决定。CM3还有一个NMI(不可屏蔽中断)输入脚。当它被置为有效(assert)时,NMI服务例程会无条件地执行。调试支持Cortex-M3在内核水平上搭载了若干种调试相关的特性。最主要的就是程序执行控制,包括停机(halting)、单步执行(stepping)、指令断点、数据观察点、寄存器和存储器访问、性能速写(profiling)以及各种跟踪机制。Cortex-M3的调试系统基于ARM最新的CoreSight架构。不同于以往的ARM处理器,内核本身不再含有JTAG接口。取而代之的,是CPU提供称为“调试访问接口(DAP)”的总线接口。通过这个总线接口,可以访问芯片的寄存器,也可以访问系统存储器,甚至是在内核运行的时候访问!对此总线接口的使用,是由一个调试端口(DP)设备完成的。DPs不属于CM3内核,但它们是在芯片的内部实现的。目前可用的DPs包括SWJ-DP既支持传统的JTAG调试,也支持新的串行线调试协议),另一个SW-DP则去掉了对JTAG的支持。另外,也可以使用ARMCoreSignt产品家族的JTAG-DP模块。这下就有3个DPs可以选了,芯片制造商可以从中选择一个,以提供具体的调试接口(通常都是选SWJ-DP)。此外,CM3还能挂载一个所谓的“嵌入式跟踪宏单元(ETM)”。ETM可以不断地发出跟踪信息,这些信息通过一个被称为“跟踪端口接口单元(TPIU)”的模块而送到内核的外部,再在芯片外面使用一个“跟踪信息分析仪”,就可以把TIPU输出的“已执行指令信息”捕捉到,并且送给调试主机一也就是PC。在Cortex-M3中,调试动作能由一系列的事件触发,包括断点,数据观察点,fault条件,或者是外部调试请求输入的信号。当调试事件发生时,Cortex-M3可能会停机,也可能进入调试监视器异常handler。具体如何反应,则根据与调试相关寄存器的配置。与调试相关的还有其它的绝活。现在要介绍的是“指令追踪宏单元(ITM)”,它也有自己的办法把数据送往调试器。通过把数据写到ITM的寄存器中,调试器能够通过跟踪接口来收集这些数据并且显示或者处理它。此法不但容易使用,而且比JTAG的输出速度更快。所有这些调试组件都可以由DAP总线接口来控制,CM3内核提供DAP接口。此外,运行中的程序也能控制它们。所有的跟踪信息都能通过TPIU来访问到。Cortex-M3的品性简评讲了这么多,究竞是拥有了什么,使Cortex-M3成为如此有突破性的新生代处理器?Cortex-M3到底在哪里先进了?本节就给出一个小小的简评。高性能。许多指令都是单周期的一一包括乘法相关指令。并且从整体性能上,Cortex-M3比得过绝大多数其它的架构。·指令总线和数据总线被分开,取值和访内可以并行不Thumb-2的到来告别了状态切换的旧世代,再也不需要花时间来切换于32位ARM状态和?16位Thumb状态之间了。这简化了软件开发和代码维护,使产品面市更快。34
Cortex‐M3 权威指南 初稿 第 2 章 16 IRQ #0 可编程 外中断#0 17 IRQ #1 可编程 外中断#1 . . . . 255 IRQ #239 可编程 外中断#239 虽然 CM3 是支持 240 个外中断的,但具体使用了多少个是由芯片生产商决定。CM3 还有一个 NMI(不可屏蔽中断)输入脚。当它被置为有效(assert)时,NMI 服务例程会无条件地执行。 调试支持 Cortex‐M3 在内核水平上搭载了若干种调试相关的特性。最主要的就是程序执行控制,包括停 机(halting)、单步执行(stepping)、指令断点、数据观察点、寄存器和存储器访问、性能速写(profiling) 以及各种跟踪机制。 Cortex‐M3 的调试系统基于 ARM 最新的 CoreSight 架构。不同于以往的 ARM 处理器,内核本身 不再含有 JTAG 接口。取而代之的,是 CPU 提供称为“调试访问接口(DAP)”的总线接口。通过这个 总线接口,可以访问芯片的寄存器,也可以访问系统存储器,甚至是在内核运行的时候访问!对此 总线接口的使用,是由一个调试端口(DP)设备完成的。DPs 不属于 CM3 内核,但它们是在芯片的内 部实现的。目前可用的 DPs 包括 SWJ‐DP(既支持传统的 JTAG 调试,也支持新的串行线调试协议),另 一个 SW‐DP 则去掉了对 JTAG 的支持。另外,也可以使用 ARM CoreSignt 产品家族的 JTAG‐DP 模块。 这下就有 3 个 DPs 可以选了,芯片制造商可以从中选择一个,以提供具体的调试接口(通常都是选 SWJ‐DP)。 此外,CM3 还能挂载一个所谓的“嵌入式跟踪宏单元(ETM)”。ETM 可以不断地发出跟踪信息, 这些信息通过一个被称为“跟踪端口接口单元(TPIU)”的模块而送到内核的外部,再在芯片外面使 用一个“跟踪信息分析仪”,就可以把 TIPU 输出的“已执行指令信息”捕捉到,并且送给调试主机 ——也就是 PC。 在 Cortex‐M3 中,调试动作能由一系列的事件触发,包括断点,数据观察点,fault 条件,或者 是外部调试请求输入的信号。当调试事件发生时,Cortex‐M3 可能会停机,也可能进入调试监视器 异常 handler。具体如何反应,则根据与调试相关寄存器的配置。 与调试相关的还有其它的绝活。现在要介绍的是“指令追踪宏单元(ITM)”,它也有自己的办 法把数据送往调试器。通过把数据写到 ITM 的寄存器中,调试器能够通过跟踪接口来收集这些数据, 并且显示或者处理它。此法不但容易使用,而且比 JTAG 的输出速度更快。 所有这些调试组件都可以由 DAP 总线接口来控制,CM3 内核提供 DAP 接口。此外,运行中的 程序也能控制它们。所有的跟踪信息都能通过 TPIU 来访问到。 Cortex-M3 的品性简评 讲了这么多,究竟是拥有了什么,使 Cortex‐M3 成为如此有突破性的新生代处理器?Cortex‐M3 到底在哪里先进了?本节就给出一个小小的简评。 高性能 z 许多指令都是单周期的——包括乘法相关指令。并且从整体性能上,Cortex‐M3 比得过绝 大多数其它的架构。 z 指令总线和数据总线被分开,取值和访内可以并行不悖 z Thumb‐2 的到来告别了状态切换的旧世代,再也不需要花时间来切换于 32 位 ARM 状态和 16 位 Thumb 状态之间了。这简化了软件开发和代码维护,使产品面市更快。 34
初稿第2章Cortex-M3权威指南Thumb-2指令集为编程带来了更多的灵活性。许多数据操作现在能用更短的代码搞定,这?意味着Cortex-M3的代码密度更高,也就对存储器的需求更少。·取指都按32位处理。同一周期最多可以取出两条指令,留下了更多的带宽给数据传输。·Cortex-M3的设计允许单片机高频运行(现代半导体制造技术能保证100MHz以上的速度)即使在相同的速度下运行,CM3的每指令周期数(CPI)也更低,于是同样的MHz下可以做更多的工作:另一方面,也使同一个应用在CM3上需要更低的主频。先进的中断处理功能内建的嵌套向量中断控制器支持多达240条外部中断输入。向量化的中断功能剧烈地缩短·了中断延退,因为不再需要软件去判断中断源。中断的嵌套也是在硬件水平上实现的,不需要软件代码来实现。·Cortex-M3在进入异常服务例程时,自动压栈了RO-R3,R12,LR,PSR和PC,并且在返回时自动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语言代码了(第8章有详述)。NVIC支持对每一路中断设置不同的优先级,使得中断管理极富弹性。最粗线条的实现也至·少要支持8级优先级,而且还能动态地被修改。·优化中断响应还有两招,它们分别是“咬尾中断机制”和“晚到中断机制”?有些需要较多周期才能执行完的指令,是可以被中断一继续的一一就好比它们是一串指令一样。这些指令包括加载多个寄存器(LDM),存储多个寄存器(STM),多个寄存器参与的PUSH,以及多个寄存器参与的POP。·除非系统被彻底地锁定,NMI(不可屏蔽中断)会在收到请求的第一时间予以响应。对于很多安全-关键(safety-critical)的应用,NMI都是必不可少的(如化学反应即将失控时的紧急停机)。低功耗Cortex-M3需要的逻辑门数少,所以先天就适合低功耗要求的应用(功率低于0.19mW/MHz)在内核水平上支持节能模式(SLEEPING和SLEEPDEEP位)。通过使用“等待中断指令(WFI)”·和“等待事件指令(WFE)”,内核可以进入睡眠模式,并且以不同的方式唤醒。另外,模块的时钟是尽可能地分开供应的,所以在睡眠时可以把CM3的大多数“官能团”给停掉。CM3的设计是全静态的、同步的、可综合的。任何低功耗的或是标准的半导体工艺均可放心饮·用。系统特性。系统支持“位寻址带”操作(8051位寻址机制的“威力大幅加强版”),字节不变的大端模式并且支持非对齐的数据访问。拥有先进的fault处理机制,支持多种类型的异常和faults,使故障诊断更容易。··通过引入banked堆栈指针机制,把系统程序使用的堆栈和用户程序使用的堆栈划清界线。如果再配上可选的MPU,处理器就能彻底满足对软件健壮性和可靠性有严格要求的应用。调试支持?在支持传统的JTAG基础上,还支持更新更好的串行线调试接口。基于CoreSight调试解决方案,使得处理器哪怕是在运行时,也能访问处理器状态和存储器内容。·内建了对多达6个断点和4个数据观察点的支持。35
Cortex‐M3 权威指南 初稿 第 2 章 z Thumb‐2 指令集为编程带来了更多的灵活性。许多数据操作现在能用更短的代码搞定,这 意味着 Cortex‐M3 的代码密度更高,也就对存储器的需求更少。 z 取指都按 32 位处理。同一周期最多可以取出两条指令,留下了更多的带宽给数据传输。 z Cortex‐M3 的设计允许单片机高频运行(现代半导体制造技术能保证 100MHz 以上的速度)。 即使在相同的速度下运行,CM3 的每指令周期数(CPI)也更低,于是同样的 MHz 下可以做更 多的工作;另一方面,也使同一个应用在 CM3 上需要更低的主频。 先进的中断处理功能 z 内建的嵌套向量中断控制器支持多达 240 条外部中断输入。向量化的中断功能剧烈地缩短 了中断延迟,因为不再需要软件去判断中断源。中断的嵌套也是在硬件水平上实现的,不 需要软件代码来实现。 z Cortex‐M3 在进入异常服务例程时,自动压栈了 R0‐R3, R12, LR, PSR 和 PC,并且在返回时自 动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语言代码了(第 8 章有详 述)。 z NVIC 支持对每一路中断设置不同的优先级,使得中断管理极富弹性。最粗线条的实现也至 少要支持 8 级优先级,而且还能动态地被修改。 z 优化中断响应还有两招,它们分别是“咬尾中断机制”和“晚到中断机制”。 z 有些需要较多周期才能执行完的指令,是可以被中断-继续的——就好比它们是一串指令 一样。这些指令包括加载多个寄存器(LDM),存储多个寄存器(STM),多个寄存器参与 的 PUSH,以及多个寄存器参与的 POP。 z 除非系统被彻底地锁定,NMI(不可屏蔽中断)会在收到请求的第一时间予以响应。对于 很多安全‐关键(safety‐critical)的应用,NMI 都是必不可少的(如化学反应即将失控时的紧急 停机)。 低功耗 z Cortex‐M3 需要的逻辑门数少,所以先天就适合低功耗要求的应用(功率低于 0.19mW/MHz) z 在内核水平上支持节能模式(SLEEPING 和 SLEEPDEEP 位)。通过使用“等待中断指令(WFI)” 和“等待事件指令(WFE)”,内核可以进入睡眠模式,并且以不同的方式唤醒。另外,模块的 时钟是尽可能地分开供应的,所以在睡眠时可以把 CM3 的大多数“官能团”给停掉。 z CM3 的设计是全静态的、同步的、可综合的。任何低功耗的或是标准的半导体工艺均可放心饮 用。 系统特性 z 系统支持“位寻址带”操作(8051 位寻址机制的“威力大幅加强版”),字节不变的大端模式, 并且支持非对齐的数据访问。 z 拥有先进的 fault 处理机制,支持多种类型的异常和 faults,使故障诊断更容易。 z 通过引入 banked 堆栈指针机制,把系统程序使用的堆栈和用户程序使用的堆栈划清界线。如果 再配上可选的 MPU,处理器就能彻底满足对软件健壮性和可靠性有严格要求的应用。 调试支持 z 在支持传统的 JTAG 基础上,还支持更新更好的串行线调试接口。 z 基于 CoreSight 调试解决方案,使得处理器哪怕是在运行时,也能访问处理器状态和存储器内容。 z 内建了对多达 6 个断点和 4 个数据观察点的支持。 35
初稿第2章Cortex-M3权威指南?可以选配一个ETM,用于指令跟踪。数据的跟踪可以使用DWT在调试方面还加入了以下的新特性,包括fault状态寄存器,新的fault异常,以及闪存修补(patch)操作,使得调试大幅简化。O可选ITM模块,测试代码可以通过它输出调试信息,而且“拎包即可入住”般地方便使用。36
Cortex‐M3 权威指南 初稿 第 2 章 36 z 可以选配一个 ETM,用于指令跟踪。数据的跟踪可以使用 DWT z 在调试方面还加入了以下的新特性,包括fault状态寄存器,新的fault异常,以及闪存修补(patch) 操作,使得调试大幅简化。 z 可选 ITM 模块,测试代码可以通过它输出调试信息,而且“拎包即可入住”般地方便使用
初稿第3章Cortex-M3权威指南第3章Cortex-M3基础?寄存器组?特殊功能寄存器组操作模式O异常和中断?向量表9?存储器保护单元?堆栈区的操作?复位序列寄存器组如我们所见,CM3拥有通用寄存器RO-R15以及一些特殊功能寄存器。RO-R12是最“通用目的”的,但是绝大多数的16位指令只能使用RO-R7(低组寄存器),而32位的Thumb-2指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。通用目的寄存器RO-R7RO-R7也被称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不可预料的。通用目的寄存器R8-R12R8-R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们,32位的指令则不受限制。它们也是32位字长,且复位后的初始值是不可预料的。37
Cortex‐M3 权威指南 初稿 第 3 章 第3章 Cortex-M3基础 z 寄存器组 z 特殊功能寄存器组 z 操作模式 z 异常和中断 z 向量表 z 存储器保护单元 z 堆栈区的操作 z 复位序列 寄存器组 如我们所见,CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。R0‐R12 是最“通 用目的”的,但是绝大多数的 16 位指令只能使用 R0‐R7(低组寄存器),而 32 位的 Thumb‐2 指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指 令来访问。 通用目的寄存器 R0-R7 R0‐R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后 的初始值是不可预料的。 通用目的寄存器 R8-R12 R8‐R12 也被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们,32 位的指令则不受限制。它们也是 32 位字长,且复位后的初始值是不可预料的。 37
初稿第3章Cortex-M3权威指南RO通用寄存器通用寄存器R1R2通用寄存器R3通用寄存器LowRegistersR4通用寄存器R5通用寄存器R6通用寄存器R7通用寄存器R8通用寄存器R9通用寄存器R10HighRegisters通用寄存器R11通用寄存器R12通用寄存器R13(MSP)R13(PSP)主堆栈指针(MSP),进程堆栈指针(PSP)R14连接寄存器(LR)R15程序计数器(PC)特殊功能寄存器:XPSR状态字寄存器s(三合一)PRIMASK特殊功能中断屏蔽FAULTMASK寄存器s寄存器sBASEPRICONTROL控制寄存器图3.1Cortex-M3的寄存器组堆栈指针R13R13是堆栈指针。在CM3处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写作SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR指令)。这两个堆栈指针分别是:主堆栈指针(MSP)或写作SPmain。这是缺省的堆栈指针,它由OS内核、异常服务.例程以及所有需要特权访问的应用程序代码来使用。进程堆栈指针(PSP),或写作SP_procesS。用于常规的应用程序代码(不处于异常服用例程中时)。要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用MSP就够了。堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。38
Cortex‐M3 权威指南 初稿 第 3 章 特殊功能寄存器: 图 3.1 Cortex‐M3 的寄存器组 堆栈指针 R13 R13 是堆栈指针。在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。 当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指 令来访问(MRS,MSR 指令)。这两个堆栈指针分别是: z 主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务 例程以及所有需要特权访问的应用程序代码来使用。 z 进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服 用例程中时)。 要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用 MSP 就够了。堆栈指针用于访问堆栈,并且 PUSH 指令和 POP 指令默认使用 SP。 38