前后台介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、最简单的前后台操作系统
根据前面的描述我们可以把最简单的前后台操作系统写成下面的样子:
后台程序:
void main(void)
{
while(TRUE)
{
if(Task1_flag)Task1();
if(Task2_flag)Task2();
if(Task3_flag)Task3();
}
}
void Task1()
中断
中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被识别,CPU保存部分或全部寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后程序回到被中断了的任务或者让进入就绪态的优先级最高的任务开始运行。中断使得CPU可以在事件发生时才予以处理,而不必让微处理器连续不断地查询是否有事件发生。通过两条特殊指令:关中断和开中断)可以让微处理器不响应或响应中断。在实时环境中,关中断的时间应尽量的短。关中断时间太长可能会引起中断丢失。
一、概念介绍
让我们先看一下嵌入式操作系统中关于任务与多任务的概念。
任务
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。在嵌入式操作系统中任务必需具备以下几个特征,
(1)一个任务拥有一套自己的CPU寄存器以及自己的栈空间。
(2)一个任务的开始伴随着一个无限的循环,而结束通常为退出这个循环。
下面对在硬件条件已知的情况下,分析前后台操作系统的软件的实时性。
中断响应时间:根据“代码9.1-1”前后台操作系统的中断响应代码即为每个Task对应的“前台程序”即:
小。因为所有Task的栈空间都使用main函数的栈空间。
(2)一个任务的开始伴随着一个无限的循环,而结束通常为退出这个循环。
每个Task内并没有无限循环仅仅通过一个标志位决定是否进入,而退出也
不是退出一个循环而是结束一次函数的调用。
(3)一个任务必需运行在以下五种状态中的一种状态休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。
先分析一下如果使用前后台操作系统去实现这个应用,都需完成哪些工作。
1、首先我们要实现对应这些服务的8个函数分别对应为:Task1()、Task2()….Task8(),根据已知条件每个Task()执行的时间为1秒。
2、如果使用前后台操作系统,这些任务之间的调度我们先采用最简单的调度方法在“代码9.1-1”中有描述。(关于前后台操作系统调度方法的改进将在后面的章节介绍)
(1)一个任务拥有一套自己的CPU寄存器以及自己的栈空间。
显然main函数拥有自己的CPU寄存器以及自己的栈空间。
(2)一个任务的开始伴随着一个无限的循环,而结束通常为退出这个循环。
Main函数内部拥有一个无限的循环,如果这个循环退出也就是标志着main
函数的结束。
(3)一个任务必需运行在以下五种状态中的一种状态休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。
影响实时性的因素
在操作系统支持下的嵌入式产品开发中,影响用户任务完成时间的主要因素主要有以下三个方面:
实时需求:从任务发起时算起到计算机处理完事件并做出正确反应的时间,
在嵌入式系统中,任务发起一般就是某事件发生。例如在机器人
控制中,机器人行进时,从障碍物出现到实际作出避让动作的时
间。
软件因素:花费在软件上面的时间,通常由中断响应时间、中断返回时间、系统调度时
{
Task1_flag = FALSE;
}
void Task2()
{
Task2_flag = FALSE;
}
void Task3()
{
Task3_flag = FALSE;
}
前台程序:
isr void isr_Task1()
{
Task1_flag = TRUE;
}
isr void isr_Task2()
第九章前后台操作系统介绍
在实际应用中操作系统是一个什么样子呢?下面我向大家介绍并实现一种在实际应用中较为常见并且比较复杂的小系统一般设计成如图2.1所示的样子。这种系统可称为前后台系统或超循环系统。
9
9
一、了解前台与后台
要了解前后台操作系统的特征首先要了解前后台的概念。那么什么是前台与后台呢?首先了解一下前后台操作系统的运行机制,前后台操作系统的运行机制非常简单首先在操作系统的入口函数中实现一个无限的循环,在循环中调用相应的函数完成相应的任务操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为。后台根据前台提供的信息进入相应的任务所以也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的某一个任务级响应时间取决于整个循环的执行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。
我们看到main函数更加符合操作系统任务的定义,如果前后台操作系统只有一个Task(),那么main函数符合任务定义的所有特征,而无论Task()存在多少个Task()只符合任务的几个特征,所以前后台操作系统只有一个任务,这个任务就是操作系统的后台,因此前后台操作系统关于任务方面的特征应该为单任务。
(3)一个任务必需运行在以下五种状态中的一种状态休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。
(4)一个任务在多任务操作系统中拥有自己的任务优先级。
(5)一个任务通常对应整个系统的某一个功能。
多任务
多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实时应用中,多任务化的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更容易设计与维护。
{
Task2_flag = TRUE;
}
isr void isr_Task3()
{
Task3_flag = TRUE;
}
代码9.1-1
分析一下这个前后台操作系统的组成:
在这个前后台操作系统中mian函数中的“while(TRUE)”里面包含的部分为系统的后台。
中断处理“isr_Task1”、“isr_Task2”、“isr_Task2”函数构成了系统的前台。
9
让我们再看一下前后台操作系统的实时方面的特征,说到嵌入式操作系统的的实时,这真是一个说简单非常简单说复杂非常复杂的问题。“实时”在操作系统中是一个性能指标,在某些情况下这个指标可能定义的很苛刻很少有操作系统满足这个性能,有些操作系统即使是实时的操作系统也未必满足要求,又或者在某些情况下这个指标定义的非常宽松绝大多数操作系统都能够满足这个需求,即使这个操作系统是非实时的操作系统也仍然能够满足,这取决于应用对系统的要求,所以在实际应用中,设计者往往关心的是这个操作系统实时性能的指标而非这个操作系统到底是实时操作系统还是非实时操作系统。而比较成功商业软件往往也会给出自己在某一个硬件平台上面相关的实时性参数供用户参考。
间、软件处理时间组成。
硬件因素:花费在硬件上面的时间,通常由硬件响应中断时间,硬件执行时间,硬件
检测时间组成
在嵌入式系统中一次成功的操作必须满足下面的计算公式:
实时需求<=软件因素+硬件因素。
二、分析前后台操作系统的实时性
根据前面实时系统概念的介绍,我们可以分析出实时并不意味着速度快,而是意味着当需要对现实世界做出反应时,它的行为是可预测的并且可靠的,并且满足现实世界时限要求的。实时系统总是在最后的时限到来之前就能够正确地完成规定的操作,非实时系统可能在某些情况下比事实系统运行的块,但有的时候却保证不了所有的时候都能满足最后时限的要求。
前后台操作系统与真正拥有任务切换的多任务操作系统相比较,不涉及任务切换、任务运行状态管理等诸多任务方面的设计,实现起来比较简单。另外操作系统所有的程序调用都为一个主循环,CPU没有任务切换的额外开销系统利用率非常高。从省电的角度来看如果实现同样功能,前后台操作系统的电源消耗量也比有任务切换的多任务操作系统低。
一、概念介绍:
我们要了解前后台操作系统的实时性首先要了解以下几个概念:
实时性
“实时性”所指的通常是特定操作所消耗的时间(以及空间)的上限是可预知的。比如,如果说某个操作系统提供实时内存分配操作,那也就是说一个内存分配操作所用时间(及空间)无论如何也不会超出操作系统所承诺的上限。
系统响应时间(System response time):系统发出处理要求到系统给出应答信号的时间。
但是虽然前后台操作系统的任务特征为单任务,我们仍然把它理解成特殊的“多任务操作系统”,理由很简单“通常嵌入式系统中一个任务对应整个系统的某一个功能”这一点尤为重要。并且我们可以通过修改让每个Task()拥有任务的部分特征(但无论怎样修改每个Task()仍然无法满足任务定义的所有特征这个我们将在后面的章节中讲到),所以我们这里把前后台操作系统的任务特征也定义为“多任务”,但我们要知道从本质上讲前后台操作系统为单任务操作系统。
任务换道时间(Context-switching time):任务之间切换而使用的时间。
中断延迟(Interrupt latency):计算机接收到中断信号到操作系统作出响应,并完成换道转入中断服务程序的时间。
实时操作系统
业界对实时系统定义有很多,IEEE(美国电器工程师协会)对实时系统的定义是“那些正确性不仅取决于计算的逻辑结果也取决于产生结果所花费多少时间的系统叫做实时系统”。
每个Task都没有运行状态的概念
(4)一个任务在多任务操作系统中拥有自己的任务优先级。
每个Task不存在优先级,系统无法保证那一个Task能被优先处理
(5)一个任务往往对应整个系统的某一个功能。
每个Task通常对应系统的某一个功能
显然前后台操作系统中的“Task1()”、“Task2()”、“Task3()”不符合任务的定义,那么在前后台操作系统中的任务在那儿呢?让我们看一下前面例子中的“main()”函数
二、分析前后台操作系统的任务
按照任务与多任务的定义分析一下前后台操作系统中的“Task1()”、“Task2()”、“Task3()”是否符合任务的定义。
(1)一个任务拥有一套自己的CPU寄存器以及自己的栈空间。
很显然每个“Task”并不具备自己的CPU寄存器以及栈的空间。
在进入某一个Task的时候,系统很难确保这个时候系统堆栈剩余空间的大
main函数在前后台操作系统中拥有两种状态:运行态、被中断态。
(4)一个任务在多任务操作系统中拥有自己的任务优先级。
main函数没有优先级。
(5)一个任务往往对应整个系统的某一个功能。
main函数完成了系统的全部功能,如果前后台操作系统仅仅实现一个Task1()那么main函数符合任务特征
三、确定前后台操作系统的任务特征
“Task1()”、“Task2()”、“Task3()”,每个函数对应系统的一个的应用。
根据前面章节的描述我们知道要确定某一个嵌入式操作系统的特征,主要应从两个方面着手,单任务与多任务,实时与非实时。我们将在下面的章节中分别从这两方面入手来分析一下前后台操作系统的特征。
9
我们先从任务与多任务方面分析,并找到前后台操作系统的任务。在任务方面有些人看到前面代码中的“Task1()”、“Task2()”、“Task3()”后可能就会把他们成前后台操作系统的任务,从而把前后台操作系统的任务特征定义为多任务,然而事实的真相并非如此。
分析前后台操作系统的实时性,主要是分析影响实时性的因素中的软件因素。因为影响实时性的因素中的硬件因素跟硬件有关,并非通过更改代码可以改进的。
前面已经介绍了在软件因素中主要有四部分:中断响应时间、中断返回时间、系统调度时间、软件处理时间,让我们看看在前后台操作系统中这四部分是否都满足实时性的要求。
为了更好的分析前后台操作系统的实时性,先假设我们需要实现一个应用,这个应用要求系统监控一组IO,每个IO口对应一个服务,如果IO口为高,则执行对应这个IO口的服务,如果为低则不执行对应的服务。另外我们还知道,每个“服务”的执行周期为1秒,对应的IO为8个端口,也就是说这8个端口分别对应8个服务。
相关文档
最新文档