ITRON的任务管理

Task管理机能

Task
任务就是一个具有独立功能的无限循环的程序段的一次运行活动。任务具有动态性并行性异步独立性的特点。
动态性任务的状态是不断变化的,一般分为:休眠态(dormant), 就绪态(ready),运行态(running), 挂起态suspended 睡眠态sleep

并行性是指系统中同时存在多个任务,它们宏观上是同时运行的。异步独立性任务是系统中独立运行的基本单元也是内核分配和调度的基本单元每个任务各自按相互独立的不可预知的速度运行走走停停。
每个任务都要按排一个决定其重要性的优先级,都有一个无限循环的程序段规定其功能(如一个C 语言过程),并相应有一个数据段、堆栈段及一个任务控制块(保存CPU 的现场, 状态等)。
下面是一个ITRON系统任务应用的典型范例:

void XXX_Task ( INT stacd )
{
MSG msg;
while(1)
{
         rcv_msg(&msg, MbxID); //从某个Mailbox中获取情报用户程序
}
}


任务调度
操作系统必须为多个任务可能有竞争的请求分配资源,对于处理器来讲,可分配的资源主要是处理器运行时间,分配的途径是通过内核的调度来完成的。
调度产生条件
从表面上看,任务切换功能很简单,在某个时刻,一个正在运行的任务被终止,操作系统指定另一个任务为运行状态,并把控制权交给这个任务。但是什么事件触发了任务控制权的切换?ITRON系统中,当有如下几个条件发生时,会发生任务的调度。
处理程序的返回
发生改变系统运行状态的系统调用。
产生时钟中断。

调度方式
1.优先级方式:对于每个任务都事先分配有优先级,这里的优先级是指决定调度顺序的东西,调度程序首先会参照优先级别,从Ready队列中找到优先级别最高的任务赋予CPU使用权。在实时操作系统中任务的优先级是应用程序设计者按照任务的重要程度来安排的,并且任务在运行中其优先级可以动态改变,这个完全需要根据实际的需求进行设计。


2.FIFS方式
当拥有同一优先级的任务存在多个时,调度程序将赋予成为Ready状态时间最长的任务CPU的使用权。
3.任务的禁止/许可
4.时间片轮旬
作为Itron系统并没有提供这种支持,但是可以通过现有系统提供的服务实现这种支持,这个在后面进行说明。

任务的状态管理
任务根据运行时所必须的资源获得状况,以及有无事件发生来实现状态的迁移,所以内核必须管理各任务当前所处的状态。
ITRON系统状态定义
操作系统的职责是控制任务的执行,这里包括决定任务交替的方式和资源的分配原则,所以为了达成这个目标,就需要描述任务的行为---即任务的状态。在ITRON中,将任务划分为如下七个状态进行管理,在任意时刻,任务状态只能属于这七个状态之一。
未登录状态:non_existent
没有作为任务的注册到系统中,或被消除没能登录到系统中的状态。也就是说虽然已经装配到内存中,但不受OS管理的程序。
休眠状态:dormant
任务生成时的状态(cre_tsk系统调用时)或者是运行终了时的状态。处于dormant状态的任务,已经从调度对象中删除掉了。
就绪状态:ready
成为内核调度对象管理的状态。虽然已经具备除了处理机之外的所有必要资源,但是由于有比该任务优先级别更高(或者相同任务优先级别)的任务正在运行,等待运行权到达的状态,也就是说,只要运行权到达,马上迁移到run状态的状态。
运行状态:run
得到了系统的控制权,正在处于运行处理中的状态。系统中处于运行状态的任务只能有一个。
等待状态:wait
由于缺少运行的必要条件,不能进入到运行状态的状态,也就是说正在等待必要运行条件到达的状态。
从wait状态的重新执行是从进入到wait状态时中断的场所开始执行,也就是说运行程序时必要的各种内部环境(寄存器、堆栈等)会复原。
挂起状态:suspend
被其他任务情知中断执行(sus_tsk调用的发行)的状态,还有可以通过多重发行sus_tsk调用,使suspend状态嵌套。Suspend状态的解除是通过发行rsm_tsk系统调用来进行的。但是如果要发行依次rsm_tsk系统调用来解除被嵌套的suspend状态,必须要选择参数T_FRCPSM(0X1)。从syspend状态重新实行是指从为进入suspend状态处理中断的位置开始。也就是说运行程序时必要的各种内部环境(寄存器、堆栈等)会复原。
双重等待状态:wait_suspend
由上面wait状态和suspend状态合成的状态,也就是对应于wait状态发行了sus_tsk调用的场合迁移到的场合。Wait_suspend状态是当suspend状态被解除时,就迁移到wait状态,而wait状态被解除时,就迁移到suspend状态。

 

