实现具体实时应用业务逻辑一般采用分解任务的方法。将一个实时应用功能划分为多个并发执行的任务。分配任务不同的优先级,赋予任务自主延迟功能,进行必要的任务通信,设置关键任务的中断响应。明确任务的执行条件、中断条件和挂起条件等因素。每个任务是系统中一个独立的执行调度单位和资源分配单位。如图1所示,调用RTOS内核系统函数接口,创建实时任务;任务的运行从接受内核调度开始,按照自身流程设计循环执行,直至系统运行结束。
通过对实时应用功能划分及运行技术分析研究,总结出实时应用的基本构成单位和基本功能实现方法,如图2所示。
2 基于μC/OSⅡ内核的实时任务模型
μC/OSⅡ嵌入式操作系统是一个多任务、优先级抢占、可移植、可裁减的实时内核。具有时间、内存、信号量、邮箱和信息队列等各类功能函数,各任务间可以互相通讯,适用于小型CPU,开源代码简练,应用领域广泛。
μC/OSⅡ操作系统以系统函数形式提供各类管理功能,以任务为单位对应用代码进行管理。应用程序调用系统函数编码,并进行编译、链接、运行。应用代码与内核构成一个整体。实时软件编码的核心问题在于将应用软件的具体功能转化为系统中一个个并发执行的实时任务,接受操作系统内核调度程序的调度和管理,使应用功能最终实现。
基于μC/OSⅡ实时操作系统内核进行应用程序开发,首要的工作在于如何将应用程序中的功能进行模块分解,使每个模块转换为可并发执行的任务;调用内核完成任务流程的设计与实现;启动操作系统内核的任务调度程序,并发执行任务。
由于实时应用程序的开发既要考虑内核功能及接口,也要设计应用逻辑功能。设计一个任务模型,直接服务于实时应用程序的设计与实现。该模型对设计与实现的全过程进行简要分解,对各个环节进行功能设计与实现,引导用户将设计功能转换为应用程序。
图3提供了任务模型框架与构建基本步骤。
2.1 任务分解
任务分解是将一个实时应用业务逻辑,按照任务的管理和控制接口划分为若干独立的任务,并发运行,实现应用功能。简单地分为设计阶段和编码阶段。
2.1.1 设计阶段
(1)根据应用程序功能需求,将应用程序功能划分为若干并发任务。首先将需要并发执行的子功能确立为任务,任务优先级按响应的迫切程度确定。
(2)确定每个任务处理流程,确保完成任务功能。
(3)确定任务功能实现是否与其他任务的执行有关联。
2.1.2 编码阶段
(1)完成每个任务的程序设计。将任务流程使用C语言编写为独立的函数。根据应用需求,不同的任务也可共用同一个函数的代码段。
(2)实时任务需确定优先级。为确保低优先级任务有机会运行,每个任务函数中需包括睡眠、挂起、等待指定时间等一些自主放弃CPU的语句,调用内核函数实现。
2.2 任务通信
实时任务间存在互相合作或竞争关系。μC/OSⅡ实时操作系统内核允许并发任务间通过事件、信号量、消息邮箱、消息队列进行通信。实现分为两步:定义通信事件数据类型及初始化;任务编码中适时调用发送和接收函数。
(1)创建任务前,调用内核,定义需要的通信机制数据结构。
(2)发送任务和接收任务调用内核任务通信函数实现编码,发送任务和接收任务可有多个。
2.3 任务创建
将编码完成的任务函数,通过调用内核函数,转换为内核可调度的任务。系统函数INT8U OSTa-skCreate(void(*task)(void*pd),void*pdata,OSSTK*ptos,INT8U prio)的输人数据为:任务代码指针——任务函数名;创建任务运行时传递的指针——可为空值;任务堆栈栈顶指针——任务现场数据;任务优先级——确定任务关键程度。
2.4 任务性能
为确保实时应用程序的实时特性,满足实时软件的性能需求,必须要求实时内核能够控制每个实时任务的响应时间和执行时间。
任务的响应时间可利用系统内部定时器计算,根据任务的执行顺序,在起始任务开启定时器,在结束任务停止计时,经反复调试,可以测定实时任务的响应时间,一般设为计时最大值,可为确定任务抢占延迟时间提供直接数据。
任务执行时间的测定方法类似。在任务执行代码起始位置开启定时器;在一个任务周期结束时停止计时。反复调试,测得的最大值计为任务的执行时间,又为一个任务最长的一个执行周期,也为控制单个任务功能的执行提供依据。