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

📄 test.c

📁 ucos-ii, 开发环境 c 语言,此代码很有学习价值.
💻 C
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                                             Author:陈是知
*                                          All Rights Reserved
*                                                 v0.1
*                                             密码器包协议
*********************************************************************************************************
*/

#include <includes.h>
/*
*********************************************************************************************************
*                                              CONSTANTS
*********************************************************************************************************
*/

#define          TASKSTART_ID        4                /* 任务的ID                                      */
#define          RxTASK_ID           5
#define          TxTASK_ID           6
#define          OETASK_ID           7

#define          TASKSTART_PRIO      4                /* 任务的优先级                                  */
#define          RxTASK_PRIO         5
#define          TxTASK_PRIO         6
#define          OETASK_PRIO         7

/*
*********************************************************************************************************
*                                         LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/

INT8U RESFlag=0x00;
INT8U OEFlag =0x00;
INT8U InBuf[130];
INT8U OutBuf[256];
INT8U TICKS;

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/
OS_STK        TaskStartStk[TASK_STK_SIZE];             /* 声明启动任务堆栈                              */
OS_STK        RxTASKStk[TASK_STK_SIZE];                /* 声明接收任务堆栈                              */
OS_STK        TxTASKStk[TASK_STK_SIZE];                /* 声明发送任务堆栈                              */
OS_STK        OETASKStk[TASK_STK_SIZE];                /* 声明加/解密任务堆栈                           */

/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPESZ
*********************************************************************************************************
*/
void  TaskStart(void *cszdata) reentrant;              /* 声明任务原型                                   */
void  RxTASK(void *cszdata) reentrant; 
void  TxTASK(void *cszdata) reentrant;
void  OETASK(void *cszdata) reentrant;
void  TaskCreate(void);