任务的应用
创建任务
在Itron系统中创建任务存在两种方式,一种方式是静态注册任务;另一种方法是动态的创建任务。动态创建任务主要通过cre_tsk调用来实现的。
激活任务
Itron系统中,初始创建的任务的状态是Dormant状态,这个时候任务还处于系统无法调度的状态,所以必须激活任务,激活任务的系统调用是sta_tsk,作用就是将指定任务由Dormant状态迁移到Ready状态。
终止任务
在Itron系统中如果需要实现将任务由ready state, run state, wait state, suspend state, wait-suspend state迁移到Dormant状态的话,需要通过下面两种方式实现,正常终止和强制终止。正常终止是任务自身主动放弃系统的使用权。
强制终止是任务自身出现错误,无法自主释放系统使用权,这个时候只能通过其他任务来完成对本任务使用权的剥夺。
实现任务终止的系统调用主要有下面三个:
ext_tsk system call
The task that issued the ext_tsk system call is switched from the run state to the dormant state.
exd_tsk system call
The task that issued the exd_tsk system call is switched from the run state to the non-existent state.
ter_tsk system call
The task specified by the parameters is forcibly switched to the dormant state.
删除任务
实现任务状态从Run或者Dormant状态切换到nonexistent状态,实现这个功能主要通过下面两个调用来完成的。
exd_tsk system call
The task that issued the exd_tsk system call is switched from the run state to the non-existent state.
del_tsk system call
The task specified by the parameters is switched from the dormant state to the non-existent state.

任务的设计
 任务划分的原则
在将一个软件系统分解成并行任务时, 主要需考虑的是系统内功能的异步性。
可以通过分析数据流图中的变换, 确定哪些变换可以并行, 而哪些变换在本质上是顺序的,通过这种方法, 划分出任务: 一个变换对应一个任务,或者一个任务包括几个变换。
一个变换是应该成为一个独立的任务, 还是应该和其它变换一起组成一个任务, 决定的原则如下:
I/O 依赖性 (Dependency on Input/Output Device)
时间关键性的功能 (Time-critical functions-Hard Deadline)
计算量大的功能Heavy Computation function
功能内聚Functional relations
时间内聚Temporal relations
周期执行的功能Cyclic executing function
 I/O 依赖性
如果换依赖于I/O, 那么它运行的速度常常受限于与它互操作的I/O 设备的速度在这种情况下, 变换应成为一个独立的任务。
在系统中创建多个与I/O 设备相当数目的I/O 任务
I/O 任务只实现与设备相关的代码
I/O 任务的执行只受限于I/O 设备的速度而不是处理器
在任务中分离设备相关性


 事件关键性的功能
对于事件关键性的功能对响应的时间要求的第一重要的,所以对于这类任务的响应的优先级别比较高。
将有时间关键性的功能分离出来组成独立运行的任务
赋予这些任务高的优先级以满足对响应时间的需要


 计算功能
复杂的计算功能一般运行时间比较长,所以对于这类功能的设计的原则如下:
计算功能占用CPU 的时间多
捆绑计算功能成任务赋予它们较低优先级运行, 能被高优先级的任务
抢占消耗CPU的剩余时间
保持高优先级的任务是轻量级的
多个计算任务可安排成同优先级按时间片循环轮转
 时间内聚
将在同一时间内完成的各功能,即使这些功能是不相关的组成功能组形成一个任务
功能组的各功能是由相同的外部事件驱动的,如时钟等这样每次任务接收到一个事件, 它们都可以同时执行
组成一个任务,减少了系统的开销
虽然时间内聚在结构化设计中并不被认为是一个好的模块分解原则, 但在任务级是可以被接受每个功能都作为一个独立的模块来实现, 从而达到了模块级的功能内聚, 这些模块组合在一起, 又达到了任务级的时间内聚
 周期执行功能
将在相同周期内执行的各功能组成一个任务
频率高的赋予高优先级
 任务设计的误区
错误的任务划分原则
任务使用SUPSPEND/RESUME 太频繁,是由于任务划分过细任务的当成功能使用,改进的方法是将任务变成子程序使用。
当事件发生时调用子程序,任务划分的太粗将子程序划分为任务,得到消息后又立即检查另外的信息,不要使用轮循的方式直接使用事件驱动方式
优先级倒置
当低优先级的任务向高优先级的任务发送消息时,高优先级的任务不能运行,直到低优先级的任务发送消息后才能运行。这种情况下就没有必要分为两个任务只需要使低优先级的任务调用子程序即可。
死锁
两个任务同时相互等待对方的信号,导致它们永远不能运行。
为了避免死琐将共享资源统一排序所有的任务按序来访问多个资源。
等待的事件没有发生过或者不具备等待事件的发生条件。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值