利用实时内核开发嵌入式多任务程
嵌入式系统的应用越来越复杂,传统的前台/后台程序开发机制已经不能满足需求。目前,越来越多的抢占式实时内核被用来开发嵌入式多任务系统。实时内核为多任务应用程序提供最基本和最重要的服务。介绍了实时内核和多任务,提出了利用实时内核进行系统开发时,根据系统功能合理组合任务的方法。

随着嵌入式系统的广泛应用,传统的前台/后台程序开发机制已经不能满足日益复杂多样的嵌入式应用需求,因此嵌入式实时操作系统内核(简称实时内核)经常被用来开发实时多任务程序。嵌入式实时内核提供多任务处理、任务管理、时间管理、任务间通信和同步、内存管理等重要服务。,这使得嵌入式应用程序易于设计和扩展。内核是管理微处理器或微控制器时间的软件,确保尽可能高效地处理所有时间关键事件;它允许将系统分成几个独立的任务,每个任务处理程序的一部分,从而简化了系统的设计过程。

1.非抢占内核和抢占内核
实时内核有两种:非抢占式内核和抢占式内核。异步事件由两个内核中的中断服务例程(isr)处理。在非重启内核中,isr会将优先级较高的任务准备就绪,不会立即将cpu控制权交给优先级较高的任务,而是返回到中断的当前任务。只有当当前任务执行某些操作并明确放弃cpu时,具有高优先级的新任务才会得到cpu的控制。非感知内核对实时事件的响应时间是不确定的,因此很少用于实时应用。图1显示了非重启内核程序流程:①低优先级任务(lpt)执行;②低优先级任务被中断;③执行中断服务程序,使高优先级任务(hpt)就绪;④中断服务程序返回到中断的低优先级任务;⑤低优先级任务继续执行;⑥低优先级任务放弃cpu;⑦高优先级任务的操作。

目前,在大多数嵌入式实时多任务系统中,系统的实时响应非常高,因此采用抢占内核来保证时间关键的任务先执行,使得优先级最高的就绪任务总是先得到cpu的控制。低优先级的当前任务可以被高优先级的任务抢占,暂时中止执行,并将cpu控制权交给高优先级的任务。图2显示了抢占式内核程序流程:①低优先级任务执行;②异步事件中断任务;13)响应异步事件,运行中断服务例程以准备好高优先级任务;④中断服务程序,返回高优先级任务;⑤执行高优先级任务,直到被中断并切换到高优先级任务;⑥当高优先级任务结束时,内核切换到低优先级任务;⑦继续执行低优先级任务。

其次,多任务处理
利用实时内核开发嵌入式多任务系统程序,需要按照明确的设计目的确定系统功能,合理分解系统功能,构造不同的任务,使每个任务负责完成应用所需的部分功能;根据任务相对于其他任务的重要性。多个任务彼此独立运行,具有独立的私有堆栈空,当被其他进程抢占时,它可以保持任务执行线程的上下文。

