低功耗系统的一种软件架构是让系统始终处于睡眠模式,仅在运行单个中断服务程序(ISR)时唤醒,然后立即返回睡眠状态。如果嵌入式开发人员试图从他的电池中榨出最后一点电,那就有一个严重且经常被忽视的缺陷。运行一个中断会浪费很多时间和时钟周期。

  执行中断的顺序是一个多步骤的过程。首先,将寄存器值和其他当前状态信息压入堆栈,以便以后恢复。接下来,CPU指向ISR,执行ISR代码,最后弹出堆栈,将寄存器恢复到原始状态。整个序列可以用图1中的流程图来概括。

  

嵌入式开发的一般方式(嵌入式开发提示和技巧)(1)

  图1–标准ISR操作

  这样做的问题是,即使嵌入式开发人员使用现代的快速处理器,将所有寄存器推到堆栈中然后再恢复它们的效率仍然很低。这可能需要很少的时间,甚至可能是几纳秒,但是在数百万或数十亿次执行的过程中,这可能相当于在低功率模式下花费的大量时间。结果就是浪费电池电量!

  大多数ARM微控制器都有一个非常酷的特性,叫做退出时休眠。该特性的作用是,当ISR完成时,使能该特性会使MCU立即进入睡眠状态,而不是让处理器每次都进入和退出ISR,浪费玩堆栈的开销。通过这样做,MCU仍然被配置为运行ISR,因此当它再次触发时,系统唤醒并立即执行ISR,开销最小。结果如图2所示。

  

嵌入式开发的一般方式(嵌入式开发提示和技巧)(2)

  图2–退出时休眠的ISR开销

  不过,在不使用其他低功耗设计技术或设计周期中没有时间进行节能优化的应用中,这一特性的真正优势是显而易见的。如果嵌入式开发人员将它内置于软件架构中,并且是首批优化之一,则可以节省几毫安的电流。然而,如果这个特性是在大部分优化已经实现的最后实现的,那么很可能节省的空间非常小。


,