/*
*********************************************************************************************************
*                                                  MAIN
*********************************************************************************************************
*/
void main(void)
{  
    OS_STK *ptos;
    OS_STK *pbos;
    INT32U  size;

    OSInit();                                         /* 初始化uC/OS-II                                 */
    InitTimer0();                                     /* 初始化定时器0                                  */
    CommBufInit();                                    /* 初始化串口缓冲区                               */
    CommInit();                                       /* 初始化串口                                     */

    ptos        = &TaskStartStk[0];                   /* 51的堆栈是从下向上递增的,所以栈顶为最低地址   */     
    pbos        = &TaskStartStk[TASK_STK_SIZE - 1];
    size        = TASK_STK_SIZE;
                                                      /* 建立TaskStart任务                              */
    OSTaskCreateExt(TaskStart,                                               
                   (void *)0,   
                   ptos,
                   TASKSTART_PRIO,
                   TASKSTART_ID,
                   pbos,
                   size,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSStart();                                        /* 开始执行                                       */
}

/*
*********************************************************************************************************
*                                               STARTUP TASK
*********************************************************************************************************
*/
void  TaskStart (void *cszdata) reentrant
{  
   INT16U i=0;
   INT16U j=0;
   INT16U CRC;
   /*
   命令表如下,用户可以通过虚拟接受来实现脱离实际开发环境的程序调试。
   CMD1: 1B 03 01 F6 E0
   RES1: 1B 0C 01 01 01 01 01 01 01 01 01 01 2C 1F

   CMD2: 1B 07 02 01 02 03 04 FD 95
   RES2: 1B 0B 02 XX XX XX XX 01 02 03 04 XX XX

   CMD3: 1B 0A 03 O1 02 03 04 01 02 03 3E CC
   RES3: 1B OD 03 XX XX XX XX 01 02 03 01 02 03 XX XX
   */
   INT8U  Puts[64]={0x1B,0x0A,0x03,0x01,0x02,0x03,0x04,0x01,0x02,0x03}; //这里填上需要虚拟接受的命令包内容
   extern INT8U  TICKS;

    cszdata = cszdata;                                     /* 防止编译警告                             */
    
    //注意!在最高优先级任务循环前打开定时器中断,以满足在OSStart()前不产生中断的要求。
    //在系统调用OSInit()时会自动创建一个优先级最低的系统任务,创建过程中会调用OS_EXIT_CRITICAL()打开EA。
    //若在InitTimer0()里打开T0中断,则违反了在OSStart()前不产生中断的要求。
    //切记将ET0=1;放在最高优先级任务里,OSStart()将调用OSStartHighRdy()第一个运行最高优先级任务,这样ET0=1总能被第一个执行。
    ET0=1;

	//如果需要虚拟接受命令包,将下面的代码加入编译,如果命令包正确,程序运行后会发出响应包
    /*
    CRC = cal_crc(Puts,(Puts[1]));
    j=(INT16U)Puts[1];
    Puts[j+1]=(INT8U)CRC;
    Puts[j]=(INT8U)(CRC>>8);		 
    j=j+2;
    
    for(i=0;i<j;i++)
    {CommPutRxChar(Puts[i]);}  
    */
                              
    TaskCreate();                                          /* 创建任务                                 */

    for(;;)
    {   
	 TICKS++;
     OSTimeDly(OS_TICKS_PER_SEC);                           /* 延时一秒                                 */   
    }
}
/*
*********************************************************************************************************
*                                             CREATE TASKS
*********************************************************************************************************
*/
void  TaskCreate (void)
{

    OSTaskCreateExt(RxTASK,
                   (void *)0,
                   &RxTASKStk[0],
                   RxTASK_PRIO,
                   RxTASK_ID,
                   &RxTASKStk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSTaskCreateExt(TxTASK,
                   (void *)0,
                   &TxTASKStk[0],
                   TxTASK_PRIO,
                   TxTASK_ID,
                   &TxTASKStk[TASK_STK_SIZE - 1],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSTaskCreateExt(OETASK,
                   (void *)0,
                   &OETASKStk[0],
                   OETASK_PRIO,
                   OETASK_ID,
                   &OETASKStk[TASK_STK_SIZE-1],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

}



/*
*********************************************************************************************************
*                                             RxTASK
*********************************************************************************************************
*/

void RxTASK(void *cszdata) reentrant
{   
    INT8U  ch;
    INT8U  err;
    INT8U  Flag=0x00;
    INT8U  CRCLEN;
    INT8U  H,L;
    INT8U  CMD;
    INT16U LENCtr=0;
    INT16U i=2;
    INT16U CRC,k;
    extern INT8U InBuf[130];
	extern INT8U RESFlag;
	extern INT8U OEFlag;

    cszdata=cszdata;

    for (;;) 
    {
     ch=CommGetChar(OS_TICKS_PER_SEC,&err);
     if(err==COMM_NO_ERR)
     {
      if(ch==0x1B)
      {Flag=0x01;InBuf[0]=0x1B;}
      else
      {
       if(Flag==0x01)
       {LENCtr=(INT16U)ch;Flag=0x02;InBuf[1]=ch;}
       else
       {
        if(LENCtr>0)
        {InBuf[i]=ch;i++;LENCtr--;
         if(LENCtr==0)
         {Flag=0x00;CRCLEN=InBuf[1];k=(INT16U)InBuf[1];
          CRC=cal_crc(InBuf,CRCLEN);
          L=(INT8U)CRC;H=(INT8U)(CRC>>8);
          if(H==InBuf[k] && L==InBuf[k+1])
          {CMD=InBuf[2];
           switch(CMD)
           {
            case 0x01:RESFlag=0x01;break;
            case 0x02:OEFlag =0x01;break;
            case 0x03:OEFlag =0x02;break;
           }
          }
         }
        }
       }
      }
	 }
     OSTimeDly(2);
	}	 
}

/*
*********************************************************************************************************
*                                             TxTASK
*********************************************************************************************************
*/

void TxTASK(void *cszdata) reentrant
{   

	INT8U  RES1[14]={0x1B,0x0C,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00};
    INT8U  H,L;
	INT8U  CRCLEN;
   	INT16U i,j;
	INT16U CRC;
	extern INT8U OutBuf[256];
	extern INT8U RESFlag;
    cszdata=cszdata;

    for (;;) 
	    {
         switch(RESFlag)
		 {
		  case 0x01:CRCLEN=0x0C;
		            CRC=cal_crc(RES1,CRCLEN);
					RES1[13]=(INT8U)CRC;
					RES1[12]=(INT8U)(CRC>>8);
		            for(i=0;i<14;i++)
		            {CommPutChar(RES1[i],OS_TICKS_PER_SEC);}
					RESFlag=0x00;break;

		  case 0x02:CRCLEN=OutBuf[1];
		            CRC=cal_crc(&OutBuf[0],CRCLEN);
					j=(INT16U)OutBuf[1];
					for(i=0;i<j;i++)
					{CommPutChar(OutBuf[i],OS_TICKS_PER_SEC);}
					L=(INT8U)CRC;H=(INT8U)(CRC>>8);
					CommPutChar(H,OS_TICKS_PER_SEC);
 					CommPutChar(L,OS_TICKS_PER_SEC);
					RESFlag=0x00;break;

		  case 0x03:CRCLEN=OutBuf[1];
		            CRC=cal_crc(&OutBuf[0],CRCLEN);
					j=(INT16U)OutBuf[1];
					for(i=0;i<j;i++)
					{CommPutChar(OutBuf[i],OS_TICKS_PER_SEC);}
					L=(INT8U)CRC;H=(INT8U)(CRC>>8);
					CommPutChar(H,OS_TICKS_PER_SEC);
 					CommPutChar(L,OS_TICKS_PER_SEC);
					RESFlag=0x00;break;
         }
         OSTimeDly(2);
        }

}

/*
*********************************************************************************************************
*                                             OETASK
*********************************************************************************************************
*/

void OETASK(void *cszdata) reentrant
{   
    INT8U  H2,H1,L2,L1;
	INT16U  k;
	INT16U i,j;
    extern INT8U OutBuf[256];
	extern INT8U InBuf[130];

    cszdata=cszdata;

    for (;;) 
	    {
		 srand(TICKS);
		 switch(OEFlag)
		 {
		  case 0x01:OutBuf[0]=0x1B;
		            OutBuf[1]=InBuf[1]+0x04;
					OutBuf[2]=0x02;
					j=(INT16U)OutBuf[1];
					H2=rand();
					H1=rand();
					L2=rand();
					L1=rand();
					OutBuf[3]=H2;
					OutBuf[4]=H1;
					OutBuf[5]=L2;
					OutBuf[6]=L1;
					for(i=7;i<j;i++)
					{
					 OutBuf[i]=InBuf[i-4];
					}
					RESFlag=0x02;OEFlag=0x00;break;
          case 0x02:OutBuf[0]=0x1B;
		  			OutBuf[1]=InBuf[1];
					OutBuf[2]=0x03;
		            j=(INT16U)InBuf[1];k=0;
					H2=rand();
					H1=rand();
					L2=rand();
					L1=rand();
					OutBuf[3]=H2;
					OutBuf[4]=H1;
					OutBuf[5]=L2;
					OutBuf[6]=L1;
					for(i=7;i<j;i++)
					{OutBuf[i]=InBuf[i];k++;}
					OutBuf[1]=OutBuf[1]+(INT8U)k;
					for(i=j;i<j+k;i++)
					{OutBuf[i]=InBuf[i-k];}
					RESFlag=0x03;OEFlag=0x00;break;
         }
       
          OSTimeDly(2);
        }

}


	  

⌨️ 快捷键说明

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