1 .任务
任务是由单线程指令序列形成的无限循环,由系统程序中的一个函数表示(如下)。执行任务时,应该调用内核提供的服务,等待事件发生。该事件可以是固定时间,或者是另一个任务或中断服务例程发出事件通知。
无效任务(void)
{
while(true){
运行应用程序特定代码;
waitforeventbycallingserviceprovidedbthkernel;
运行应用程序特定代码;
{}
{}
2.任务管理
每个任务有五种状态;睡眠,准备,运行,等待,中断。图3显示了任务之间的状态转换。处于休眠状态的任务驻留在内存中,没有被内核使用。处于就绪状态的任务准备执行,优先级低于当前任务,未获得cpu控制权;任务在得到中央处理器的控制后处于运行状态。等待事件发生的任务处于等待状态,事件可以是i/o操作的完成、共享资源的利用、时钟脉冲的出现等。当任务的执行被中断服务例程中断时,任务处于中断状态。

实时内核通过任务控制块(tcb)管理任务。Tcb数据结构包括任务状态、优先级、任务栈顶指针以及其他与内核相关的信息。程序调用内核服务(比如调用内核函数ostaskcreate)来创建一个任务,在内存中为这个任务分配一个tcb,初始化它,并使任务从休眠状态转换到就绪状态。任务可以在多任务执行之前静态创建,也可以在多任务执行期间动态创建。

内核为实时多任务应用程序提供任务调度和转换、任务间通信、定时和其他服务,这些服务被用作任务的系统调用。实时内核根据基于事件的任务的执行状态来切换任务,并且任务的状态相应地改变。在实时多任务程序中,内存中的每个任务都有几个任务控制块和独立的私有堆栈。要切换任务,首先将cpu寄存器的内容保存到当前任务堆栈,将堆栈指针保存到当前任务的tcb,然后从新任务的tcb加载堆栈指针,并将新任务上下文加载到cpu寄存器中。这将从一个任务切换到另一个任务。该任务使用内核在此时提供的定时器系统调用,并且可以保持休眠一段时间,或者在等待一段时间后准备就绪。在实时嵌入式系统中,外部中断事件产生的任务具有较高的优先级,因此cpu控制权是通过抢占获得的。

第三,任务结构
1.i/o任务结构
根据三种不同的输入输出事件;中断驱动事件、轮询事件和输出事件来构造i/o任务。轮询事件通常由一个任务来实现,该任务由实时内核在固定周期内调度,输出事件通常被设计为可重入程序而不是任务;中断驱动事件是典型的异步事件。

i/o分解将由一个简单的串行设备驱动程序解释,突出I/o任务构造的重要特征。这个设备被分配一个中断向量,在三种情况下产生中断:字符接收、输出就绪和设备错误。由于使用了抢占内核,在i/o中断进入中断处理程序后,程序应该保存处理器状态,并根据不同的中断原因调度任务。在中断处理完成并退出中断处理程序之前,应恢复处理器状态。

设备中断处理:
如果收到字符
将字符放入字符接收队列;
执行接收任务;
如果输出准备好了
如果继续输出
发送下一个字符;
其他
保存设备输出准备状态;
如果设备出错,则
将错误状态放入错误队列;
执行错误处理任务;
接收任务:
无效任务_接收()
{
while(true){
waitoninputcharqueue
艾芬多芬普特林登
processinputstring
其他
保存输入;
{}
{}
对于中断事件,有必要合理划分事件的处理级别,并尽可能在任务级别进行处理,以最小化系统中断延迟。串行设备驱动程序中断的处理是将事件分为中断级和任务级处理的一个例子。中断服务例程及时响应实时中断,并将实时要求相对较低的事件(如字符错误和错误状态处理)移交给不同的任务进行处理。队列是内核提供的任务间通信结构,支持消息发送方和接收方的异步访问。它用于驱动程序和任务之间的通信,并为驱动程序进程和任务进程提供消息缓冲。设备驱动程序负责及时响应中断事件,不关心接收任务的状态。为了简化接收任务的结构和减少系统延迟,错误处理被分成独立的任务并分配不同的优先级。

2.内部任务结构
系统内部任务可分为:①周期性任务——实时内核基于固定周期调度的任务;(2)异步任务——非周期性或事件驱动的任务,由内核根据需要进行调度,用于处理系统内部产生的事件;③控制对象——为状态机创建的控制任务,用于实现状态转换;④用户界面⑤-与用户任务相对应,在用户驱动系统中,用户任务具有较高的优先级。

在嵌入式实时多任务系统中,大多数任务是非周期性的或事件驱动的异步任务,其功能形式如下:
无效任务_非周期性()
{
while(true){
waitonanasynccdatastructure;
processinput
processoutput
{}
{}
在异步任务中,驱动任务的异步数据是实时内核提供的任务间通信数据。内核为应用程序提供信号量、消息队列、消息邮箱、套接字或管道,以管理事件和任务之间的通信。在设计这些异步任务时,采用合适的数据结构和正确定义数据可以节省宝贵的调试时间,而且任务处理的功能不应该太多太复杂,否则会增加调试的难度。

3.任务合并
利用任务的共同特征对任务进行适当合并,可以简化系统任务模型,降低系统复杂度,消除一些任务的切换开销,从而降低系统的整体开销。任务合并可分为:①根据时间一致性合并,将同一事件激活的具有相同优先级的功能合并为一个任务;(2)根据控制合并;(3)根据功能合并,使用相同的数据合并多个功能,使原始共享数据成为任务内的本地数据,从而减少互斥。

结束语
目前,许多厂商为嵌入式应用提供实时操作系统(rtos),并提供实时内核、输入输出管理器、窗口系统、文件系统、网络、语言接口库、调试器和跨平台编译器等软件包。实时内核为嵌入式多任务程序提供了最基本和最重要的功能。本文从用实时内核开发多任务应用的角度出发,介绍了实时内核和任务,并提出了一种合理的任务构造方法。可见,利用实时内核提供的服务,采用正确的开发方法,可以增加嵌入式实时多任务系统的功能,减少开发方法,增加嵌入式实时多任务系统的功能,降低开发难度。
上一篇:中国首位车祸模拟人出生
下一篇:电力系统配电网自动化的 应用现
标题:利用实时内核开发嵌入式多任务程 地址:http://www.zgshouguang.cn/article/6623.html
