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

📄 user.c

📁 ucosii 实例
💻 C
📖 第 1 页 / 共 2 页
字号:
                      OS_FLAG_SET,
                     perr);            /*提交事件标志,置位事件标志组中位3*/
		  printf("时间:%d,任务TaskIO4获取IO数据后,提交事件,当前事件标志位:%d\n",OSTimeGet(),rdyflag);
	  }
}

/*Mutex例子程序,使用优先级反转*/
OS_EVENT  *myMutex;
void TaskMutex1(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;  
	  INT32U j;
	  perr=&err;
	  err=OS_ERR_NONE;


      myMutex=OSMutexCreate(3,perr);/*创建互斥信号量,优先级继承优先级PIP为9*/
	  if (myMutex==(OS_EVENT  *)0)   /*检查是否创建成功*/
	  {
			printf("时间:%d,高优先级任务TaskMutex1创建互斥信号量失败,失败号%d:\n",OSTimeGet(),*perr);
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
      printf("时间:%d,高优先级任务TaskMutex1创建互斥信号量成功.\n",OSTimeGet());
      OSTimeDly(100);/*延时1秒*/ 
      printf("时间:%d,高优先级任务TaskMutex1请求互斥信号量.\n",OSTimeGet());
      OSMutexPend(myMutex,0,perr);/*等待互斥信号量*/
	  printf("时间:%d,高优先级任务TaskMutex1获得互斥信号量.\n",OSTimeGet());
	  if (*perr == OS_ERR_NONE)
	  {
		  
		  for(i=1;i<=5;i++)
		  {
			  printf("时间%d:高优先级任务TaskMutex1向串口输出数据%d\n",OSTimeGet(),i);  /*模拟操作IO*/	 
			  for (j=1;j<=9999999;j++);	 /*模拟操作串口*/  			  
		  }
	  }
	  else
	  {
		  printf("时间:%d,高优先级任务TaskMutex1请求信号量失败,失败号%d:\n",OSTimeGet(),*perr);		
	  }
	  OSMutexPost(myMutex);
	  for(i=1;i<=5;i++)
	  {
		  
		  printf("时间%d:高优先级任务TaskMutex1执行提交信号量后执行其他操作%d\n",OSTimeGet(),i);	/*模拟操作IO*/	   
		  for (j=1;j<=99999999;j++);	 /*延时,表示在操作串口*/	
	  }
	  printf("高优先级任务TaskMutex1结束运行,删除自己\n",OSTimeGet(),*perr);	
	  OSTaskDel(OS_PRIO_SELF); /*删除本任务*/
	  return;

}
void TaskMutex2(void *pParam)
{
	  INT8U 	*perr;
	  INT8U err,i;	 
	  INT32U j;
	  perr=&err;
	  err=OS_ERR_NONE;
	  if (myMutex==(OS_EVENT  *)0)	 /*检查是否有被创建的互斥信号量*/
	  {
			printf("时间:%d,互斥信号量未创建");
			OSTaskDel(OS_PRIO_SELF); /*删除本任务*/
			return;
	  }
	  OSTimeDly(90);/*延时不到1秒*/ 
	  printf("时间:%d,低优先级任务TaskMutex2请求互斥信号量\n",OSTimeGet());
	  OSMutexPend(myMutex,0,perr);/*等待互斥信号量*/
	  printf("时间:%d,任务TaskMutex2获得互斥信号量\n",OSTimeGet());
	  if (*perr == OS_ERR_NONE)
	  {
		  printf("时间:%d,低优先级任务TaskMutex2获得互斥信号量\n",OSTimeGet());
		  for(i=1;i<=5;i++)
		  {
			  
			  printf("时间%d:低优先级TaskMutex2向串口输出数据%d\n",OSTimeGet(),i);  /*模拟操作IO*/     
			  for (j=1;j<=99999999;j++);   /*模拟操作串口*/    
		  }
	  }
	  else
	  {
		  printf("时间:%d,低优先级任务TaskMutex2请求信号量失败,失败号:\n",OSTimeGet(),*perr);     
	  }
	  OSMutexPost(myMutex);
	  for(i=1;i<=5;i++)
	  {		  
		  printf("时间%d:低优先级TaskMutex2执行提交信号量后执行其他操作%d\n",OSTimeGet(),i);  /*模拟操作IO*/     
		  for (j=1;j<=99999999;j++);   /*延时,表示在操作串口*/    
	  }
	  printf("低优先级任务TaskMutex2结束运行,删除自己\n",OSTimeGet(),*perr);   
	  OSTaskDel(OS_PRIO_SELF); /*删除本任务*/
	  return;
}

void TaskPrint(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;   
	  INT32U j;
	  perr=&err;
	  err=OS_ERR_NONE;
      i=0;
      OSTimeDly(95);
	  for(i=1;i<=5;i++)
	  {
		  printf("时间%d:中优先级任务TaskPrint在运行中,打印数据%d\n",OSTimeGet(),i++);  /*模拟操作IO*/     
		  for (j=1;j<=99999999;j++);   /*模拟进行打印操作*/  	
	  }
	  printf("中优先级任务TaskPrint结束运行,删除自己\n");
	  OSTaskDel(OS_PRIO_SELF); /*删除本任务*/
}
//消息邮箱的例子
OS_EVENT  *myMBox;
void TaskMessageSen(void *pParam)
{
      INT8U     *perr;
	  INT8U err;//,i;  
	  //INT32U j;
	  INT32U scount;
	  	  int a[3];
	  perr=&err;
	  err=OS_ERR_NONE;

      scount=1;

	  a[1]=5;
	  a[3]=6;
      myMBox=OSMboxCreate(&scount);/*创建邮箱,*/
	  if (myMBox==(OS_EVENT  *)0)   /*检查是否创建成功*/
	  {
			printf("时间:%d, TaskMessageSen创建邮箱失败\n",OSTimeGet());
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
	  printf("时间:%d, TaskMessageSen创建邮箱成功\n",OSTimeGet());
	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
		  scount++;
          printf("时间:%d,任务TTaskMessageSen准备发消息,消息为%d\n",OSTimeGet(),scount);
		  OSMboxPost(myMBox,&scount); /*发消息*/
	  }
}
void TaskMessageRec(void *pParam)
{
      INT8U     *perr;
	  INT8U err;//,i;  
	  INT32U j;
	  INT32U * prcount;
	  perr=&err;
	  err=OS_ERR_NONE;

	  if (myMBox==(OS_EVENT  *)0)   /*检查邮箱是否存在*/
	  {
			printf("时间:%d,任务TaskMessageRec判定邮箱不存在!\n",OSTimeGet());
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
	  
	  while(1)
	  { 
          prcount=(INT32U * )OSMboxPend(myMBox,0,perr); /*请求消息,如果消息不存在就阻塞*/
		  if (*perr==OS_ERR_NONE)
			printf("时间:%d,任务TaskMessageRec接收消息为%d\n",OSTimeGet(),*prcount);
		  else
            printf("时间:%d,任务TaskMessageRec等待异常结束,错误号:%d\n",*perr);
	  }
}

//消息队列的例子
OS_EVENT  *myQ;
void TaskQSen(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;  
	  INT32U j;
	  INT8U scount;
	  OS_Q_DATA myQData; /*消息队列数据*/ 
	  void * myq[6]; /*消息队列*/
	  INT8U mymessage[256];
	  perr=&err;
	  err=OS_ERR_NONE;    
      scount=0;

      myQ=OSQCreate(myq,6);/*创建消息队列,容积为6*/
	  if (myQ==(OS_EVENT  *)0)   /*检查是否创建成功*/
	  {
			printf("时间:%d, TaskQSen创建消息队列失败\n",OSTimeGet());
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
	  printf("时间:%d, TaskQSen创建消息队列成功\n",OSTimeGet());
      for (i=0;i<=254;i++)
		 mymessage[i]=i;
      mymessage[255]=i;
	  while(1)
	  {
		  OSTimeDly(100);/*延时1秒*/ 
		  
          printf("时间:%d,任务TTaskQSen准备发消息,消息为%d\n",OSTimeGet(),mymessage[scount]);
		  err=OSQPost(myQ,&mymessage[scount]); /*发消息*/
		  switch (err) {
				case OS_ERR_Q_FULL:
                    printf("时间:%d,任务TTaskQSen发消息失败,消息队列已满\n",OSTimeGet());
					break;
                case OS_ERR_NONE:
                    printf("时间:%d,任务TTaskQSen发消息成功\n",OSTimeGet());
					break;
				default:
                    printf("时间:%d,任务TTaskQSen发消息失败,错误号:%d\n",OSTimeGet(),err);
		  }
		  OSQQuery(myQ,&myQData);
		  printf("时间:%d,当前队列中消息数量:%d\n",OSTimeGet(),myQData.OSNMsgs);
		  scount++;
	  }
}

void TaskQRec(void *pParam)
{
      INT8U     *perr;
	  INT8U err,i;  
	  INT32U j;
	  INT8U rcount;
	  INT8U rec;
	  OS_Q_DATA myQData; /*消息队列数据*/ 
	  INT8U mymessage[256];
	  perr=&err;
	  err=OS_ERR_NONE;    
      rcount=0;

     
	  if (myQ==(OS_EVENT  *)0)   /*检查消息队列是否存在*/
	  {
			printf("时间:%d, TaskQRec判定消息队列不存在\n",OSTimeGet());
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
	  while(1)
	  {
		  OSTimeDly(200);/*延时1秒*/ 
          printf("时间:%d,任务TaskQRec开始等待消息\n",OSTimeGet());
		  rec=*(INT32U *)OSQPend(myQ,0,perr); /*发消息*/
		  switch (err) {
                case OS_ERR_NONE:
                    printf("时间:%d,任务TaskQRec接收到消息%d\n",OSTimeGet(),rec);
					break;
				default:
                    printf("时间:%d,任务TTaskMessageSen发消息失败,错误号:%d\n",OSTimeGet(),err);
		  }
		  OSQQuery(myQ,&myQData);
		  printf("时间:%d,当前队列中消息数量:%d\n",OSTimeGet(),myQData.OSNMsgs);
	  }
}

//内存管理的例子

void TaskM(void *pParam)
{
      
	  INT8U *perr;
	  INT8U err,i;
      OS_MEM  *pmyMem;     //MCB块地址
      INT8U myMem[3][20]; //用来做内存分区
	  void    *pblk[10];   //内存块地址数组
	  BOOLEAN require;
	  OS_MEM_DATA mem_data;//用于查询内存块信息
	  err=OS_ERR_NONE; 	
	  perr=&err;
      require=1;
      pmyMem=OSMemCreate(myMem,3,20,perr);/*创建内存分区,10个块, 每个块20个字节*/
	  if (pmyMem==(OS_EVENT  *)0)   /*检查是否创建成功*/
	  {
			printf("时间:%d, TaskM创建内存分区失败\n",OSTimeGet());
		    OSTaskDel(OS_PRIO_SELF); /*不成功则删除本任务*/
			return;
	  }
	  printf("时间:%d, TaskM创建内存分区成功,包含10个块, 每个块20个字节\n",OSTimeGet());
	  i=0;
	  while(1)
	  {
		  if (i>5) 
		  { 
			  i=0;
			  require=!require;
		  }
          //printf("时间:%d,i=%d\n",OSTimeGet(),i);
		  OSTimeDly(100);/*延时1秒*/ 
		  if (require)
		  { 
			printf("时间:%d,任务TaskM准备请求一个块->",OSTimeGet());
			pblk[i++]=OSMemGet(pmyMem,perr); /*请求内存块*/
			switch (err) {
				case OS_ERR_MEM_NO_FREE_BLKS:
                    printf("时间:%d,任务TaskM发请求内存块失败,分区中已无可用内存块!\n",OSTimeGet());
					break;
                case OS_ERR_NONE:
                    printf("时间:%d,任务TaskM获得内存块\n",OSTimeGet());
					break;
				default:
                    printf("时间:%d,任务TaskM发请求内存块失败,错误号:%d\n",OSTimeGet(),err);
			}
		  }
		  else
		  {
		  	printf("时间:%d,任务TaskM准备释放一个块->",OSTimeGet());
			err=OSMemPut(pmyMem,pblk[i++]); /*请求内存块*/
			switch (err) {
				case OS_ERR_MEM_FULL:
                    printf("时间:%d,任务TaskM发请求内存块失败,分区已满!\n",OSTimeGet());
					break;
                case OS_ERR_MEM_INVALID_PBLK:
                    printf("时间:%d,任务TaskM发释放内存块失败,释放无效的内存块!\n",OSTimeGet());
					break;
                case OS_ERR_NONE:
                    printf("时间:%d,任务TaskM成功释放内存块\n",OSTimeGet());
					break;
				default:
                    printf("时间:%d,任务TaskM释放内存块失败,错误号:%d\n",OSTimeGet(),err);
			}
		  
		  }
		  OSMemQuery(pmyMem,&mem_data);       
		  printf("时间:%d,当前分区中的已用内存块数量:%d\n",OSTimeGet(),mem_data.OSNUsed);
		  printf("时间:%d,当前分区中的空闲内存块数量:%d\n",OSTimeGet(),mem_data.OSNFree);
	  }
}

⌨️ 快捷键说明

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