嵌入式系统的前瞻 前后台系统

嵌入式技术

1372人已加入

描述

一个良好的实时运作不仅仅只是对实时严苛的中断来作及时处理,实际上有些非关键的任务,也需要一定的时序性,例如每10ms读取一个数据来进行处理,虽然这个数据读取操作并非要精确到1us或更低,但这个流程在CPU运行时,也是一个时序上的循环动作,这种我们称之为任务,后面我们在介绍嵌入式系统的时候再详述,现在让我们有个基本的操作系统思想。

我们在CPU上运行我们的代码时,通常用一个无限循环来等待中断的不断产生,而有些工作并非是中断产生的,例如读取IO状态来判断启动和停止设备,这时候是在无限循环中加入延时或计时器中断中加入代码循环判断么?用计时器中断里来处理显然是不合理的,因为代码一旦过长,就会抢占我们实时要求严苛的中断任务。因此,对于这种同样需要循环运行的代码,我们也需要拿出一些时间来处理它,而且不能占用任何中断。

至此,就有了前后台系统的出现。前后台系统严格来说并不是实时操作系统,早期的嵌入式系统中并没有操作系统的概念,程序员编写嵌入式程序通常直接面对裸机及裸设备,在这种情况下,通常把嵌入式程序分成两部分,即前台程序和后台程序。

前台:通过中断来处理事件,完成对于实时性要求特别严格的操作,后台:一个无限的循环应用程序,循环中调用相应的函数完成相应的操作,掌管整个嵌入式软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。

这个系统的实时性在代码或者说任务体量大时,完全不能适应实时的要求,因为一些实时性要求相对高的任务,在这个系统几乎中不可能立刻处理,但由于它结构简单,而且几乎不需要RAM/ROM的额外开销,因而在简单的嵌入式系统中可以被广泛使用。

今天庆叔利用TI的一个前后台系统样例,让大家了解一下,一个合理的具有任务管理功能的小系统给编程带来的方便。这是在主函数前声明的任务函数与函数指针。任务,它一定是能被关键中断打断,但能执行可控时间内的代码的函数。然后使用三个计时器,分别为50us,1ms和10ms,接下来,把任务指针指向初始任务,所有系统、IO、模块、中断都在主函数中处理完之后,就可进入到一个无限循环了,而这个无限循环不断在执行。

接下来的执行过程如下:主任务进入时,会分别对三个计时器的中断标志进行判断,首先进入的是A0,由计时器Timer0控制,它会执行分支任务A1,A1执行完后,分技任务指针交给A2,下次A0再进来就会执行A2。接下来就将主任务指针传给B0,B0由计时器Timer1控制,它会执行分枝任务B1,下次再进B0时就会执行B2,然后就是C0。

由于计时时间的不同,A0,B0,C0的执行频率就不同,而计时越短的任务,要求执行的代码就需要越短,这个过程也可以看出,对于A、B、C而言无论是主任务还是分枝任务是没有优先级别的,高频率的任务也要等待低频率的任务完成后,指针才会传回来。因此,对于任务量不大而且执行时间不长的代码段才适合这种系统。而上图还有两个在任务中执行代码的例子,一个是速度参考赋值,一个是系统指示灯的翻转,按执行频率分给了不同的主任务的分支任务1,像这么短的代码,任务的执行周期是可以完全保证的。

同时,要注意到,主任务并不是在计时器中断里产生的,事实上就没有计时器的中断,它只是在函数中判断计时器的中断标志位,这就意味着任务随时都会被任何一个中断给抢占,这样就保证了任务执行周期的同时,严格时序中断的可靠。

对前后台系统的理解,会给后面的嵌入式实时系统带来一个很好的概念性基础,因为嵌入式实时系统主要也是由中断和任务组成的流程,而其中的信号量、邮箱等等只是任务和中断协同工作的协作变量,以后,庆叔会慢慢带大家接触和了解它们。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分