优先级继承和哲学家就餐实验_第1页
优先级继承和哲学家就餐实验_第2页
优先级继承和哲学家就餐实验_第3页
优先级继承和哲学家就餐实验_第4页
优先级继承和哲学家就餐实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2013年4月9日实验实验一优先级继承1实验目的掌握嵌入式实时操作系统C/OS-II解决优先级反转的策略一一优先级继承的原理。2原理及程序结构2.1 实验设计2.1.1 优先级继承原理优先级继承的主要思想是:当高优先级任务因申请某共享资源失败被阻塞时,把当前拥有该资源的、且优先级较低的任务的优先级提升,提升的高度等于这个高优先级任务的优先级。在心/OS-II中,在创建管理共享资源的互斥信号量时,可以指定一个PIP(优先级继承优先级),之后可以把拥有共享资源的任务优先级提升到这个高度。具体过程如下:1 .当任务A申请共享资源S时,首先判断是否有别的任务正在占用资源S,若无,则任务A获得资源S并继

2、续执行;2 .如果任务A申请共享资源S时任务B正在使用该资源,则任务A被挂起,等待任务B释放该资源;同时判断任务B的优先级是否低于任务A的,若高于任务A,则维持任务B的优先级不变;3 .如果任务B的优先级低于任务A的,则提升任务B的优先级到PIP,当任务B释放资源后,再恢复其原来的优先级。2.1.2 设计要点在本实验中设计了处于不同优先级的应用任务,如下图所示:任务TASK1 :任务TASK2 :任务TASK0:图1-1注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各个任务启动和执行的相对先后关系。这3个应用任务因为要竞争同一互斥资源mutex而相互制约。其中,任务TASK0的原始优先级最

3、低,任务TASK1的原始优先级中等,任务TASK2的原始优先级最高。在使用mutex时采用优先级继承策略,并指定各任务在使用mutex时的PIP(优先级继承优先级)为8。2.1.3 系统的运行流程TaskStart任务首先运行,由它创建其他3个应用任务:voidTaskStartCreateTasks(void)INT8Ui;for(i=0;i<N_TASKS;i+)/*CreateN_TASKSidenticaltasks*/TaskDatai = i;/*Eachtaskwillpassitsownid*/OSTaskCreate(Task,(void*)&TaskDatai

4、,&TaskStkiTASK_STK_SIZE-1,12-i);每个任务的代码均如下所示:voidTask(void*pdata)INT8Uerr;INT8Uid;id=*(int*)pdata;for(;)printk("task%dtrytogetthemutex.n",id);OSMutexPend(mutex,0,&err);/*Acquiremutextogetcontinue*/printk("task%disgettingthemutex.n",id);OSTimeDlyHMSM(0,0,0,200);/*Wait200mi

5、nisecond*/printk("task%dreleasesthemutex.n",id);OSMutexPost(mutex);/*Releasemutex*/OSTimeDlyHMSM(0,0,0,(3-id)*150);/*Wait(3-id)*150minisecond*/TaskStart任务挂起后,操作系统调度它所创建的3个应用任务,整个系统的运行流程如下:(1)TASK2拥有最高优先级10,最先开始运行,它在t1时刻,执行OSMutexPend(mutex,0,&err),成功获得互斥信号量mutex;(2)t2时刻,TASK2执行延时函数OSTi

6、meDlyHMSM(0,0,0,200)被挂起200ms,操作系统调度优先级次之的TASK1运行;(3)t3时刻,TASK1执行OSMutexPend(mutex,0,&err)申请互斥信号量失败后被阻塞,操作系统调度优先级最低的TASK0运行。TASK0执行OSMutexPend(mutex,0,&err)申请互斥信号量失败后也被阻塞。在TASK1和TASK0被阻塞的时候,由于当前拥有mutex的TASK2优先级最高,因此保持其优先级不变。当所有的应用任务都阻塞时,系统有一个空闲任务在它的优先级最低;运行,这个空闲任务是在初始化操作系统的时候创建的,(4)t4时刻,TASK2

7、延时到并运行,它执行OSMutexPost(mutex)释放互斥信号量并由TASK1获得此信号量。t5时刻TASK2将自己延时一段时间(150ms),任务回到运行状态;(5) TASK1执行延时函数OSTimeDlyHMSM(0,0,0,200)后被挂起200ms,空闲任务运行;在t6时刻TASK2因延时时间到恢复执行,它执行OSMutexPend(mutex,0,&err)申请互斥信号量失败后被阻塞,空闲任务运行。此时操作系统发现当前拥有信号量的任务TASK1的优先级低于TASK2的,因此将TASK1的优先级提升到PIP,但TASK1此时仍处于延时状态未运行;(7)t7时刻,TASK

8、1延时到,它在高优先级(PIP)下继续运行,调用OSMutexPost(mutex)释放互斥信号量并由TASK2获得此信号量,TASK1的优先级恢复到原来的高度,而TASK2因优先级较高而抢占TASK1运行(在t8时刻);(8)TASK2又将自己延时一段时间(200ms),任务TASK1恢复执行后也将自己延时一段时间(300ms),空闲任务运行;t9时刻TASK2延时时间先到,它执行OSMutexPost(mutex)释放互斥信号量,此时TASK0获得此信号量; 9) t10时刻,TASK2延时(150ms),任务TASK0被调度运行;TASK0在打印输出信息后,将自己延时(200ms),空闲

9、任务运行; 10) 10)t11时刻,TASK1延时到恢复运行。TASK1执行OSMutexPend(mutex,0,&err)申请互斥信号量失败后被阻塞;此时操作系统发现当前拥有信号量的TASK0优先级低于TASK1的,因此提升TASK0的优先级到PIP,空闲任务运行; 11) 11)t12时刻,TASK2延时到恢复运行,它执行OSMutexPend(mutex,0,&err)申请互斥信号量失败后被阻塞;此时拥有信号量的TASK0的优先级已经被提升到了PIP,且高于TASK2的优先级,操作系统就没有针对TASK0再做优先级提升的工作。之后空闲任务运行; 12) 12)t13时

10、刻,TASK0延时到,在高优先级(PIP)下继续运行,它执行OSMutexPost(mutex)释放互斥信号量,其优先级恢复到原来的高度,并由TASK2获得此信号量,TASK2抢占TASK0运行;系统如此周而复始地运行下去2.2操作系统配置修改uC_OS-II/OS_CFG.h:#defineOS_MAX_EVENTS10/*最多可以有10个事件*/#define OS_MAX_FLAGS5/*最多可以有5 个事件标志*/#define OS_MAX_MEM_PART5/* 最多可以划分5 个内存块 */#define OS_MUTEX_QUERY_EN1/* 是否允许使用OSMutexQue

11、ry()*/#defineOS_MAX_QS/*最多可以使用2个队列*/#defineOS_MAX_TASKS/*最多可以创建6个任务*/#defineOS_LOWEST_PRIO14/*任务优先级不可以大于14*/#defineOS_TASK_IDLE_STK_SIZE1024/*空闲任务堆栈大小*/#defineOS_TASK_STAT_EN/*是否允许使用统计任务*/#defineOS_TASK_STAT_STK_SIZE1024/*统计任务堆栈大小*/#defineOS_FLAG_EN/*是否允许使用事件标志功能*/#defineOS_MBOX_EN/*是否允许使用邮箱功能*/#def

12、ineOS_MEM_EN/*是否允许使用内存管理的功能*/#defineOS_MEM_QUERY_EN/*是否允许使用OSMemQuery()*/#defineOS_MUTEX_EN/*是否允许使用互斥信号量的功能*/#defineOS_MUTEX_ACCEPT_EN/*是否允许使用OSMutexAccept()*/#defineOS_MUTEX_DEL_EN/*是否允许使用OSMutexDel()*/#defineOS_Q_EN0#defineOS_SEM_EN1#defineOS_SEM_ACCEPT_EN1#defineOS_SEM_DEL_EN1#defineOS_SEM_QUERY_

13、EN1#defineOS_TASK_CHANGE_PRIO_ENOSTaskChangePrio()*/#defineOS_TASK_CREATE_EN1#defineOS_TASK_CREATE_EXT_EN1#defineOS_TASK_DEL_EN1/*是否允许使用队列功能*/*是否允许使用信号量功能*/*是否允许使用OSSemAccept()*/*是否允许使用OSSemDel()*/*是否允许使用OSSemQuery()*/1/*是否允许使用/*是否允许使用OSTaskCreate()*/*是否允许使用OSTaskCreateExt()*/*是否允许使用OSTaskDel()*/#de

14、fine OS_TICKS_PER_SEC200/* 设置每秒之内的时钟节拍数目 */#define OS_TASK_SUSPEND_ENOSTaskResume()*/#define OS_TASK_QUERY_EN#define OS_TIME_DL Y_HMSM_ENOSTimeDlyHMSM()*/#define OS_TIME_DL Y_RESUME_ENOSTimeDlyResume()*/#define OS_TIME_GET_SET_ENOSTimeSet()*/#define OS_SCHED_LOCK_ENOSSchedUnlock()*/1/*是否允许使用OSTaskSu

