实验四 uCOS II多事件同步实验 - 下载本文

实验四 uC/OS II多事件同步实验

一、实验目的

?

回顾uC/OS II 在Cortex-M3(LM3S9B2芯片)平台上的移植,以及RS232串口、TFT显示等驱动程序的加载。 ?

回顾μC/OS-II任务管理的基本函数调用,任务堆栈、任务控制块、任务就绪表的结构和作用。 ?

回顾嵌入式操作系统任务间通信的基本原理,消息邮箱和消息队列进行任务间的数据交换、数据通信等的基本函数,以及常用的应用场合。 ?

掌握信号量、互斥信号量以及信号量集的基本函数以及相关原理。

应用μC/OS-II中的信号量、互斥信号量以及事件组(信号量集)处理简单的实际问题。

?

二、实验环境与设备

1、实验独立进行,每位学生上交一份实验报告及其相应的程序。

2、安装Windows操作系统(Windows Xp)的计算机,并且已经安装VC 6.0编程调试软件。

3、安装Keil for ARM 仿真调试软件,JLink软件,超级终端或者串口精灵等辅助调试工具。

4、Cortex-M3(LM3S9B92内核)评估板,串口线,USB线,电源等。

三、预习要求 1. 基本概念

在μC/OS-II操作系统中,系统中的多个任务在运行时,经常需要相互无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。因此,μC/OS-II操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。

在上一次的实验中,我们讨论并应用消息邮箱和消息队列完成了一些列的实验。在uC/OS II中,除了消息邮箱和消息队列外,信号量、互斥信号量,以及事件组等都是为多任

务间的同步与通信设计的,他们都在事件数据结构中定义。事件的数据结构如下:

typedef struct {

INT8U OSEventType; INT16U OSEventCnt; void *OSEventPtr; INT8U OSEventGrp;

//事件的类型 //信号量计数器 //消息或消息队列的指针 //等待事件的任务组

INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表 } OS_EVENT;

其中OSEventType用来指明事件的类型

OS_EVENT_TYPE_SEM 表明事件是信号量,值为3。 OS_EVENT_TYPE_MUTEX 表明事件是互斥信号量,值为4。 OS_EVENT_TYPE_MBOX 表明事件是消息邮箱,值为1。 OS_EVENT_TYPE_Q 表明事件是消息队列,值为2。 OS_EVENT_TYPE_UNUSED 表明事件控制块是未被使用,值为0。

OS_EVENT管理整个任务间的通信,而哪几个任务彼此通信,怎样通信,则由应用程序决定。

OSEventCnt只对类型为信号量的事件,信号量的个数计数。而其它类型的事件则另外含义,或不使用。

信号量:信号量用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥,信号量一般分为三种:互斥信号量、二值信号量和计数信号量。其中互斥信号量用于解决互斥问题,例如打印机的共享,全局变量的共享等,它比较特殊,可能会引起优先级反转问题;二值信号量主要用于解决同步问题,例如作业的流程等;计数信号量主要用于解决资源的计数问题。

事件组:事件组主要用于解决多事件同步问题,它主要由两部分组成:1.标志组,用于存放了事件组(信号量集)中的所有事件(信号);2. 等待任务链表:每个节点都对应一个正在等待事件组(信号量集)的等待任务。事件组的数据结构描述如下:

typedef struct{

INT8U OSFlagType; //识别是否为信号量集的标识 void * OSFlagWaitList; //指向等待任务链表的指针 OS_FLAGS OSFlagFlags; //所有信号量列表(系统缺省16位) } OS_FLAG_GRP; 2. 部分相关函数介绍

1). 创建信号量 OSSemCreate()

函数原型: OS_EVENT * OSSemCreate( INT16U cnt ); 其中:-cnt 是信号量计数器的初始值 2). 请求信号量 OSSemPend() 和 OSSemAccept() 3). 发送信号量 OSSemPost() 4). 查询信号量的状态 OSSemQuery() 5). 删除信号量 OSSemDel() 6). 和互斥信号量相关的函数

创建互斥信号量 OSMutexCreate( );

请求互斥信号量 OSMutexPend( ) 和 OSMutexAccept( ); 发送互斥信号量 OSMutexPost( ) ; 查询互斥信号量 OSMutexQuery( ); 删除互斥信号量 OSMutexDel( ); 7). 和事件组(信号量集)相关的函数

创建信号量集 OSFlagCreate( );

请求信号量集 OSFlagPend( ) 和 OSFlagAccept( );

发送信号量集 OSFlagPost( ) ; 查询信号量集 OSFlagQuery( ); 删除信号量集 OSFlagxDel( );

四、实验内容

1. 基本部分:主要包括信号量、互斥信号量和信号量集的创建、发送、请求、查询与删除。在它们的创建、删除、查询的过程中,请注意事件控制块ECB的变化,并通过单步调试跟踪变化,并说明理由。

1)在Cortex-M3系统下,移植μC/OS-II操作系统,并通过调整os_cfg.h中的宏定义,裁剪/增加μC/OS-II的相关组件;

2)设计多个任务,实现信号量、互斥信号量和信号量集的创建、发送、请求、查询与删除,并将结果通过RS232显示在PC上;

3)设计一个多任务的系统,利用互斥信号量模拟打印机的共享问题。

2. 综合部分:应用μC/OS-II中的信号量集实现+、—、*、/以及(、)的 运算,并将结果显示在TFT屏幕上面,该问题的难点在于(、)的运算。

五、实验报告要求

1. 问题描述: 针对每一个实验部分,描述问题背后的基本原理; 2. 设计:

⑴ 针对问题进行分析,并针对每个实验部分画出相应的程序流程图; ⑵ 各个程序?楸匦胍邢嘤Φ淖⑹;

⑶ 主要程序?榈氖淙、处理(算法框架描述)和输出描述; ⑷ 主要程序之间的调用与被调用关系等。

3. 测试: 测试范例,测试结果,测试结果的分析与讨论,测试过程中遇到的主要问

题及所采用的解决措施.

4. 打印一份程序清单及运行示例的结果。

将以上各项文字材料及程序清单等装订成册,形成一个完整的实验报告。





快乐十分开奖结果陕西