首页 uc OS II 优先级反转

uc OS II 优先级反转

举报
开通vip

uc OS II 优先级反转uc OS II 优先级反转 uc/OS II优先级反转2010-12-20 16:13/*Copyright(c)* *--文件信息-- *文件名: *创建人:张海涛 *最后修改日期:2008年11月18日 *描述:嵌入式实时操作系统实验4"优先级反转"实验程序 实验目的:掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理。 优先级反转原理:优先级反转发生在有多个任务需要使用共享资源的情况下,可能会出现高优先级 任务被低优先级任务阻塞,并等待低优先级任务执行的现象。高优...

uc OS II 优先级反转
uc OS II 优先级反转 uc/OS II优先级反转2010-12-20 16:13/*Copyright(c)* *--文件信息-- *文件名: *创建人:张海涛 *最后修改日期:2008年11月18日 *描述:嵌入式实时操作系统实验4"优先级反转"实验程序 实验目的:掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理。 优先级反转原理:优先级反转发生在有多个任务需要使用共享资源的情况下,可能会出现高优先级 任务被低优先级任务阻塞,并等待低优先级任务执行的现象。高优先级任务需要等待低优先级任务 释放资源,而低优先级任务又正在等待中等优先级任务,这种现象就被称为优先级反转。两个任务 都试图访问共享资源是出现优先级反转最通常的情况。为了保证一致性,这种访问应该是顺序进行 的。如果高优先级任务首先访问共享资源,则会保持共享资源访问的合适的任务优先级顺序;但如 果是低优先级任务首先获得共享资源的访问,然后高优先级任务请求对共享资源的访问,则高优先 级任务被阻塞,直到低优先级任务完成对共享资源的访问。 * *--历史版本信息-- 创建人: * *版本:v1.0 *日期:2008年11月18日 *描述:原始版本 * *--当前版本修订-- *修改人: *日期: *描述: * *-- */ #include"config.h" #define TASK_STK_SIZE 64/*堆栈大小*/ OS_STK TaskStartStk[TASK_STK_SIZE];/*TaskStart任务堆栈*/ OS_STK Task0Stk[TASK_STK_SIZE];/*Task0任务堆栈*/ OS_STK Task1Stk[TASK_STK_SIZE];/*Task1任务堆栈*/ OS_STK Task2Stk[TASK_STK_SIZE];/*Task1任务堆栈*/ void TaskStart(void*data); void Task0(void*data); void Task1(void*pdata); void Task2(void*pdata); /* *函数名称:fputc *功能描述:将fputc函数重定向到串口0 *输入: *输出:无 *全局变量:无 *调用模块: * *作者:张海涛 *日期:2008年11月18日 *--- *修改人: *日期: *-- */ int fputc(int ch,FILE*f) { extern void UART0_SendByte(uint8 data); char tempch=ch; UART0_SendByte(tempch); return ch; } /* *函数名称:DelayTime *功能描述:延时程序 *输入:t延时时间参数 *输出:无 *全局变量:无 *调用模块: * *作者:张海涛 *日期:2008年11月18日 *--- *修改人: *日期: -- * */ void DelayTime(uint32 t) { uint32 i; while(t--) { i=100; while(i--); } } /* *函数名称:main *功能描述:c语言的主函数,由它启动多任务环境 *输入:无 *输出:无 *全局变量:无 *调用模块:OSInit,OSTaskCreate,OSStart * 作者:张海涛 * *日期:2008年11月18日 *--- *修改人: *日期: *-- */ OS_EVENT*mutex; int main(void) { OSInit();/*初始化uC/OS-II操作系统*/ mutex=OSSemCreate(1);/*创建一个互斥信号量*/ OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0); /*创建任务TaskStart,优先级为0*/ OSStart();/*启动多任务*/ return 0; } /* *函数名称:TaskStart *功能描述:μCOS-II的起始任务,通常由它初始化目标板和建立其它任 务,这里建立了三个应用任务Task0,Task1和Task2 *输入:无 *输出:无 *全局变量:无 *调用模块: OSTaskCreate()uC/OS-II创建任务函数 TargetInit()启动时间节拍,初始化串口函数 OSTaskSuspend()uC/OS-II中挂起指定优先级任务函数 * *作者:张海涛 *日期:2008年11月18日 *--- *修改人: *日期: *-- */ void TaskStart(void*pdata) { uint8 i; uint8 TaskData[3]; ;i 3;i++) for(i=0 { TaskData[i]=i; } printf("uC/OS-II is Started\n===\n"); TargetInit();/*目标板初始化*/ OSTaskCreate(Task0,(void*)&TaskData[0],&Task0Stk[TASK_STK_SIZE- 1],5);/*创建任务Task0*/ OSTaskCreate(Task1,(void*)&TaskData[1],&Task1Stk[TASK_STK_SIZE- 1],6);/*创建任务Task1*/ OSTaskCreate(Task2,(void*)&TaskData[2],&Task2Stk[TASK_STK_SIZE- 1],7);/*创建任务Task2*/ for(;;) { OSTaskSuspend(0);/*挂起优先级为0的任务,即为TaskStart任务本身*/ } } /* *函数名称:Task0 *功能描述:μCOS-II的第一个任务 输入:无 * *输出:无 *全局变量:无 *调用模块: * *作者:张海涛 *日期:2008年11月18日 *--- *修改人: *日期: *-- */ void Task0(void*pdata) { uint8 err,id; uint8 id=*(int*)pdata; for(;;) { printf("Task%d is waitting aevent.\n",id); /*延时200个时钟节拍系统调度*/ OSTimeDly(200); printf("The event of Task%d come.\n",id); printf("Task%d is try to get mutex.\n",id); OSSemPend(mutex,0,&err);/*请求互斥信号量*/ switch(err) { case OS_NO_ERR: printf("Task%d has got the mutex.\n",id); printf("===\n"); printf("\n"); break; default: printf("Task%d is suspended.\n",id); printf("===\n"); printf("\n"); break; } OSTimeDly(200);/*Delay 200 clock tick系统调度*/ printf("Task%d release mutex.\n",id); OSSemPost(mutex);/*Release mutex*/ } } /* *函数名称:Task1 *功能描述:μCOS-II的第二个任务 *输入:无 *输出:无 *全局变量:无 *调用模块: * *作者:张海涛 *日期:2008年11月18日 *--- *修改人: *日期: *-- */ void Task1(void*pdata) { uint8 id; id=*(int*)pdata; for(;;){ printf("Task%d is waitting aevent.\n",id); OSTimeDly(100);/*延时100个时钟节拍,系统调度*/ printf("The event of Task%d come.\n",id); OSTimeDly(100);/*延时100个时钟节拍*/ } } /* *函数名称:Task2 *功能描述:μCOS-II的第三个任务 *输入:无 *输出:无 *全局变量:无 *调用模块: * *作者:张海涛 日期:2008年11月18日 * *--- *修改人: *日期: *-- */ void Task2(void*pdata) { uint8 err,id; id=*(int*)pdata; for(;;) { printf("Task%d is trying to get mutex.\n",id); OSSemPend(mutex,0,&err);/*请求互斥信号量*/ switch(err) { case OS_NO_ERR: printf("\n"); printf("===\n"); printf("Task%d has got the mutex.\n",id);OSTimeDly(200);/*延时200个时钟节拍,系统调度*/ break; default: printf("Task%d is failed to get mutex.\n",id); printf("===\n"); printf("\n"); OSTimeDly(200);/*延时200个时钟节拍,系统调度*/ break; } printf("Task%d release mutex.\n",id); printf("===\n"); printf("\n"); OSSemPost(mutex);/*释放互斥信号量*/ } } /* *End Of File */
本文档为【uc OS II 优先级反转】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_998870
暂无简介~
格式:doc
大小:25KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-11-29
浏览量:18