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

📄 mytest.c

📁 基于51单片机来实现UCOS用一个串口来看到实现阶段
💻 C
字号:
#include "includes.h"
void Task2(void *mydata)reentrant;
void Task3(void *mydata)reentrant;
INT8U *err;
char code menu[] = 
   "\n"
   "+                          KEIL-C51 UCOS2                      +\n"
   "| C:   display                                                 |\n"
   "| Rx:  run taskx    for example:R2                      x=2~3 |\n"
   "| Dx:  kill taskx   for example:D2                             |\n"
   "| Tx:  create taskx for example:T2,but you must push D2 firstly|\n"
   "| S:   task state   for example:S                              |\n"
   "| N:   current task for example:N                              |\n"
   "| ESC: quit current task                                       |\n"
   "command:";
//初始化定时器1,用于波特率传输
void InitTimer1(void){
	TMOD &= 0xf0;
    TMOD=TMOD|0x20;    
    TH1=0xfe;    
    TR1=1;   
}
//初始化串口
void InitSerial(void){
     SCON=0X50;
	 ES=1;
}
//输出字符串函数
void SendCh(INT8U *chp)reentrant{
     while(O_dex);
	 O_dex=1;
	 O_buf=chp;
	 TI=1;
}
void PutCh(INT8U ch){
	 while(O_dex);
	 O_dex=1;
	 SBUF=ch;
} 
void TaskStat(void){
     static   INT8U i;
	 for(i=0;i<OS_LOWEST_PRIO+1;i++){
		 if(OSTCBPrioTbl[i]){
				 SendCh("\ntask");
				 PutCh(i+0x30);
				 SendCh("--stat-------------->");
				 switch(OSTCBPrioTbl[i]->OSTCBStat){
						 case OS_STAT_RDY:	  SendCh("ready");
											  break;
						 case OS_STAT_SEM:	  SendCh("waite sem");
											  break;
						 case OS_STAT_MBOX:	  SendCh("waite mbox");
											  break;
						 case OS_STAT_Q:	  SendCh("waite queue");
											  break;
						 case OS_STAT_SUSPEND:SendCh("suspend");
											  break;
				         default:  			  break;
				 }
		 }
	 }
}
//用户编写的任务
void Task1(void *mydata) reentrant{
     mydata=mydata;
	 OSTaskSuspend(2);
	 OSTaskSuspend(3);
	 SendCh(menu);
     while(1){ 
		 OSSemPend(Sem1,0,err);
	     switch(I_buf[0]){
		 case 'C':    SendCh(menu);
					  break;

		 case 'R':    if(I_dex>1){ //运行任务
					  		switch(I_buf[1]){ // 那个任务

						    case 0x32:	if(OSTCBPrioTbl[2]){
										SendCh("\n");
					              		OSTaskResume(2);
									    }else SendCh("\nunexist this task\ncommand:");
									    break;

							case 0x33:	if(OSTCBPrioTbl[3]){
										SendCh("\n");
					              		OSTaskResume(3);
									    }else SendCh("\nunexist this task\ncommand:");
									    break;

                            default:  	SendCh("\ncan't run this task\ncommand:");
									  	break;
							}	             
					   }else{
					   		SendCh("\nerr command\ncommand:");
					   }
					   break;

		 case 'D':     if(I_dex>1){ 		 //删除任务
					  		switch(I_buf[1]){ // 那个任务

							case 0x31:	SendCh("\nkill this task is disable\ncommand:");
									  	break;
                            default:  
										if(OSTCBPrioTbl[I_buf[1]-0x30]&&I_buf[1]-0x30<6){
											OSTaskDel(I_buf[1]-0x30);   
										    SendCh("\nkill this task\ncommand:");
										}else{
										    SendCh("\nunexist this task\ncommand:");
										}
									  	break;
							}	             
					    }else{
					   		 SendCh("\nerr command\ncommand:");
					    }
					    break;

		 case 'T':      if(I_dex>1){ //建立任务
					  		switch(I_buf[1]){ // 那个任务

							case 0x31:	SendCh("\nthis task is exist\ncommand:");
									  	break;

							case 0x32:	if(OSTCBPrioTbl[2])
							            	SendCh("\nthis task is exist\ncommand:");
										else{
											OSTaskCreateExt(Task2,2,2,(void *)0,OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
											OSTaskSuspend(2);
											SendCh("\ncreate task2\ncommand:");
										}
									  	break;

							case 0x33:	if(OSTCBPrioTbl[3])
							            	SendCh("\nthis task is exist\ncommand:");
										else{
											OSTaskCreateExt(Task3,3,3,(void *)0,OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
											OSTaskSuspend(3);
											SendCh("\ncreate task3\ncommand:");
										}
										break;

                            default:  	SendCh("\ncan't create this task\ncommand:");
									  	break;
							}	             
					   }else{
					   		 SendCh("\nerr command\ncommand:");
					   }
					  break;

		 case 'S':    TaskStat();
					  SendCh("\ncommand:");
					  break;
		 case 'N':	  SendCh("\ncurrent task is----->task");	
		              PutCh(OSTCBCur->OSTCBPrio+0x30);
					  SendCh("\ncommand:");
					  break;

		 case 0x0d:	  SendCh("\ncommand:");
					  break;
	
		 default:     SendCh("\nerr command\ncommand:"); 
					  break;
		 }
		 I_dex=0;
     }
}

void Task2(void *mydata) reentrant{
     mydata=mydata;
     while(1){
	 SendCh("\rtask2 is runging!"); 
     }
}

void Task3(void *mydata) reentrant{
     mydata=mydata;
     while(1){	
	 SendCh("\rtask3 is runging!");
     }
}

void main (void)
{   
	InitTimer1(); 
	InitSerial();    
    OSInit();  
	Sem1=OSSemCreate(0);
#if OS_TASK_CREATE_EXT_EN     
    OSTaskCreateExt(Task1,1,1,(void *)0,OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
    OSTaskCreateExt(Task2,2,2,(void *)0,OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);
    OSTaskCreateExt(Task3,3,3,(void *)0,OS_TASK_OPT_STK_CLR + OS_TASK_OPT_STK_CHK);	  
#endif
#if OS_TASK_CREATE_EN 
	OSTaskCreate(Task1,1);
	OSTaskCreate(Task2,2);
	OSTaskCreate(Task3,3); 
#endif
	TimeTickConfig();
    OSStart(); 
} 

⌨️ 快捷键说明

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