为应用程序构建程序流有很多方法,这里将介绍一些基本概念
一、轮询
1、对于非常简单的应用程序,处理器可以等待,直到有数据准备就绪,处理它,然后再等待。对于简单的任务,这是非常容易setup并且运行很好。下图显示了一个简单的轮询程序流程图。
2、在大多数情况下,一个微控制器将不得不服务多个接口,因此需要支持多个进程。轮询程序流方法可以轻松地扩展以支持多个进程,如下图。这样的安排是有时被称为一个“super-loop”。
这个轮询方法对于简单的应用程序很有效,但是它有几个缺点:
(1)当应用程序变得更复杂时,轮询循环设计可能会变得很难维护;
(2)使用轮询很难确定不同服务之间的优先级,这会导致程序最终可能会有较差的响应能力,一个外设请求服务可能需要等待很长时间,而进程正在处理不那么重要的任务;
(3)另一个轮询方法的主要缺点是它的能效低,功耗大。在不需要服务时,在轮询期间会浪费能源。
二、中断驱动
1、为了解决轮询机制中能效低的这个问题,几乎所有的微控制器都支持某种睡眠模式来降低功率,在这种情况下,外设可以在需要服务的时候唤醒处理器,如下图。这通常称为中断驱动的应用程序。
2、在一个中断驱动的应用程序中,来自不同外围设备的中断可以分配不同的中断优先级。例如,重要/关键外围设备可以被赋予更高的优先级,以便在中断到来时,正在处理低优先级中断服务的进程,将低优先级中断服务挂载,立即执行高优先级服务。这种安排可以更好地响应。
3、在某些情况下,可以对来自外围服务的数据分为两部分:。可分为两部分:第一部分需要快速完成,第二部分可以是等待。在这种情况下,我们可以使用中断驱动和轮询方法的混合来构造程序。当一个外围设备需要服务时,它在中断驱动的应用程序中触发中断请求。一旦第一部分在中断服务被执行时,它更新一些软件变量,以便服务的第二部分可以在基于轮询的应用程序代码中执行。使用这种安排,我们可以减少高优先级的interrup的持续时间,因此低优先级的中断服务可以更快地得到响应。与此同时,当不需要维修时,处理器仍然可以进入休眠模式以节省电力。
三、多任务系统
1、当应用程序变得更复杂时,一个轮询和中断驱动程序结构可能无法处理进程需求。例如,一些可能需要很长时间执行的任务可能需要立即处理。这可以通过将处理器的时间划分为若干个时间槽来实现。并将时间槽分配给这些任务。通过将任务目标分解来创造任务安排和建立一个简单的任务表在 技术上是可行的。但是在实际项目中,这样做通常是不切实际的,不仅消耗时间还使程序更难于维护和调试。
2、在这些应用中,一个实时的操作系统(RTOS)可以被用来处理任务调度,如下图。RTOS允许执行多个进程。同时,将处理器的时间划分为时间槽分配给请求服务的进程。需要服务的进程的槽。计时器需要为RTOS处理时间跨度。在每个时间槽结束时,计时器会生成一个计时器中断,这将触发任务调度器,并决定是否应该进行上下文切换。如果是,当前执行进程暂停,处理器执行另一个进程。除了任务调度之外,RTOS还具有许多其他特性,比如发送信号量,信息传递,等等。
致谢
1、《Cortex M3与M4权威指南》