《操作系统基础ITRON系统使用方法.doc》由会员分享,可在线阅读,更多相关《操作系统基础ITRON系统使用方法.doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ITRON系统使用方法目录1引言42ITRON系统介绍52.1概要52.2构成52.2.1ITRON系统构成52.2.2ITRON体系结构52.3应用领域62.4如何使用ITRON系统63ITRON的基本机能83.1Task管理机能83.1.1Task83.1.2任务调度83.1.2.1调度产生条件93.1.2.2调度方式93.1.3任务的状态管理93.1.3.1ITRON系统状态定义93.1.3.2任务状态迁移与系统调用103.1.4任务的应用123.1.5任务的设计133.1.5.1任务划分的原则133.1.5.2I/O 依赖性133.1.5.3时间关键性的功能133.1.5.4计算功能1
2、43.1.5.5时间内聚143.1.5.6周期执行功能143.1.5.7任务设计的误区143.2同步和通信管理153.2.1Event Flag153.2.1.1基本调用163.2.1.2Event Flag的应用163.2.2Semaphore183.2.2.1基本调用193.2.2.2Semaphore的应用193.2.3MailBox203.2.3.1基本调用223.2.3.2MailBox的应用223.3内存管理243.3.1概述243.3.2基本调用253.3.3内存池的创建253.3.4内存池的清除263.3.5内存申请263.3.6内存释放263.4中断处理263.4.1中断处理
3、的管理263.4.2中断例程的登录273.4.3中断中的处理273.5时钟管理283.5.1周期唤醒283.5.2延迟唤醒283.5.3Time Out指定294初始化处理294.1硬件初始化294.2内核初始化294.3软件初始化305附录315.1思考题315.2参考资料:311 引言对于这样一个处处存在计算机的时代,计算机已经不再是像现在这样有显示器和键盘的样子,而是内只与各种各样的机器设备中,用户不会意识到是在使用计算机,而是在不知不觉中愉快的接受了计算机提供的各种服务。为了实现处处存在计算机的设想,在TRON项目中研制了内置于形式各异的机器设备中的操作系统ITRON。ITRON与现在
4、的大多数计算机中的操作系统的最大不同就是具有实时性。另外ITRON还有一个特点就是其标准的开放性,由于他的开发体系标准,任何人都可以自由的以ITRON为基准,创建操作系统。课程目的:本教材从应用的角度出发,比较详尽的解析ITRON系统的基本原理,并且理论结合实际,由浅入深,逐步引导大家,从而保证每位学员能够独立在基于ITRON系统内核上进行应用软件的设计和开发。授课目标:通过本课程的学习,能够让大家对ITRON系统有比较深入的了解,并能够独立开发基于ITRON系统的应用软件。面向对象:本教材主要面向有一定操作系统原理基础知识,并立志于基于ITRON体系开发的人。教材构成:1. ITRON系统概
5、要2. ITRON基本功能 任务管理 同步管理 内存管理 时钟管理 中断管理3. 初始化处理4. 系统调用详细说明2 ITRON系统介绍2.1 概要ITRON(Industrial the Real-Time Operation System Nucleus,工业实时操作系统中心)提出的实时多任务系统规范。它具有标准的实时内核,适用于任何小规模的嵌入式系统,日本国内现有很多基于该内核的产品,其中消费电器较多,目前已成为日本事实上的工业标准。ITRON和日本的精密机械工业相结合,使日本在数据系统、工业机器人、办公机器方面处于世界领先地位。ITRON系统具有以下特点: 多任务支持 事件驱动基于优先
6、级的调度 任务间的通信与同步 实时时钟控制 完全可抢占内核硬实时响应2.2 构成2.2.1 ITRON系统构成ITRON系统主要由内核、接口库、辅助工具这三个基本子系统组成。内核:ITRON的核心部分,和处理程序一起组装到目标系统中,进行实时、多任务控制。主要包括调度程序、Task管理、同步管理、初始化以及各种资源的管理等。接口库:用外部函数的形式提供系统服务,实现将外部函数形式发行的系统调用转变为内核识别管理的形式的接口程序。图2.2-1 表明接口库在系统中的位置。图2.2.1-1 接口库的定位 辅助工具:包括编译工具、Task Debuger等,为用户方便式用系统提供了可能。2.2.2 I
7、TRON体系结构建立在ITRON 基础上的系统根据功能来分层,每一层都使用下一层提供的功能,系统图2.2.2-1ITRON系统体系结构硬件构成了系统的最底层,紧接着一层包括了最简单的大多是硬件相关的操作系统,功能最上层是应用程序。2.3 应用领域随着信息终端的高性能化,在终端上搭栽操作系统的实例越来越多。根据TRON协会提供的资料,下面将列举出ITRON系统的主要应用领域。 娱乐/教育设备 通信设备 AV设备 测量仪器 医疗设备、航空设备的数据收集以及数据计算系统等 家用电器在上述应用领域中,ITRON规范的操作系统的使用率比较高,普遍超过40%,除去其中没有使用操作系统的设备,这些领域中的I
8、TON的使用率将超过60%,因此ITON规范的操作系统还是得到了广泛的认可和应用的。2.4 如何使用ITRON系统ITRON规范中定义了一系列C语言接口库,应用系统可以利用这些接口库实现应用与操作系统的相连。下面是基于itron系统的软件构建过程:图2.4-1 基于Itron系统的软件构建过程3 ITRON的基本机能作为通常的实时操作系统,一般需要包含下面这些基本的管理功能: 中断管理 任务管理1. 创建、撤消2. 状态迁移3. 调度4. 同步(任务协调、资源的互斥访问、任务之间通信) 资源管理(内存、时间、端口、外设等)ITRON系统也不例外的实现了这些功能,下面将针对这些机能进行详细讲解。
9、3.1 Task管理机能3.1.1 Task任务就是一个具有独立功能的无限循环的程序段的一次运行活动。任务具有动态性并行性异步独立性的特点。动态性任务的状态是不断变化的,一般分为:休眠态(dormant), 就绪态(ready),运行态(running), 挂起态suspended 睡眠态sleep 等如图3.1并行性是指系统中同时存在多个任务,它们宏观上是同时运行的。异步独立性任务是系统中独立运行的基本单元也是内核分配和调度的基本单元每个任务各自按相互独立的不可预知的速度运行走走停停。每个任务都要按排一个决定其重要性的优先级,都有一个无限循环的程序段规定其功能(如一个C 语言过程),并相应有
10、一个数据段、堆栈段及一个任务控制块(保存CPU 的现场, 状态等)。下面是一个ITRON系统任务应用的典型范例:void XXX_Task ( INT stacd )MSG msg;while(1) rcv_msg(&msg, MbxID); /从某个Mailbox中获取情报用户程序3.1.2 任务调度操作系统必须为多个任务可能有竞争的请求分配资源,对于处理器来讲,可分配的资源主要是处理器运行时间,分配的途径是通过内核的调度来完成的。3.1.2.1 调度产生条件从表面上看,任务切换功能很简单,在某个时刻,一个正在运行的任务被终止,操作系统指定另一个任务为运行状态,并把控制权交给这个任务。但是什
11、么事件触发了任务控制权的切换?ITRON系统中,当有如下几个条件发生时,会发生任务的调度。 处理程序的返回 发生改变系统运行状态的系统调用。 产生时钟中断。3.1.2.2 调度方式1 优先级方式:对于每个任务都事先分配有优先级,这里的优先级是指决定调度顺序的东西,调度程序首先会参照优先级别,从Ready队列中找到优先级别最高的任务赋予CPU使用权。在实时操作系统中任务的优先级是应用程序设计者按照任务的重要程度来安排的,并且任务在运行中其优先级可以动态改变,这个完全需要根据实际的需求进行设计。图3.1.2.2-1 Itron Ready队列状态和处理器使用权2 FIFS方式当拥有同一优先级的任务
12、存在多个时,调度程序将赋予成为Ready状态时间最长的任务CPU的使用权。3 任务的禁止/许可4 时间片轮旬作为Itron系统并没有提供这种支持,但是可以通过现有系统提供的服务实现这种支持,这个在后面进行说明,详细内容请参考:3.1.3 任务的状态管理任务根据运行时所必须的资源获得状况,以及有无事件发生来实现状态的迁移,所以内核必须管理各任务当前所处的状态。3.1.3.1 ITRON系统状态定义操作系统的职责是控制任务的执行,这里包括决定任务交替的方式和资源的分配原则,所以为了达成这个目标,就需要描述任务的行为-即任务的状态。在ITRON中,将任务划分为如下七个状态进行管理,在任意时刻,任务状
13、态只能属于这七个状态之一。未登录状态:non_existent没有作为任务的注册到系统中,或被消除没能登录到系统中的状态。也就是说虽然已经装配到内存中,但不受OS管理的程序。休眠状态:dormant任务生成时的状态(cre_tsk系统调用时)或者是运行终了时的状态。处于dormant状态的任务,已经从调度对象中删除掉了。就绪状态:ready成为内核调度对象管理的状态。虽然已经具备除了处理机之外的所有必要资源,但是由于有比该任务优先级别更高(或者相同任务优先级别)的任务正在运行,等待运行权到达的状态,也就是说,只要运行权到达,马上迁移到run状态的状态。运行状态:run得到了系统的控制权,正在处
14、于运行处理中的状态。系统中处于运行状态的任务只能有一个。等待状态:wait由于缺少运行的必要条件,不能进入到运行状态的状态,也就是说正在等待必要运行条件到达的状态。从wait状态的重新执行是从进入到wait状态时中断的场所开始执行,也就是说运行程序时必要的各种内部环境(寄存器、堆栈等)会复原。挂起状态:suspend被其他任务情知中断执行(sus_tsk调用的发行)的状态,还有可以通过多重发行sus_tsk调用,使suspend状态嵌套。Suspend状态的解除是通过发行rsm_tsk系统调用来进行的。但是如果要发行依次rsm_tsk系统调用来解除被嵌套的suspend状态,必须要选择参数T_
15、FRCPSM(0X1)。从syspend状态重新实行是指从为进入suspend状态处理中断的位置开始。也就是说运行程序时必要的各种内部环境(寄存器、堆栈等)会复原。双重等待状态:wait_suspend由上面wait状态和suspend状态合成的状态,也就是对应于wait状态发行了sus_tsk调用的场合迁移到的场合。Wait_suspend状态是当suspend状态被解除时,就迁移到wait状态,而wait状态被解除时,就迁移到suspend状态。3.1.3.2 任务状态迁移与系统调用各个任务是通过系统调用的发行,来实现状态的迁移的,具体的状态迁移关联关系情参考图3.1.3.2-1:图3.1
16、.3.2-1任务的状态迁移关系图各迁移过程的详细说明请参照表3.1.3.2-1状态迁移说 明系统调用Nonexistent-dormant任务生成cre_tskNonexistent-ready不可-Nonexistent-run不可-Nonexistent-wait不可-Nonexistent-suspend不可-Dormant-nonexistent任务的删除del_tskDormant-ready任务的启动sta_tskDormant-run不可(注1)-Dormant-wait不可-Dormant-suspend不可-Ready-nonexistent不可-Ready-dormant任
17、务的强制终了ter_tskReady-run在ready状态的任务中,优先级成为最高的任务-Ready-wait不可-Ready - suspend任务的强制等待sus_tskRun-nonexistent任务的终了并自删除Exd_tskRun-dormant正常终了Ext_tskRun-ready任务的自中断,接受系统的调度(注2)-Run-wait等待要因的发生:时间等待唤醒等待Event Flag等待Semaphore等待消息等待内存块等待Wai_tskSlp_tskWai_flgWai_semRcv_msgGet_blkRun-suspend不可-Wait-nonexistent不可-
18、Wait-dormant任务的强制终了Tet_tskWait-ready等待要因发生:Time out唤醒等待Eventflag等待Semaphore等待消息等待内存块等待Wup_tskSys_wupSet_flgSig_semSnd_msgRel_blkWait-run不可(注3)-Wait-wait_suspend任务的强制等待Sus_tskSuspend-nonexistent不可-Suspend-dormant任务的强制终了Ter_tskSuspend-ready强制等待的解除Rsm_tskSuspend-run不可(注4)-Suspend-wait不可-Suspend-wait_su
19、spend不可-Wait_suspend-wait强制等待的解除Rsm_tskWait_suspend-suspend等待要因的解除Vsnd_sig表3.1.3.2-ITRON任务的状态迁移关系表1. 通过sta_tsk调用后有时会从dormant状态迁移到run状态,但实际上是经过ready状态后迁移到run状态的。2. 当出现比自任务有更高有限级的任务或对于自任务发行rot_rdp系统调用。3. 通过等待要因发生后,有时从suspend状态迁移到run状态名单实际上是经过ready状态的。4. 通过rsm_tsk系统调用发现有时从suspend状态迁移到run状态,但实际上是经过ready
20、状态的。3.1.4 任务的应用 创建任务在Itron系统中创建任务存在两种方式,一种方式是静态注册任务;另一种方法是动态的创建任务。动态创建任务主要通过cre_tsk调用来实现的。 激活任务Itron系统中,初始创建的任务的状态是Dormant状态,这个时候任务还处于系统无法调度的状态,所以必须激活任务,激活任务的系统调用是sta_tsk,作用就是将指定任务由Dormant状态迁移到Ready状态。 终止任务在Itron系统中如果需要实现将任务由ready state, run state, wait state, suspend state, wait-suspend state迁移到Dor
21、mant状态的话,需要通过下面两种方式实现,正常终止和强制终止。正常终止是任务自身主动放弃系统的使用权。强制终止是任务自身出现错误,无法自主释放系统使用权,这个时候只能通过其他任务来完成对本任务使用权的剥夺。实现任务终止的系统调用主要有下面三个: ext_tsk system callThe task that issued the ext_tsk system call is switched from the run state to the dormant state. exd_tsk system callThe task that issued the exd_tsk system
22、call is switched from the run state to the non-existent state. ter_tsk system callThe task specified by the parameters is forcibly switched to the dormant state. 删除任务实现任务状态从Run或者Dormant状态切换到nonexistent状态,实现这个功能主要通过下面两个调用来完成的。 exd_tsk system callThe task that issued the exd_tsk system call is switche
23、d from the run state to the non-existent state. del_tsk system callThe task specified by the parameters is switched from the dormant state to the non-existent state.3.1.5 任务的设计3.1.5.1 任务划分的原则在将一个软件系统分解成并行任务时, 主要需考虑的是系统内功能的异步性。可以通过分析数据流图中的变换, 确定哪些变换可以并行, 而哪些变换在本质上是顺序的,通过这种方法, 划分出任务: 一个变换对应一个任务,或者一个任务
24、包括几个变换。一个变换是应该成为一个独立的任务, 还是应该和其它变换一起组成一个任务, 决定的原则如下: I/O 依赖性 (Dependency on Input/Output Device) 时间关键性的功能 (Time-critical functions-Hard Deadline) 计算量大的功能Heavy Computation function 功能内聚Functional relations 时间内聚Temporal relations 周期执行的功能Cyclic executing function3.1.5.2 I/O 依赖性如果换依赖于I/O, 那么它运行的速度常常受限于与
25、它互操作的I/O 设备的速度在这种情况下, 变换应成为一个独立的任务。 在系统中创建多个与I/O 设备相当数目的I/O 任务 I/O 任务只实现与设备相关的代码 I/O 任务的执行只受限于I/O 设备的速度而不是处理器 在任务中分离设备相关性3.1.5.3 时间关键性的功能对于事件关键性的功能对响应的时间要求的第一重要的,所以对于这类任务的响应的优先级别比较高。 将有时间关键性的功能分离出来组成独立运行的任务 赋予这些任务高的优先级以满足对响应时间的需要3.1.5.4 计算功能复杂的计算功能一般运行时间比较长,所以对于这类功能的设计的原则如下: 计算功能占用CPU 的时间多 捆绑计算功能成任务
26、赋予它们较低优先级运行, 能被高优先级的任务 抢占消耗CPU 的剩余时间 保持高优先级的任务是轻量级的 多个计算任务可安排成同优先级按时间片循环轮转3.1.5.5 时间内聚 将在同一时间内完成的各功能,即使这些功能是不相关的组成功能组形成一个任务 功能组的各功能是由相同的外部事件驱动的,如时钟等这样每次任务接收到一个事件, 它们都可以同时执行 组成一个任务,减少了系统的开销虽然时间内聚在结构化设计中并不被认为是一个好的模块分解原则, 但在任务级是可以被接受每个功能都作为一个独立的模块来实现, 从而达到了模块级的功能内聚, 这些模块组合在一起, 又达到了任务级的时间内聚3.1.5.6 周期执行功
27、能 将在相同周期内执行的各功能组成一个任务 频率高的赋予高优先级3.1.5.7 任务设计的误区 错误的任务划分原则任务使用SUPSPEND/RESUME 太频繁,是由于任务划分过细任务的当成功能使用,改进的方法是将任务变成子程序使用。当事件发生时调用子程序,任务划分的太粗将子程序划分为任务,得到消息后又立即检查另外的信息,不要使用轮循的方式直接使用事件驱动方式 优先级倒置当低优先级的任务向高优先级的任务发送消息时,高优先级的任务不能运行,直到低优先级的任务发送消息后才能运行。这种情况下就没有必要分为两个任务只需要使低优先级的任务调用子程序即可。 死锁两个任务同时相互等待对方的信号,导致它们永远
28、不能运行。为了避免死琐将共享资源统一排序所有的任务按序来访问多个资源。等待的事件没有发生过或者不具备等待事件的发生条件。3.2 同步和通信管理在多任务的实时系统中,一项工作的完成往往要通过多个任务或多个任务与多个中断处理过程(ISRs)共同完成。它们之间必须协调动作互相配合,甚至需要交换信息进行通信。这些通信和同步的需要是:1. 任务能和其他任务及ISRs 交换数据2. 任务能以以下方式与其他任务进行同步 单向同步一个任务与另一个任务或一个ISR 同步 双向同步两个任务相互同步 与同步 一个任务与几个事件同时同步 或同步 一个任务与几个事件中的任何第一个到达事件同步3. 任务必须能对共享资源进
29、行互斥访问为了满足任务间通信同步和互斥的需要,同时保证资源被安全的使用,必须对多个相关任务在执行的次序上进行协调。ITRON系统主要提供了如下一些同步机制。 Event Flag,任务间的协调功能。 Semaphore,对系统资源进行排他访问。 MailBox,任务之间进行的信息通信。以下章节将针对这些系统同步方式进行详细的说明。3.2.1 Event Flag在多任务处理系统中,需要等到一个任务终了后,其他任务再开始启动的等候功能,这个时候,需要拥有对其他任务是否终了进行判断的能力,ITRON系统中提供了Event Flag.来实现这个机能。ITRON系统中,一个Event Flag是ITR
30、ON工作区中的一个32 位的变量。32 位中的每一位都是表示一个事件标志,事件标志有两种状态,设置(1)和清除(0)。当一个标志处于设置状态时,表示相关的事件已经发生了,任务和ISRs 可以使用事件标志来向其他任务发送信号, 表示事件已发生。图3.2.1-1 Event Flag示意图上图中,人相当于任务,火把表示Event Flag,在没有得到通知之前,等待信号的人处于等待状态,当发送信号的人发送了通知之后,处于等待状态的人将被激活,便开始自己的作业了,这就是一个完整的Event Flag使用过程事例。3.2.1.1 基本调用 ITRON系统中提供下面基本调用,实现了Event Flag的基
31、本机能,详细描述可以参照手册:cre_flg: Generates an event flag.del_flg: Deletes an event flag.set_flg: Sets a bit pattern.clr_flg: Clears a bit pattern.wai_flg: Checks a bit pattern.pol_flg: Checks a bit pattern (by polling).twai_flg: Checks a bit pattern (with timeout setting).ref_flg: Acquires event flag informa
32、tion.vget_flg: Acquires event flag ID number.vset_flg1: Sets a bit. vwai_flg1:Checks a bit.3.2.1.2 Event Flag的应用一般来说,Event Flag为任务之间的等待操作提供了场所,下面是其操作方法:任务间的等候需要能够传达Event的任务和等待Event发生的任务,传达Event任务通过发行set_flag调用来传递信息,另一方面等待Event任务对事件发行等待调用,并且参照等候模式。如果event flag的位模式与等待位模式一致时,任务可以继续进行处理,如果不一致,任务就不做继续处理,
33、迁移到wait状态,并进入到event的等待队列中。图3.2.1.2-1表示了两个Task通过32Bit Event Flag传递信息的范例:图3.2.1.2-1 32Bit Event Flag使用时Task间同步方法图3.2.1.2-2表示了4个Task利用1Bit Event Flag传递信息的执行范例:图3.2.1.2-2 1Bit Event Flag使用时Task间同步方法 Event Flag的生成Event Flag的生成是通过cre_flg系统调用进行的,在Itron系统中,cre_flg调用从系统工作区中创建一个32bit的事件标志组,并返回Event Flag的ID号。
34、Event Flag的删除通过del_flg调用可以实现对Event Flag的删除,当产生删除操作的时候,该系统中存在等待本Flag操作的任务,这个时候,处于等待Eveng Flag的任务将解除等待操作,并迁移到Ready状态。 Event Flag的设定通过set_flg调用,可以实现Event Flag的设定,当本调用发行后,处于等待Event Flag发行的任务的状态将由等待状态迁移到Ready状态。 Event Flag的清除通过clr_flg调用,可以实现Event Flag的清除,保证Event Flag能够有初始化值。 Event Flag的等待关于Event Flag的等待有
35、三种方式,wai_flg, pol_flg, 和twai_flg,他们存在一些细微的差别。 wai_flg:如果Event Flag已经被设置,系统将保持运行,如果没有存在满足运行条件的Flag,系统将迁移到等待状态,一直到满足运行条件的事件发生。 pol_flg:任务直接查询Event Flag,如果满足运行条件的事件发生,系统保持运行状态不变,如果没有满足运行条件的事件发生,系统将直接返回,不仅性等待操作。 twai_flg:在制定的时间内,如果存在满足运行条件的事件发生,系统将保持运行状态不变,否则系统将按照指定的时间进行等待,Timer Out之后,系统迁移到Ready状态。等待条件的
36、设定:因为Event Flag是一个32Bit的位群,所以在进行Event Flag的设定的时候可以按照条件的逻辑进行设定,主要的逻辑有And和Or两种,需要根据实际情况进行有选择的使用。And:多个条件同时存在的时候,才满足任务的运行条件。Or:当设定的多个条件有一个满足的时候,运行条件成立。3.2.2 Semaphore虽然多任务系统中的各个Task可以共享各类资源,但是有些资源却一次只能被一个任务使用,因此防止同时动作的多个任务出现资源争执的需要,ITRON系统中提供了非负计数器-Semaphore,由管理资源个数的计数器进行资源使用得调配。一个计数信号量是ITRON工作区中的一个16
37、位的变量,初始值可以是065535,表示可以使用的资源数量,初始值为0表示资源开始处于锁住状态,一个非0的值表示有多个资源供多个任务访问。图3.2.2 1 Semaphore示意图上图种停车场中的停车位置相当于存在使用竞争的资源,车相当于任务,空闲的车位数量相当于Semapjore的计数,当停车场中没有空位的时候,没有进入到停车场的车处于等待状态,当停车场中有车离开的时候,表示当前有空闲的车位,这时就有车可以进入,并且空闲的位置与可以进入的车是等数量的,这个就是一个Semaphore的使用范例,可以通过这个过程来体会Semaphore的使用。 基于FIFS方式的等待机制基于上图的示例,ITRO
38、N系统提供的方法是为任务提供等待队列,并且系统分配消息的方式是基于FIFS方法的,不区分任务的优先级别。3.2.2.1 基本调用ITRON系统中提供下面基本调用,实现了Semaphore的基本机能,详细描述可以参照手册:cre_sem: Generates a semaphoredel_sem: Deletes a semaphoresig_sem: Returns a resourcewai_sem: Acquires a resourcepreq_sem: Acquires a resource (by polling)twai_sem: Acquires a resource (with
39、 timeout setting)ref_sem: Acquires semaphore informationvget_sid: Acquires semaphore ID number3.2.2.2 Semaphore的应用一般来讲,semaphore是使用在任务之间排他控制的机构,下面是其操作的方法:首先定义semaphore关联的资源数,对资源进行使用的task首先进行资源的查询,如果能够从semaphore中获得资源的任务,任务将继续处理,然后在不需要使用资源时,便发行释放资源使用权的调用。另外如果不能从semaphore中获得到所要的资源,任务便不能继续执行,迁移到wait状态,并
40、登录到semaphore的等待队列中。处于等待的过程中的Task,如果可以得到资源,任务便从等待状态中脱出,迁移到ready状态。图3.2.2.2-1表示了三个Task共享n个资源的情况,请参照:图3.2.2.2-1利用Semaphore实现资源的排他使用 创建信号量Itron系统提供两种创建Semaphore的方法,一种是静态注册,另一种是通过系统调用来动态创建。动态创建是通过cre_sem的方法来实现的。 删除信号量Itron系统中通过del_sem调用实现semaphore的删除。当删除semaphore被执行的时候,如果与本资源关联的任务等待队列中存在等待资源的任务时候,这些任务的状态
41、将自动切换到Ready状态。 释放资源Itron系统中通过sig_sem调用实现资源的释放,可以归还资源的数量由sig_sem的参数决定。 资源请求主要有下面三种方式可以实现资源的请求:wai_sem、preq_sem和twai_sem;他们虽然都实现资源的申请,但是使用时还有一些细微的差别: wai_sem:当系统没有满足任务需要的资源数量的时候,系统状态将迁移到等待状态,直到系统中存在可以使用的资源为止。 preq_sem:查询系统资源,如果存在满足系统需要的资源,则申请使用,如果没有满足需要的资源,系统将不申请资源,但是运行状态保持不变。 twai_sem:在申请资源的时候,可以指定等待
42、的时间,如果在制定的时间内申请到资源,则系统继续保持运行,如果在制定的时间内没有申请到可用的资源,系统将解除等待状态。3.2.3 MailBox为了实现任务之间的通信功能,ITRON提供了邮箱,并且邮箱包含有多任务应用的等待队列和邮箱专用的信息等待队列,除了任务之间的通信功能使用,也作为任务之间的协作功能使用。当一个任务执行发送原语时,有两种可能性,一种可能是接收者已经处于等待状态;另外一种可能是消息发送时,接收者没有处于等待收信状态;下面将针对这两种情况进行示例说明:1. 下图表示了消息先于收信者到达的情况,这时信件被投入信箱之后,便被缓存了起来,等待收信者取得信件。同时收信者到达之后,取得
43、信件之后,便根据信件的指示进行相关作业。图3.2.3-1 消息先于收信者到达的示例基于上图消息等待方式的实现在ITRON系统的实现方法是为Message提供等待队列作为缓冲,并且对于从队列中取得信息的方式提供了两种方式作为支持,一种是FIFS,即先到达的信件被优先取走,另一种是对消息进行优先级别的指定,这样就可以保证高优先级别的消息可以得到优先的取得权。 基于FIFS方式的等待机制这种机制下所有消息都是平等的,他们的取得顺序完全取决于他们到达邮箱的时间,在邮箱中等待时间长的消息有优先被执行的权力。图3.2.3-2基于FIFS的消息等待机制 基于优先级方式的等待机制这种机制下的消息是存在优先级别
44、的,高优先级别的消息会获得优先执行权力,但是对于拥有相同优先级别的消息,他们的等待方式还是基于FIFS的方式进行的。图3.2.3-3基于优先级方式的消息等待机制2. 下图表示了收信者先于发信者到达的等待方式,这时收信者开始处于等待状态,当发信者将消息投入到邮箱之后,收信者便重新处于激活状态,这时只要执行条件满足,便可以根据消息的指示进行相关作业。图3.2.3-4收信者先于消息到达的示例 基于FIFS方式的等待机制基于上图的示例,ITRON系统提供的方法是为任务提供等待队列,并且系统分配消息的方式是基于FIFS方法的,不区分任务的优先级别。图3.2.3-5任务等待消息的Itron实现3.2.3.
45、1 基本调用对邮箱的操作,系统主要提供了如下的调用:cre_mbx: Generates a mailbox.del_mbx: Deletes a mailbox.snd_msg: Sends a message.rcv_msg: Receives a message.prcv_msg: Receives a message (by polling).trcv_msg: Receives a message (with timeout setting).ref_mbx: Acquires mailbox informationvget_mid: Acquires mailbox ID number3.2.3.2 MailBox的应用一般来说,邮箱是任务之间信息通信过程中的场所,下面是使用方法:在任务之间的信息通信里,需要给邮箱分配送信的任务(发报任务)和接受这个信息的任务(接受任务)。这时如果邮箱里已经有任务被排列在队列里,信息就会