嵌入式程序设计
应用程序处理流程可以用三种方式来实现1 轮询对于简单的应用程序,轮询(许多时候也被称作超级循环)实现起来比较简单,而且非常适合简单任务(见图4.4)。不过,当应用程序变得复杂或者对处理能力的要求更高时,轮询就不合适了。例如,当一个进程占用时间过长,其他模块在这段时间内就不会收到处理器的任何服务。即便不需要任何处理,处理器也得一直运行轮询程序,这也是轮询方式的另外-一个缺陷。中断驱动对于一些...
应用程序处理流程可以用三种方式来实现
1 轮询
对于简单的应用程序,轮询(许多时候也被称作超级循环)实现起来比较简单,而且非常适合简单任务(见图4.4)。不过,当应用程序变得复杂或者对处理能力的要求更高时,轮询就不合适了。例如,当一个进程占用时间过长,其他模块在这段时间内就不会收到处理器的任何服务。即便不需要任何处理,处理器也得一直运行轮询程序,这也是轮询方式的另外-一个缺陷。
中断驱动
对于一些需要低功耗的应用,处理器可以在中断服务程序中执行处理,当没有任务需要处理时进入休眠模式。外部中断源或者芯片外设都可以触发中断,并唤醒处理器。在中断驱动的应用程序中,不同设备的中断可以被设置为不同的优先级,这样即便低优先级的中断服务正在运行,也可以被高优先级的中断抢占处理器使用权,从而使低优先级处于暂停状态,因此高优先级中断的等待时间是很短的。
3.轮询和中断驱动的组合使用
许多情况下,应用程序可以将中断驱动和轮询这两种方式组合使用(见图4.6)。通过软件变量传递,中断处理程序和主处理流程间可以进行信息交换。将一个处理任务分割为中断服务程序和主流程中的处理,可以减少中断服务的持续时间,以便低优先级的中断能有更多的机会获得服务。而且,系统也可以在没有任务需要处理的时候进人休眠模式。如图4.6所示,应用程序就被分为了A、B和C三个进程,而有时候像这样进行拆分可能不是那么容易,只能作为一个大的组合进行处理。

处理并发任务
有些情况下,一个处理任务可能会占用大量的时间,这样像图4.6所示的处理就不合适了。如果任务A的执行需要太长的时间,任务B和C可能就无法及时响应外设模块的请求,这样可能会导致系统失败。针对这种情况,一般的解决方案如下:
(1)将一个长时间的处理任务划分为一系列的状态,每次处理任务时,只执行一种状态;
(2)使用实时操作系统(RTOS)处理多任务。
使用第一种方法,一个任务被划分为了几个部分,可以使用软件变量追踪任务的状态(见图4.7)。每次执行任务时,状态信息就会得到更新;这样下次再执行这个任务时,就可以继续.上次的处理了。
因为在大循环中,任务处理的时间减少,主循环中的其他任务就可以获得更多的执行机会。尽管任务处理的总时间没有改变(反而会由于状态保存和恢复带来的开销,总时间会增加),但系统的响应速度更快了。当应用程序非常复杂时,手动拆分任务就有点不切实际了。
对于那些更加复杂的应用程序,可以考虑使用实时操作系统(RTOS)。RTOS将处理器时间划分为多个时间片,在有多个应用进程运行时,只有一个进程会获得时间片。使用RTOS,需要有定时器产生周期性的中断请求。当一个时间片的时间到时,RTOS的任务调度器会由定时器中断触发,并判断是否需要执行上下文切换。如果需要进行上下文切换,任务调度会暂停正在执行的任务,并切换至下一个准备就绪的任务。
RTOS可以提高系统的反应能力,并且确保在一定时间内能够执行到所有任务。第18章介绍了使用RTOS的例子。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)