用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信_第1页
用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信_第2页
用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信_第3页
用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信_第4页
用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、实验项目名称:用UC0SII实现任务间共享变量的无冲突访问及任务间的消息邮箱通信和队列通信。实验目的:1、实现任务之间共享变量无冲突的访问2 、实现任务之间消息邮箱的通信3 、实现任务之间的消息队列的通信实验内容(实验过程及问题的解决):实验主要参照了例题4.7、4.8、4.9,将3个例题合成一个任务,满足题目的要求。首先,设置了5个任务,oneTask和foTask2个任务建立了互斥信号*Mutexp,用OSMutexPend(Mutexp,0,&err);和OSMutexPost(Mutexp),并延时等待一秒,进行2个任务的共享变量无冲突访问控制。然后在hertask任务中,显示

2、times的次数,并使用消息邮箱OSMboxPost(Str_Box,s)给twoTask任务邮箱消息,twoTask接收到消息后,根据OSTimeGet()获得系统时间范围来判断要传送给stwoTask任务的字符,并使用OSQPost(Str_Q,s4)和OSQPend(Str_Q,0,&err);进行消息队列的通信。调试与结果测试分析:字符oneTaskrunning和foTaskrunning在互斥信号的条件下,一直循环配对出现,而屏幕上的数字就是消息邮箱传递消息的次数,而twoTaskrunning和stwoTaskrunning各出现了2次,是由于在消息队列邮箱中设置了在10

3、0<OSTimeGet()<500和500<OSTimeGet()<900,分别在系统不同时间范围内显示不同字符,用以区别。实验程序附录:/*/$1*/#include"includes.h"#defineTASK_STK_SIZE512/任务堆栈长度#defineN_MESSAGES128OS_STKStartTaskStkTASK_STK_SIZE;OS_STKoneTaskStkTASK_STK_SIZE;OS_STKfoTaskStkTASK_STK_SIZE;OS_STKherTaskStkTASK_STK_SIZE;OS_STKtwoTa

4、skStkTASK_STK_SIZE;OS_STKstwoTaskStkTASK_STK_SIZE;/定义消息队列长度/定义任务堆栈区/定义任务堆栈区/定义任务堆栈区/定义任务堆栈区/定义任务堆栈区/定义任务堆栈区INT16Skey;/用于退出的键char*s;char*ss;char*s1="oneTaskrunning"char*s2="foTaskrunning"/char*sss="OneTaskRequestsemaphore"char*s3="herTaskrunning"char*s4="t

5、woTaskrunning"char*s5="stwoTaskrunning"INT8Uerr;INT8Uy=0;INT32UTimes=0;/INT32UTimess=0;OS_EVENT*Str_Box;OS_EVENT*Str_Q;OS_EVENT*Mutexp;void*MsgGrpN_MESSAGES;voidStartTask(void*data);voidoneTask(void*data);voidfoTask(void*data);voidherTask(void*data);voidtwoTask(void*data);voidstwoTask

6、(void*data);/字符显示位/定义事件控制块/定义事件控制块/定义消息指针数组/声明起始任务/声明任务/声明任务/声明任务/声明任务/声明任务/*主函数*/voidmain(void)OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境PC_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断Str_Box=OSMboxCreate(void*)0);/创建邮箱型信号量Str_Q=OSQCreate(&MsgGrp0,N_MESSAGES);/创建消息队列Mutexp=OSMutexCreate(1,&err);

7、/定义信号量OSTaskCreate(StartTask,/创建任务StartTask(void*)0,/给任务传递参数&StartTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶0);/使任务的优先级别为0OSStart();/启动多任务管理/*任务StartTask*/voidStartTask(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);/安装时钟中断向量PC_SetTickRat

8、e(OS_TICKS_PER_SEC);/设置uCOS_II时钟频率OS_EXIT_CRITICAL();OSStatInit();/初始化统计任务OSTaskCreate(oneTask,/创建任务oneTask(void*)0,/给任务传递参数&oneTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶3);/使任务的优先级别为3OSTaskCreate(foTask,/创建任务foTask(void*)0,/给任务传递参数&foTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶4);/使任务的优先级别为4OSTaskCreate(herTask,

9、/创建任务herTask(void*)0,/给任务传递参数&herTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶5);/使任务的优先级别为5OSTaskCreate(twoTask,/创建任务twoTask(void*)0,/给任务传递参数&twoTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶6);/使任务的优先级别为6OSTaskCreate(stwoTask,/创建任务stwoTask(void*)0,/给任务传递参数&stwoTaskStkTASK_STK_SIZE-1,/设置任务堆栈栈顶7);/使任务的优先级别为7for(;)

10、如果按下Esc键则退出uCOS_IIif(PC_GetKey(&key)=TRUE)if(key=0x1B)PC_DOSReturn();OSTimeDlyHMSM(0,0,3,0);/等待3秒/*任务oneTask*/voidoneTask(void*pdata)# ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)/等待200 毫秒/OSTimeDlyHMSM(0,0,0,200);/PC_DispStr(10,+y,/sss,/DISP_BGND_BLACK+DISP_FGND_WHITE);OSMutex

11、Pend(Mutexp,0,&err);/请求信号量PC_DispStr(10,+y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);OSMutexPost(Mutexp);/发送信号量号量OSTimeDlyHMSM(0,0,1,0);/等待1秒voidfoTask(void*pdata)/*任务 foTask*/# ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)OSMutexPend(Mutexp,0,&err);/请求信号量号量PC_DispStr(10,+y,s2,DIS

12、P_BGND_BLACK+DISP_FGND_WHITE);/for(Timess;Timess<2;Timess+)/OS_Sched();/OSMutexPost(Mutexp);/发送信号量OSTimeDlyHMSM(0,0,1,0);/等待1秒/*任务 herTask*/voidherTask(void*pdata)# ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)sprintf(s,"%d",Times);/发送消息OSMboxPost(Str_Box,s);/*PC_DispSt

13、r(10,+y,Str_Box->OSEventPtr,/s,DISP_BGND_BLACK+DISP_FGND_WHITE);*/Times+;OSTimeDlyHMSM(0,0,1,0);/等待1秒voidtwoTask(void*pdata)/*任务 twoTask*/# ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;)ss=OSMboxPend(Str_Box,10,&err);PC_DispStr(10,+y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);if(OSTimeGet()>100&&OSTimeGet()<500)OSQPost(Str_Q,s4);/发送消息if(OSTimeGet()>500&&OSTimeGet()<900)OSQPostFront(Str_Q,s5);/发送消息OSTimeDlyHMSM(0,0,1,0);/等待1秒voidst

温馨提示

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

评论

0/150

提交评论