再上一篇:第17章
上一篇:17.2 Cortex-M3 修订版0 与修订版 1 的区别
主页
下一篇:17.4 开发工具
再下一篇:第18章
文章列表

17.3 Cortex-M3 修订版1 与修订版 2 的区别

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

在 2008 年中期,Cortex-M3 的修订版 2 发布了。估计到 2008 年底,在市场上就能见到基于 修订版 2的芯片了。修订版 2新增了很多特性,它们大多数都致力于降低功耗以及提高调试的灵活 性。
在修订版 2中,程序员模式也跟着有以下的更新。

17.3.1 双字堆栈对齐方式成为缺省值

影响异常入栈顺序和内存使用的双字堆栈对齐方式,在修订版2中成为缺省使用的方式(注意: 芯片厂商可能会选择使用修订版 1 的方式)。使用此方式,会给大多数 C 程序减少启动代码的额外 开销(无需再在 NVIC配置控制寄存器中置位 STKALIGN比特)。

17.3.2 新增辅助控制寄存器(Auxiliary Control Register)

为了更细腻地调校处理器的行为方式,新增了辅助控制寄存器。比如,为了调试方便,通过设 置此寄存器,可以关闭 Cortex-M3的写缓冲,从而使总线 faults总是能与存储器访问指令同步—
—也就是说使总线 faults 总是精确的。这样,就可以每次都能从入栈的返回地址中精确地揪出肇 事指令了。
辅助控制寄存器的细节如下表所示: 辅助控制寄存器(0xE000_E008)

比特号

字段名

类型

初值

功能描述

2 DISFOLD R/W 0 除能 IT折叠(folding),使 IT指令

与下一条指令(在流水线中)的执行 级(execution phase)不会交迭

1

DISDEFWBUF

R/W

0

在缺省的存储器映射中除能写缓冲

(对由 MPU 映射的 regions 不起作 用)

0 DISMCYCINT R/W 0 除能“指令可中断”功能。也就是不 再打断 LDM, STM, 64位乘法,以及 除法指令。

17.3.3 ID寄存器的更新

在 NVIC以及调试组件中的很多 ID寄存器都更新了。例如,在 NVIC中的 CPUID寄存器变成了

CPUID寄存器(0xE000_ED00)

实现者

[31:24]

变种

[23:20]

常数

[19:16]

PartNo

[15:4]

Revision

[3:0]

修订版 2

(r2p0)

0x41

0x2

0xF

0xC23

0x0

17.3.4 调试功能

修订版 2对调试功能有了好几处改进
 DWT中的观察点数据跟踪现在支持两种新的跟踪方式:仅跟踪读传送,以及仅跟踪写传送。 这样就可以仅在数据被改变或被读时才产生跟踪数据流,于是降低了数据跟踪所需的带宽。
 在实现调试特性时提供了更高的灵活性。比如,允许裁减可用的断点和观察点数,这样就 降低了所设计产品的尺寸,这对于超低功耗的设计非常有帮助。

 对多核系统的调试,支持力度更大。为了实现多核同时重启和单步,新增了一个接口(注 意,在程序员眼中看不到这种改变)。

17.3.5 睡眠特性

在系统级设计层上,现有的睡眠特性也得到了改进。在 r2p0 中,对处理器的唤醒可以延迟, 从而使得在芯片中可以更大面积地“停电”,并且在系统中所有其它部件都就绪后才继续执行程序。 这个改进主要是为了照顾下面一些应用:在它们里面,有一些硬件在低功耗模式下需要关闭,但是 重新打开这些硬件需要的时间比较久。
在睡眠功能的扩展之外,为降低功耗还有新招。在旧版的 CM3中,为了让内核能醒来,在睡眠 期间,依然不能停止送往内核的“自由运行时钟”。尽管该时钟消耗的能量很低,但总归还是关了 更省电。
为解决这个问题,可以在处理器外面布设一个简单的中断控制器。这个控制器,取名为“唤醒 中断控制器(WIC)”。在深度睡眠期间,它要提供在 NVIC 中的,“中断掩蔽功能”的镜像,并且负 责告知电源管理系统何时需要唤醒。这样,就可以在深度睡眠期间关断所有送往 CM3处理器的时钟 了。
除了可以停止时钟外,修订版 2还可以使处理器的大多数部分都掉电,把它们的状态存储在若 干特殊的逻辑小室中。在中断到达时,WIC 往电源管理单元(PMU)发送一个唤醒请求。在处理器 重新上电后,先前的状态从特殊的逻辑小室中恢复,然后就可以响应这个中断了。
可见,有了修订版 2中这个新的掉电能力,CM3可以在深度睡眠期间进一步降低功耗。不过, 这个特性还需要内核外的单元配合,因此不一定在所有修订版 2的产品中都支持。

17.3.6 使用修订版 2带来的好处和注意事项

那么,上文所讲的这些新特性,又对嵌入式产品开发带来了什么呢?
首先,是更低的功耗和更久的电池寿命。在进入了有WIC支持的深度睡眠后,整个电路就只有 很小一部分还在活动中。此外,在要求极低功耗的应用中(如体内植入式医疗设备),芯片厂商可 以通过减少断点和观察点的数量,来裁减芯片的尺寸。
第二,在调试和解决疑难问题的过程中,它提供了更好的灵活性。不仅体现在使用调试器的数 据跟踪特性上,还新增了一个辅助控制寄存器。通过它我们可以给写缓冲做个旁路手术,从而使总 线 faults 总是精确的。我们还可以使需要较多周期才能执行的指令不被打断,如 LDM/STM 指令。 这样一来,在分析存储器的内容时就可以放心了。最后,对于使用多个 Cortex-M3内核的系统,修 订版 2带来的“同时重启”和“多核单步执行”的功能正好雪中送炭。除此之外,在修订版 2中还 有若干个内部优化,以提高性能和改善接口特性。这样,芯片供应商就可以设计出更快的 CM3产品。
然而,在享受温柔的同时,也请嵌入式程序员们留意下面的问题:

双字堆栈对齐方式与异常堆栈帧

在缺省情况下,异常堆栈帧会自动对齐到双字存储器位置。早期为修订版 0/1 写的汇编程序, 如果要通过堆栈来把数据传送给异常服务程序,可能会受到影响。为了准确判定堆栈帧的起始 位置是否往下挪移了一个字,异常服务例程要先读取入栈 PSR的比特 9。如果不想动旧的程序, 也可以手工把 STKALIGN 比特清除,这样就与以前的一样了。与 EABI 标准兼容的应用程序不 会受影响。这些程序通常是 C程序,并且使用与 EABI兼容的编译器编译。

SysTick定时器也许会在深度睡眠期间停止。

如果使用的 CM3 单片机确实包含了掉电功能,或者是其它原因使得送往内核的时钟全体都在深 度睡眠中停止,则 SysTick 定时器在深度睡眠期间就无法再运行。这样一来,使用了 RTOS 的 嵌入式应用程序就需要一个外部时钟,用它来在唤醒时提供调度所需的滴答信号。

当处理器连接到一个调试器时,会自动除能新的掉电功能。

这是因为调试器需要访问处理器的调试相关寄存器。在调试会话中,能够控制内核停机或进入 睡眠模式,但哪怕使能了掉电功能,也不会触发掉电序列。为了准确地测试掉电操作时的功耗,必 须解除被测设备与调试器的连接。