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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八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++)

{

相关文档
最新文档