实验七uCOS-II的信号量
一:实验目的:
1.掌握uCOS-II中的信号量的使用,实现共享资源的使用。
二:实验内容:
完成课本5-2的实验,观察结果,了解互斥信号量的使用。
uCOSII使用信号量、邮箱和消息队列这些中间环节来实现任务之间的通信。
信号量是一类事件。使用信号量的最初目的是为了给共享资源设立一个标志,该标志表示该共享资源被占用情况。
三:程序代码:
#include \
#define TASK_STK_SIZE 512 OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; INT16S key; INT8U y1=0,y2=0; BOOLEAN ac_key; char* s;
voidMyTask(void *data); voidYouTask(void *data);
/*********************主函数***************************/ void main(void) {
OSInit(); ac_key=1;
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw); OSTaskCreate(MyTask, (void*)0, &MyTaskStk[TASK_STK_SIZE-1], 0);
OSStart(); }
/********************任务MyTask************************/ voidMyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif
INT8U err; pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit();
OSTaskCreate(YouTask, (void *)0, &YouTaskStk[TASK_STK_SIZE-1], 2); for(;;) { if(ac_key) { ac_key=FALSE; // s=\ PC_DispStr(5,++y1, s, DISP_BGND_BLACK+DISP_FGND_WHITE); ac_key=TRUE; }
//如果按下ESC键,则退出uCOS-II if(PC_GetKey(&key)==TRUE) { if(key==0x1B) { PC_DOSReturn(); } } OSTimeDly(20); } }
/***************************************************************************/
voidYouTask(void * pdata) {
#if OS_CRITICAL_METHOD==3 OS_CPU_SR cpu_sr; #endif
INT8U err; pdata = pdata; for(;;) { if(ac_key) { ac_key=FALSE; s=\ PC_DispStr(28,++y2, s, DISP_BGND_BLACK+DISP_FGND_WHITE); OSTimeSet(0); while(OSTime<500) { PC_DispStr(55,y2, s, DISP_BGND_BLACK+DISP_FGND_WHITE); } ac_key=TRUE; }
OSTimeDly(10); } }
实验分析:程序在运行时,首先运行任务MyTask,输出字符串:MyTask。然后MyTask等待20个节拍,运行YouTask,输出字符串:YouTask。MyTask等待时间到了,但是由于信号量无效,所以尽管优先级高,但是也是继续运行YouTask,输出字符串:YouTask。直到信号量有效时,运行MyTask。如此循环执行,直到按键ESC,退出uCOS-II.
四:实验结果:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库实验七 uCOS的信号量在线全文阅读。
相关推荐: