⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user.c

📁 ucosii 实例
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	 
*	usertask.c
*	the user task for ucosII
*	
*
*	
*	Last modified:	 2010-10-15 
*   writen by卢有亮
*   for book:嵌入式实时操作系统μCOS分析与实践
*   2011于成都电子科技大学
*   luyl@uestc.edu.cn   
*/

#include   "includes.h"



int a,b,c;
int add1(int *p1,int *p2)
{
	int a,b,c;
	a=*p1;
	b=*p2;
	OSTimeDly(OS_TICKS_PER_SEC);
	c=a+b;
	return(c);
}

int add2(int p1,int p2)
{
	//int a,b;
	a=p1;
	b=p2;
	OSTimeDly(OS_TICKS_PER_SEC);
	c=a+b;
	return(c);
}

void usertask(void *pParam)
{
	/*  INT8U i=0;
	  for(;;){
		printf("%d\n",i);
		i++;
		OSTimeDly(100);
	}*/
	INT8U i=(INT8U)pParam;
	//printf("优先级为%d的任务输出后延时%d秒\n",OSPrioCur,OSPrioCur);

	for(;;)
	{
		printf("优先级为%d的任务输出%d\n",OSPrioCur,i++);
		OSTimeDly(100);
	}
}
void usertask1(void *pParam)
{
    int sum;
	for(;;){
		//printf("\ntask%d call add2(1,2)\n",1);
		sum=add2(1,2);
		printf("\ntask%d call add2(1,2) solution is %d\n",1,sum);
	}//for(;;)
}
void usertask2(void *pParam)
{

    int sum;
	for(;;){
		//printf("\n\rtask%d call add2(100,200)\n",2);
		sum=add2(100,200);
		printf("\ntask%d call add2(100,200) solution is %d\n",2,sum);
	}//for(;;)
}

void UsrCouPri()
{
	int crt;
	crt=0;
    for(;;){
	//	sum=add2(100,200);	

    }
}

//信号量管理的例子
void UserTaskSemA(void *pParam)
{
    /*任务SemA创建信号量,然后周期性访问资源R*/
	/*创建信号量*/
	INT8U     *perr;
	INT8U err;
	//INT8U i;
	OS_SEM_DATA mySemData;
	err=0;
	perr=&err;
	MyEventSem=OSSemCreate(2);
    if (MyEventSem==(OS_EVENT *)0)
	{
		printf("任务A创建信号量失败!\n");
		OSTaskDel(OS_PRIO_SELF);
	    return;
	}
	OSSemQuery(MyEventSem,&mySemData); 
    printf("时间:%d, 任务A创建信号量。当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
	while(1)
	{
	    OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务A开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
		OSSemPend(MyEventSem,0,perr);
		if (err!=OS_ERR_NONE)
		{
			 printf("任务A请求信号量失败\n");
			 printf("错误号%d\n",err);
			 continue;
		}
        OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务A获得信号量。当前信号量值=%d,任务A开始对R操作\n",OSTimeGet(),mySemData.OSCnt);
   		OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
        printf("时间:%d,任务A结束资源操作,提交信号量!\n",OSTimeGet());
        OSSemPost(MyEventSem);
        OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务A提交信号量完成,当前信号量值=%d,任务A将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
        OSTimeDly(1000);
	}
}

void UserTaskSemB(void *pParam)
{
    /*任务SemA创建信号量,然后周期性访问资源R*/
	INT8U     *perr;
	INT8U err;
	OS_SEM_DATA mySemData;
	err=0;
	perr=&err;
	printf("时间:%d,任务B开始延时300个时钟嘀嗒",OSTimeGet());
    OSTimeDly(300);/*任务B先延时3秒*/
	if (MyEventSem==(OS_EVENT *)0)
	{
		printf("任务A创建信号量失败!\n");
		OSTaskDel(OS_PRIO_SELF);
	    return;
	}
	while(1)
	{
	    OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务B开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
		OSSemPend(MyEventSem,0,perr);
		if (err!=OS_ERR_NONE)
		{
			 printf("任务B请求信号量失败\n");
			 printf("错误号%d\n",err);
			 continue;
		}
        OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务B获得信号量。当前信号量值=%d,任务B开始对R操作,需1000个时钟嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
   		OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
        printf("时间:%d,任务B结束资源操作,提交信号量!\n",OSTimeGet());
        OSSemPost(MyEventSem);
        OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务B提交信号量完成,当前信号量值=%d,任务B将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
        OSTimeDly(1000);
	}
}


void UserTaskSemC(void *pParam)
{
    /*任务SemA创建信号量,然后周期性访问资源R*/
	INT8U     *perr;
	INT8U err;
	INT8U i;
	OS_SEM_DATA mySemData;
	err=0;
	perr=&err;
    printf("时间:%d,任务C开始延时400个时钟嘀嗒",OSTimeGet());
    OSTimeDly(400);/*任务C先延时4秒*/
	if (MyEventSem==(OS_EVENT *)0)
	{
		printf("任务A创建信号量失败!\n");
		OSTaskDel(OS_PRIO_SELF);
	    return;
	}
	while(1)
	{
	    OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务C开始请求信号量!当前信号量值=%d\n",OSTimeGet(),mySemData.OSCnt);
		OSSemPend(MyEventSem,0,perr);
		if (err!=OS_ERR_NONE)
		{
			 printf("任务C请求信号量失败\n");
			 printf("错误号%d\n",err);
			 continue;
		}
        OSSemQuery(MyEventSem,&mySemData); 
		printf("时间:%d,任务C获得信号量。当前信号量值=%d,任务C开始对R操作,需1000个时钟嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
   		OSTimeDly(1000); /*模拟操作资源,需要10秒,1000个时钟嘀嗒*/
        printf("时间:%d,任务C结束资源操作,提交信号量!\n",OSTimeGet());
        OSSemPost(MyEventSem);
        printf("时间:%d,任务C提交信号量完成,当前信号量值=%d,任务C将延时阻塞1000嘀嗒\n",OSTimeGet(),mySemData.OSCnt);
        OSTimeDly(1000);
	}
}

//事件标志组的例子
INT8U IO[4][10];
OS_FLAG_GRP  * pFlagGroupDataProcess;
void TaskDataProcess(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
      INT16U SUM;
      OS_FLAGS processflag,retflag;
      err=OS_ERR_NONE;	  
      perr=&err;
	  processflag=0x0F;
	  /*创建事件标志组,事件标志初始值0,没有事件发生*/
      pFlagGroupDataProcess=OSFlagCreate(0,perr); 
      /*省略了检查是否创建成功*/
	  while(1)
	  {
		  printf("时间:%d,任务TaskDataProcess开始请求事件标志-----------!\n",OSTimeGet());
		  retflag=OSFlagPend (pFlagGroupDataProcess,
                      processflag,
                      OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,
                      0,
                      perr);  
		  
		  if (retflag==processflag)
		  {
				SUM=0;
			    printf("时间:%d,任务TaskDataProcess请求事件标志成功,开始处理数据!\n",OSTimeGet());
                for (i=0;i<10;i++)
				{
					SUM+=IO[0][i]+IO[1][i]+IO[2][i]+IO[3][i];
				}
                printf("时间:%d,任务TaskDataProcess处理数据完成,结果为%d:\n",OSTimeGet(),SUM);
		  }	  
	  }
}
void TaskIO1(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
	  
	  OS_FLAGS rdyflag;
	  //OS_FLAG_GRP  * pFlagGroup;
	  err=OS_ERR_NONE;
	  perr=&err;	
	  rdyflag=0;

	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
          for (i=0;i<10;i++) /*模拟获取数据的过程*/
		  {
				IO[0][i]=1;
		  }
          printf("时间:%d,任务TaskIO1获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
		  rdyflag=OSFlagPost (pFlagGroupDataProcess,
                      0x01,
                      OS_FLAG_SET,
                     perr);            /*提交事件标志,置位事件标志组中最后一位位0*/
		  printf("时间:%d,任务TaskIO1获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
	  }
}
void TaskIO2(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
 	  OS_FLAGS rdyflag;
	  perr=&err;
	  err=OS_ERR_NONE;
	  rdyflag=0;
	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
          for (i=0;i<10;i++) /*模拟获取数据的过程*/
		  {
				IO[1][i]=2;
		  }
          printf("时间:%d,任务TaskIO2获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
		  rdyflag=OSFlagPost (pFlagGroupDataProcess,
                      0x02,
                      OS_FLAG_SET,
                     perr);            /*提交事件标志,置位事件标志组中位1*/
		  printf("时间:%d,任务TaskIO2获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
	  }
}
void TaskIO3(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
 	  OS_FLAGS rdyflag;
	  perr=&err;
	  err=OS_ERR_NONE;
	  rdyflag=0;
	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
          for (i=0;i<10;i++) /*模拟获取数据的过程*/
		  {
				IO[2][i]=3;
		  }
          printf("时间:%d,任务TaskIO3获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
		  rdyflag=OSFlagPost (pFlagGroupDataProcess,
                      0x04,
                      OS_FLAG_SET,
                     perr);            /*提交事件标志,置位事件标志组中位2*/
		  printf("时间:%d,任务TaskIO3获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
	  }
}
void TaskIO4(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
 	  OS_FLAGS rdyflag;
	  perr=&err;
	  err=OS_ERR_NONE;
	  rdyflag=0;
	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
          for (i=0;i<10;i++) /*模拟获取数据的过程*/
		  {
				IO[3][i]=3;
		  }
          printf("时间:%d,任务TaskIO4获取IO数据后,准备提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
		  rdyflag=OSFlagPost (pFlagGroupDataProcess,
                      0x08,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -