搜索
您的当前位置:首页正文

实验八 uCOS-II的互斥信号量

来源:易榕旅网


实验八 uCOS的互斥信号量

一:实验目的:

1. 理解互斥型信号量。

2. 学会使用互斥型信号量实现对共享资源的独占式处理。

3. 解决任务在使用独占式资源出现的优先级反转问题。

二:实验内容:

完成教材5-7实验,使用互斥型信号量实现对共享资源的独占式处理。实验中要求要创建互斥型信号量,请求互斥型信号量,发送互斥型信号量,删除互斥型信号量。

三:程序代码:

#include \"includes.h\"

#define TASK_STK_SIZE 512

OS_STK StartTaskStk[TASK_STK_SIZE];

OS_STK MyTaskStk[TASK_STK_SIZE];

OS_STK YouTaskStk[TASK_STK_SIZE];

OS_STK HerTaskStk[TASK_STK_SIZE];

INT16S key;

char *s1=\"MyTask running--yangkun\";

char *s2=\"YouTask running--yangkun\";

char *s3=\"HerTask running--yangkun\";

char *s4=\"MyTask pend_Semp\";

char *s5=\"HerTask pend_Semp\";

INT8U err;

INT8U y=0;

INT32U Times=0;

OS_EVENT *Semp;

void StartTask(void *pdata);

void MyTask(void *pdata);

void YouTask(void *pdata);

void HerTask(void *pdata);

void main (void)

{

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS, OSCtxSw);

Semp=OSMutexCreate(1,&err);

OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE - 1], 0);

OSStart();

}

void StartTask (void *pdata)

{

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;

#endif

pdata = pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08, OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE - 1], 3);

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 4);

OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE - 1], 5);

for (;;)

{

if (PC_GetKey(&key) == TRUE) {

if (key == 0x1B) {

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0, 0, 3, 0);

}

}

void MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

OS_CPU_SR cpu_sr;

#endif

pdata=pdata;

for(;;)

{

OSTimeDlyHMSM(0,0,0,200);

{

PC_DispStr(10,++y,s4,DISP_BGND_BLACK+DISP_FGND_WHITE);

OSMutexPend(Semp,0,&err);

PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);

}

OSTimeDlyHMSM(0,0,0,200);

}

}

void YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

OS_CPU_SR cpu_sr;

#endif

pdata=pdata;

for(;;)

{

PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);

OSTimeDlyHMSM(0,0,0,300);

}

}

void HerTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

OS_CPU_SR cpu_sr;

#endif

pdata=pdata;

for(;;)

{

PC_DispStr(10,++y,s5,DISP_BGND_BLACK+DISP_FGND_WHITE);

OSMutexPend(Semp,0,&err);

PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);

for(Times;Times<20000000;Times++)

{

OS_Sched();

}

PC_DispStr(20,++y,\"***************\

OSMutexPost(Semp);

OSTimeDlyHMSM(0,0,1,0);

}

}

四:实验结果:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top