实验八 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);
}
}
四:实验结果:
因篇幅问题不能全部显示,请点此查看更多更全内容