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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。