- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
uC-OSII信号量实验精要
利用信号量访问共享资源(二合一实验报告)
一、实验目的
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()函数-------用来获取信号量
函数原型:
void OSSemPend ( 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 //定义用户任务优先级为8
OS_STK PhiTaskSTK[5][TASK_STK_SIZE]; //定义哲学家任务堆栈数组
OS_STK UserTaskStk[TASK_STK_SIZE]; //定义用户任务堆栈
//定义一个字符串数组并初始化
char *Man1[3]={哲学家,我在思考,哲学家,我在吃饭,哲学家,我饿了};
OS_EVENT *Sem[5] ; //定义五个信号量代表
文档评论(0)