15、spend()and1/*是否允许使用OSTaskQuery()*/1/*是否允许使用1/*是否允许使用1/*是否允许使用OSTimeGet()和1/*是否允许使用OSSchedLock()和3运行及观察应用输生信息4本实验中所用到的以C/OS-II相关函数OSMutexCreate()OSMutexPend()OSMutexPost()实验二信号量:哲学家就餐问题的实现1实验目的掌握在基于嵌入式实时操作系统心/OS-II的应用中,任务使用信号量的一般原理。通过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。2原理及程序结构2.1 实验设计五个哲学家任务(phi、ph2、ph

16、3、ph4、ph5)主要有两种过程:思考(即睡眠一段时间)和就餐。每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放这两支筷子。五个哲学家围成一圈,每两人之间有一支筷子。一共有五支筷子,在该实验中用了五个互斥信号量来代表。如图4-1所示:图2-1每个任务的代码都一样,如下所示:INT8Uerr;INT8Ui;INT8Uj;i=*(int*)pdata;j=(i+1)%5;for(;)TASK_Thinking_To_Hungry(i);/*首先哲学家处于thinking状态,然后执行TASK_Thinking_To_Hungry()函数进入hungry状态*/printk(&

17、quot;n");/*申请信号量,在获得两个信号量后执行TASK_Eat()函数进入eating状态*/#define OS_MAX_TASKS8/* 最多可以创建8 个任务*/OSSemPend(forki,0,&err);OSSemPend(forkj,0,&err);TASK_Eat(i);printk("n");/*释放信号量*/OSSemPost(forkj);OSSemPost(forki);OSTimeDly(200);2.2 操作系统配置修改uC_OS-II/OS_CFG.h:# defineOS_MAX_EVENTS10# def

18、ineOS_MAX_FLAGS5# defineOS_MAX_MEM_PART5# defineOS_MAX_QS2/*Acquiresemaphorestoeat*/*Releasesemaphore*/*Delay200clocktick*/*最多可以有10个事件*/*最多可以有5个事件标志*/*最多可以划分5个内存块*/*最多可以使用2个队列*/#define OS_LOWEST_PRIO14/* 任务优先级不可以大于14*/#defineOS_TASK_IDLE_STK_SIZE1024#defineOS_TASK_STAT_EN1#defineOS_TASK_STAT_STK_SIZ

19、E1024#defineOS_FLAG_EN1#defineOS_FLAG_WAIT_CLR_EN1#defineOS_FLAG_ACCEPT_EN1#defineOS_FLAG_DEL_EN1#defineOS_FLAG_QUERY_EN1#defineOS_MBOX_EN0#defineOS_MEM_EN0#defineOS_MUTEX_EN0#defineOS_Q_EN0/* 空闲任务堆栈大小*/* 是否允许使用统计任务*/* 统计任务堆栈大小*/*是否允许使用事件标志功能*/* 是否允许等待清除事件标志*/* 是否允许使用OSFlagAccept()*/*是否允许使用OSFlagDel

20、()*/* 是否允许使用OSFlagQuery()*/* 是否允许使用邮箱功能*/* 是否允许使用内存管理的功能*/*是否允许使用互斥信号量的功能*/* 是否允许使用队列功能*/* 是否允许使用信号量功能*/#defineOS_SEM_EN1#define OS_SEM_ACCEPT_EN1/* 是否允许使用 OSSemAccept()*/#defineOS_SEM_DEL_EN1#defineOS_SEM_QUERY_EN1#defineOS_TASK_CHANGE_PRIO_ENOSTaskChangePrio()*/#defineOS_TASK_CREATE_EN1#defineOS_T

21、ASK_CREATE_EXT_EN1#defineOS_TASK_DEL_EN1/*是否允许使用OSSemDel()*/*是否允许使用OSSemQuery()*/1/*是否允许使用/*是否允许使用OSTaskCreate()*/*是否允许使用OSTaskCreateExt()*/*是否允许使用OSTaskDel()*/#define OS_TASK_SUSPEND_EN1/*是否允许使用OSTaskSuspend()andOSTaskResume()*/1/* 是否允许使用 OSTaskQuery()*/#defineOS_TASK_QUERY_EN#defineOS_TIME_DLY_HMSM_ENOSTimeDlyHMSM()*/#defineOS_TIME_DLY_RESUME_ENOSTimeDlyResume()*/#defineOS_TIME_GET_SET_ENOSTimeSet()*/#defineOS_S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论