文档详情

uC-OSII信号量实验.docx

发布:2016-12-31约6.67千字共10页下载文档
文本预览下载声明
利用信号量访问共享资源(二合一实验报告)一、实验目的1.学习并熟悉uC/OS-II中信号量的使用2.利用信号量访问共享资源3.学习使用单任务函数处理多任务方法二,知识准备 1.共享资源所谓共享资源是指在一个系统或应用中,多个任务都可以访问(读写)的数据。这些数据可以是内存中的数据,也可以是设备(例如打印机)。按共享资源的可获得性,它们可以被分为两大类,一类是开始时就具有一个或一个以上的实体或副本,可以被一个或者多个任务同时使用。另一类则是开始时系统中并没有该种资源,任何任务都无法使用。要想使用此类资源,必须等待系统中某种机制将其创建之后才有可能。既然被称作共享资源,那么在使用这些资源前,任务首先要确认它的可用性,即申请资源的使用权。只有在获得使用权后,任务才能对其进行操作。同样的道理,当资源被使用完毕之后,任务将其归还到系统中,便于其他任务申请使用。在ucos-ii中,资源的创建、申请和归还,可以通过信号量来实现。信号量作为资源可用性的标志,与资源可用数量对等。利用uC-OSII提供的信号量服务,任务就可以完成对资源的申请和释放。2.信号量函数解析①OSSemCreate()函数—信号量创建函数函数原型: OS_EVENT* OSSemCreate(INT16U value)参数意义:INT16U value 信号量初始值。value的值为可被同时使用资源的个数。返回值信号量指针。指向系统为该信号量分配事件控制块数据区。无法创建时,返回空指针。②OSSemPost()函数—-----用来释放信号量函数原型:INT8U OSSemPost(OS_EVENT *pevent);参数说明:pevent是指向信号量的指针。该指针的值在建立该信号量时可以得到。返回值:* OS_NO_ERR :信号量被成功地设置。* OS_SEM_OVF :信号量的值溢出。* OS_ERR_EVENT_TYPE :pevent不是指向信号量的指针。③OSSemPend()函数-------用来获取信号量函数原型:voidOSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );参数意义:pevent是指向信号量的指针。该指针的值在建立该信号量时可以得到。timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时恢复就绪状态。如果该值为零表示任务将持续地等待信号量,最大的等待时间为65535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差。err 是指向包含错误码的变量的指针,返回的错误码可能为下述几种:* OS_NO_ERR :信号量不为零。* OS_TIMEOUT :信号量没有在指定数目的时钟周期内被设置。* OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但μC/OS-Ⅱ仍然包含了检测这种情况的功能。* OS_ERR_EVENT_TYPE :pevent不是指向信号量的指针。返回值:无三、实验内容1.哲学家就餐问题2.家庭水果问题3.单行线问题四、实验代码1,哲学家问题main.c#include includes.h# define TASK_STK_SIZE 512 //定义任务堆栈大小# define TASK_USERTASK_TASK_SIZE 512//定义用户堆栈大小# define Man1_Task_Prio 2# define Man2_Task_Prio 3# define Man3_Task_Prio 4# define Man4_Task_Prio 5# define Man5_Task_Prio 6 //定义各个人的任务优先级分别为;2,3,4,5,6;# define UserTask_Prio 8 //定义用户任务优先级为8OS_STK PhiTaskSTK[5][TASK_STK_SIZE]; //定义哲学家任务堆栈数组OS_STK UserTaskStk[TASK_STK_SIZE]; //定义用户任务堆栈//定义一个字符串数组并初始化char *Man1[3]={哲学家,我在思考,哲学家,我在吃饭,哲学家,我饿了};OS_EVENT *Sem[5] ; //定义五个信号量代表5根筷子voidPhiTask(void* para);void thinking(inti);void eating(inti);void hungry(inti);void UserTask(void *pParam);
显示全部
相似文档