关于ucos的表面理解

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include <includes.h>


/*
*********************************************************************************************************
*                                            LOCAL DEFINES
*********************************************************************************************************
*/
CPU_INT08U XC[3840]; //定义LCD显示缓冲区(240*128屏)
CPU_INT08U  ID=0; //主功能菜单选项ID
CPU_INT08U KEY=0; //按键码

CPU_INT08U SET=0;//进入设置菜单标记
CPU_INT08U SET1=0;//进入二级设置菜单标记
CPU_INT08U ID_CD1=0;//主菜单选项ID
CPU_INT08U ID_CD2=0;//次级菜单选项ID
/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/

 /* ----------------- APPLICATION GLOBALS ------------------ */
static  OS_STK       AppTaskStartStk[APP_TASK_START_STK_SIZE];    //入口线程堆栈
//////////////////////////////////////////////////////////////////////
static  OS_STK       AppStk1[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk2[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk3[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk4[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk5[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk6[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk7[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk8[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk9[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk10[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk11[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk12[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk13[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk14[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk15[APP_TASK_STK_SIZE];     //工作线程堆栈 
static  OS_STK       AppStk16[APP_TASK_STK_SIZE];     //工作线程堆栈 
///////////////////////////////////////////////////////////////////////
/*
*********************************************************************************************************
*                                         LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static  void  AppTaskStart    (void        *p_arg);    //入口线程     
////////////////////////////////////////////////////////////////////////
static  void  AppTask1(void *p_arg);  //工作线程函数体
static  void  AppTask2(void *p_arg);  //工作线程函数体
static  void  AppTask3(void *p_arg);  //工作线程函数体
static  void  AppTask4(void *p_arg);  //工作线程函数体
static  void  AppTask5(void *p_arg);  //工作线程函数体
static  void  AppTask6(void *p_arg);  //工作线程函数体
static  void  AppTask7(void *p_arg);  //工作线程函数体
static  void  AppTask8(void *p_arg);  //工作线程函数体
static  void  AppTask9(void *p_arg);  //工作线程函数体
static  void  AppTask10(void *p_arg);  //工作线程函数体
static  void  AppTask11(void *p_arg);  //工作线程函数体
static  void  AppTask12(void *p_arg);  //工作线程函数体
static  void  AppTask13(void *p_arg);  //工作线程函数体
static  void  AppTask14(void *p_arg);  //工作线程函数体
static  void  AppTask15(void *p_arg);  //工作线程函数体
static  void  AppTask16(void *p_arg);  //工作线程函数体
////////////////////////////////////////////////////////////////////////
/*
*********************************************************************************************************
*                                    LOCAL CONFIGURATION ERRORS
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Argument(s) : none
*
* Return(s)   : none
*********************************************************************************************************
*/

int  main (void)
{
  
    BSP_IntDisAll();                                            /* Disable all interrupts until we are ready to accept them */

    OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel"              */
    
    OSTaskCreate (AppTaskStart,(void *)0, (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],APP_TASK_START_PRIO);      

    OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II)       */
}


/*
*********************************************************************************************************
*                                          AppTaskStart()
*
* Description : The startup task.  The uC/OS-II ticker should only be initialize once multitasking starts.
*
* Argument(s) : p_arg       Argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Return(s)   : none.
*
* Note(s)     : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                   used.  The compiler should not generate any code for this statement.
*
*               (2) Interrupts are enabled once the task starts because the I-bit of the CCR register was
*                   set to 0 by 'OSTaskCreate()'.
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
   

    (void)p_arg;

    BSP_Init();                                                /* Initialize BSP functions                                 */   
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //在这里创建工作线程
    OSTaskCreate (AppTask1,  (void *)0, (OS_STK *)&AppStk1[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_1); 
    //挂起非必要线程
    OSTaskCreate (AppTask2,  (void *)0, (OS_STK *)&AppStk2[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_2);
    OSTaskSuspend(APP_TASK_PRIO_2); 
    OSTaskCreate (AppTask3,  (void *)0, (OS_STK *)&AppStk3[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_3);
    OSTaskSuspend(APP_TASK_PRIO_3);  
    OSTaskCreate (AppTask4,  (void *)0, (OS_STK *)&AppStk4[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_4);
    OSTaskSuspend(APP_TASK_PRIO_4);   
    OSTaskCreate (AppTask5,  (void *)0, (OS_STK *)&AppStk5[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_5);
    OSTaskSuspend(APP_TASK_PRIO_5); 
    OSTaskCreate (AppTask6,  (void *)0, (OS_STK *)&AppStk6[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_6);
    OSTaskSuspend(APP_TASK_PRIO_6); 
    OSTaskCreate (AppTask7,  (void *)0, (OS_STK *)&AppStk7[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_7);
    OSTaskSuspend(APP_TASK_PRIO_7); 
    OSTaskCreate (AppTask8,  (void *)0, (OS_STK *)&AppStk8[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_8);
    OSTaskSuspend(APP_TASK_PRIO_8); 
    OSTaskCreate (AppTask9,  (void *)0, (OS_STK *)&AppStk9[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_9);
    OSTaskSuspend(APP_TASK_PRIO_9); 
    OSTaskCreate (AppTask10,  (void *)0, (OS_STK *)&AppStk10[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_10);
    OSTaskSuspend(APP_TASK_PRIO_10); 
    OSTaskCreate (AppTask11,  (void *)0, (OS_STK *)&AppStk11[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_11);
    OSTaskSuspend(APP_TASK_PRIO_11);
    OSTaskCreate (AppTask12,  (void *)0, (OS_STK *)&AppStk12[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_12);
    OSTaskSuspend(APP_TASK_PRIO_12);  
    OSTaskCreate (AppTask13,  (void *)0, (OS_STK *)&AppStk13[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_13);
    OSTaskSuspend(APP_TASK_PRIO_13); 
    OSTaskCreate (AppTask14,  (void *)0, (OS_STK *)&AppStk14[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_14);
    OSTaskSuspend(APP_TASK_PRIO_14); 
    OSTaskCreate (AppTask15,  (void *)0, (OS_STK *)&AppStk15[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_15);
    OSTaskSuspend(APP_TASK_PRIO_15);
    OSTaskCreate (AppTask16,  (void *)0, (OS_STK *)&AppStk16[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_16);
    OSTaskSuspend(APP_TASK_PRIO_16);  
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    while (DEF_TRUE) {                                         /* Task body, always written as an infinite loop.           */               
          //处理主菜单相关功能                                           
      OSTimeDly (10); 
      KEY=getkey(); 
      if(KEY==5)
      {
        //响应回主菜单按键
        OSTaskSuspend(APP_TASK_PRIO_2);    //挂起所有非必要线程
        OSTaskSuspend(APP_TASK_PRIO_3);
        OSTaskSuspend(APP_TASK_PRIO_4); 
        OSTaskSuspend(APP_TASK_PRIO_5);
        OSTaskSuspend(APP_TASK_PRIO_6);
        OSTaskSuspend(APP_TASK_PRIO_7);
        OSTaskSuspend(APP_TASK_PRIO_8);
        OSTaskSuspend(APP_TASK_PRIO_9);
        OSTaskSuspend(APP_TASK_PRIO_10);
        OSTaskSuspend(APP_TASK_PRIO_11);
        OSTaskSuspend(APP_TASK_PRIO_12);
        OSTaskSuspend(APP_TASK_PRIO_13);
        OSTaskSuspend(APP_TASK_PRIO_14);
        OSTaskSuspend(APP_TASK_PRIO_15);
        OSTaskSuspend(APP_TASK_PRIO_16);
        //复位工作线程
        SET=0;
        SET1=0;
        ID_CD1=0;
        ID_CD2=0;
        ID=0;//设置菜单ID号返回主菜单
      }
      if(ID==0)    
      {
      //进入主菜单
      GUI_BJ_zhucaidan(XC);
       switch(KEY)
       {
         case 1:
                GUI_setID_zhucaidan_U(XC);
         break;

         case 2:
                GUI_setID_zhucaidan_D(XC);
         break;

         case 3:
               GUI_setID_zhucaidan_L(XC);
         break;

         case 4:
               GUI_setID_zhucaidan_R(XC);
         break;
      
         case 6:
              //确定并进入选定子功能
              ID=(GUI_getID_zhucaidan()+1); //根据返回的菜单ID选择激活子功能线程
              switch(ID)
              {
                  case 1:
                       OSTaskResume(APP_TASK_PRIO_2);//激活直流电压表工作线程
                  break;

                  case 2:
                       OSTaskResume(APP_TASK_PRIO_3);//激活交流电压表工作线程
                  break;

                  case 3:
                       OSTaskResume(APP_TASK_PRIO_4);//激活直流电流表工作线程
                  break;

                  case 4:
                       OSTaskResume(APP_TASK_PRIO_5);//激活交流电流表工作线程
                  break;

                  case 5:
                       OSTaskResume(APP_TASK_PRIO_6);//激活电阻表工作线程
                  break;

                  case 6:
                       OSTaskResume(APP_TASK_PRIO_7);//激活电容表工作线程
                  break;

                  case 8:
                       OSTaskResume(APP_TASK_PRIO_9);//激活温度表工作线程
                  break;

                  case 13:
                       OSTaskResume(APP_TASK_PRIO_14);//激活帮助及说明工作线程
                  break;

                 default: ID=0;//选择未实现的子功能后直接返回主菜单      
              }                                 
         break;

        default: 
      }

      }

    }   
}

 /*
*********************************************************************************************************
*                                          AppTaskStart1()
*
* Description : The startup task.  The uC/OS-II ticker should only be initialize once multitasking starts.
*
* Argument(s) : p_arg       Argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Return(s)   : none.
*
* Note(s)     : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                   used.  The compiler should not generate any code for this statement.
*
*               (2) Interrupts are enabled once the task starts because the I-bit of the CCR register was
*                   set to 0 by 'OSTaskCreate()'.
*********************************************************************************************************
*/
 static  void  AppTask1(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {       
    //线程1用来做LCD的刷屏工作
    OSTimeDly (15);
    LCD_XC_copy(XC,3840); //刷240*128屏
    }   
}

 static  void  AppTask2(void *p_arg)
{
  
      CPU_INT08U XS=1;    //显示单位
    CPU_INT08U DW=1;    //测量档位
    CPU_INT08U ADC_DATA=0;
    CPU_INT32U DATA=0;  //获取到的adc数据
    CPU_INT32U DATA_Z=0;  //整数部
    CPU_INT32U DATA_W=0;  //小数部

    CPU_INT32U DATA_H=0;  //获取到的adc数据     最大值
    CPU_INT32U DATA_H_Z=0;  //整数部
    CPU_INT32U DATA_H_W=0;  //小数部

    CPU_INT32U DATA_L=8888888;  //获取到的adc数据     最小值
    CPU_INT32U DATA_L_Z=0;  //整数部
    CPU_INT32U DATA_L_W=0;  //小数部

    CPU_INT32U DATA_P=0;  //获取到的adc数据 平均值
    CPU_INT32U DATA_P_Z=0;  //整数部
    CPU_INT32U DATA_P_W=0;  //小数部



    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //直流电压表工作线程                                                 
      OSTimeDly (3);
      GUI_BJ_DCV(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      ADC_DATA=getADC();
      switch(DW)
                  {
                    case 1:
                           DATA=(5000*ADC_DATA)/255;     //档位切换换算数据
                    break;

                    case 2:
                           DATA=(50000*ADC_DATA)/255;     //档位切换换算数据
                    break;

                    case 3:
                           DATA=(500000*ADC_DATA)/255;     //档位切换换算数据
                    break;

                    case 4:
                           DATA=(5000000*ADC_DATA)/255;     //档位切换换算数据
                    break;
                  }
      
      
          if(DATA_H<DATA) DATA_H=DATA;
          if(DATA_L>DATA) DATA_L=DATA;
          DATA_P=DATA;//平均值无意义
        

      if(XS==1)
      {
        DATA_Z=DATA/1000;
        DATA_W=(DATA/10)%100;

        DATA_H_Z=DATA_H/1000;
        DATA_H_W=(DATA_H/10)%100;

        DATA_P_Z=DATA_P/1000;
        DATA_P_W=(DATA_P/10)%100;

        DATA_L_Z=DATA_L/1000;
        DATA_L_W=(DATA_L/10)%100;

      }else  if(XS==2)
      {
         DATA_Z=DATA;
         DATA_W=0;

         DATA_H_Z=DATA_H;
         DATA_H_W=0;

         DATA_P_Z=DATA_P;
         DATA_P_W=0;

         DATA_L_Z=DATA_L;
         DATA_L_W=0;

      }

     

      GUI_print_sz_24x30(DATA_Z,DATA_W,XC);     //当前值
      GUI_print_sz_8x8_1(DATA_H_Z,DATA_H_W,XC);
      GUI_print_sz_8x8_2(DATA_P_Z,DATA_P_W,XC);
      GUI_print_sz_8x8_3(DATA_L_Z,DATA_L_W,XC);

      



      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,2);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<1) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=1;
                    break;

                    case 1:
                           XS=2;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_DCV(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
        

    }   
}

 static  void  AppTask3(void *p_arg)
{
   

    CPU_INT08U XS=1;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //交流电压表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_ACV(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,2);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<1) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=1;
                    break;

                    case 1:
                           XS=2;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_ACV(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    }   
}

 static  void  AppTask4(void *p_arg)
{
   

    CPU_INT08U XS=3;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //直流电流表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_DCA(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,3);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<1) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=3;
                    break;

                    case 1:
                           XS=4;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_DCA(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    }   
}

 static  void  AppTask5(void *p_arg)
{
   

    CPU_INT08U XS=3;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //交流电流表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_ACA(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,3);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<1) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=3;
                    break;

                    case 1:
                           XS=4;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_ACA(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    } 
}

 static  void  AppTask6(void *p_arg)
{
   

    CPU_INT08U XS=5;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //电阻表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_DZ(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,4);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<2) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=5;
                    break;

                    case 1:
                           XS=6;
                    break;

                    case 2:
                           XS=7;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_DZ(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    } 
}

 static  void  AppTask7(void *p_arg)
{
   

    CPU_INT08U XS=8;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //电容表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_DR(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,5);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<2) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=9;
                    break;

                    case 1:
                           XS=10;
                    break;

                    case 2:
                           XS=8;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_DR(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    } 
}

 static  void  AppTask8(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask9(void *p_arg)
{
   

    CPU_INT08U XS=11;    //显示单位
    CPU_INT08U DW=1;    //测量档位

    (void)p_arg;  

    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //温度电流表工作线程                                                 
      OSTimeDly (1);
      GUI_BJ_WD(XC);
      GUI_TB_DW(DW,XC);
      GUI_TB_XS(XS,XC);

      KEY=getkey();
      if(KEY==6) 
      {
      SET=1; //是否进入设置菜单
      }

      while(SET)
      {
        GUI_CD_1(XC,1);//显示二级菜单
        GUI_set_CD_1(ID_CD1,XC);//设置主菜单
        if(SET1==1)
        {
          if(ID_CD1==0){
          GUI_CD_2(XC,1);//档位选择二级菜单
          }else if(ID_CD1==1){
          GUI_CD_2(XC,6);//单位选择二级菜单
          }
          GUI_set_CD_2(ID_CD2,XC);//设置二级菜单
        }
        OSTimeDly (1);    

      KEY=getkey();
      switch(KEY)
       {
         
         case 1:
              //按键上
              if(SET1==0)
              {
              if(ID_CD1>0) ID_CD1--;
              }else 
              {
               if(ID_CD2>0) ID_CD2--;
              }           
         break;

         case 2:
              //按键下
              if(SET1==0)
              {    
              if(ID_CD1<2) ID_CD1++;
              }else
              {
                  if(ID_CD1==0)
                   {
                      if(ID_CD2<3) ID_CD2++;
                   }else 
                   if(ID_CD1==1)
                   {
                      if(ID_CD2<1) ID_CD2++;
                   }
              }

         break;

         case 6:
              //按键确定  
              if(SET1==0)
              {
                if(ID_CD1==2) SET=0;//返回功能界面
              if(ID_CD1==1||ID_CD1==0) SET1=1;
              }else{
               //设置各个参数
                if(ID_CD1==0)
                {
                 //设置测量档位
                  switch(ID_CD2)
                  {
                    case 0:
                           DW=1;
                    break;

                    case 1:
                           DW=2;
                    break;

                    case 2:
                           DW=3;
                    break;

                    case 3:
                           DW=4;
                    break;
                  }
                }else if(ID_CD1==1)
                {
                 //设置显示单位     
                   switch(ID_CD2)
                  {
                    case 0:
                           XS=11;
                    break;

                    case 1:
                           XS=12;
                    break;
                  }
                }
               //////////////////////
               //回前一菜单并刷新屏幕
               SET1=0;
               ID_CD2=0;
               GUI_BJ_WD(XC);
               GUI_TB_DW(DW,XC);
               GUI_TB_XS(XS,XC);
               //////////////////////
              }
         break;
      }

      }
    } 
}

 static  void  AppTask10(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask11(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask12(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask13(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask14(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    { 
      //帮助及说明                                                 
      OSTimeDly (20);
       GUI_BJ_HELP(XC);   
    }   
}

 static  void  AppTask15(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20);   
    }   
}

 static  void  AppTask16(void *p_arg)
{
   

    (void)p_arg;   
   
    while (DEF_TRUE)                                             /* Task body, always written as an infinite loop.           */
    {                                                  
      OSTimeDly (20); 
    }   
}
/*
*********************************************************************************************************
*********************************************************************************************************
**                                         uC/OS-II APP HOOKS  用户钩子
*********************************************************************************************************
*********************************************************************************************************
*/

#if (OS_APP_HOOKS_EN > 0)
/*
*********************************************************************************************************
*                                      TASK CREATION HOOK (APPLICATION)
*
* Description : This function is called when a task is created.
*
* Argument(s) : ptcb   is a pointer to the task control block of the task being created.
*
* Note(s)     : (1) Interrupts are disabled during this call.
*********************************************************************************************************
*/

void  App_TaskCreateHook (OS_TCB *ptcb)
{

}

/*
*********************************************************************************************************
*                                    TASK DELETION HOOK (APPLICATION)
*
* Description : This function is called when a task is deleted.
*
* Argument(s) : ptcb   is a pointer to the task control block of the task being deleted.
*
* Note(s)     : (1) Interrupts are disabled during this call.
*********************************************************************************************************
*/

void  App_TaskDelHook (OS_TCB *ptcb)
{
    (void)ptcb;
}

/*
*********************************************************************************************************
*                                      IDLE TASK HOOK (APPLICATION)
*
* Description : This function is called by OSTaskIdleHook(), which is called by the idle task.  This hook
*               has been added to allow you to do such things as STOP the CPU to conserve power.
*
* Argument(s) : none.
*
* Note(s)     : (1) Interrupts are enabled during this call.
*********************************************************************************************************
*/

#if OS_VERSION >= 251
void  App_TaskIdleHook (void)
{
}
#endif

/*
*********************************************************************************************************
*                                        STATISTIC TASK HOOK (APPLICATION)
*
* Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's
*               statistics task.  This allows your application to add functionality to the statistics task.
*
* Argument(s) : none.
*********************************************************************************************************
*/

void  App_TaskStatHook (void)
{
}

/*
*********************************************************************************************************
*                                        TASK SWITCH HOOK (APPLICATION)
*
* Description : This function is called when a task switch is performed.  This allows you to perform other
*               operations during a context switch.
*
* Argument(s) : none.
*
* Note(s)     : (1) Interrupts are disabled during this call.
*
*               (2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
*                   will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
*                  task being switched out (i.e. the preempted task).
*********************************************************************************************************
*/

#if OS_TASK_SW_HOOK_EN > 0
void  App_TaskSwHook (void)
{

}
#endif

/*
*********************************************************************************************************
*                                     OS_TCBInit() HOOK (APPLICATION)
*
* Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting
*               up most of the TCB.
*
* Argument(s) : ptcb    is a pointer to the TCB of the task being created.
*
* Note(s)     : (1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/

#if OS_VERSION >= 204
void  App_TCBInitHook (OS_TCB *ptcb)
{
    (void)ptcb;
}
#endif

/*
*********************************************************************************************************
*                                        TICK HOOK (APPLICATION)
*
* Description : This function is called every tick.
*
* Argument(s) : none.
*
* Note(s)     : (1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/

#if OS_TIME_TICK_HOOK_EN > 0
void  App_TimeTickHook (void)
{
}
#endif
#endif

 

初始化任务栈大小;

 

ucos初始化

创建任务:

  任务名字 大小 优先级

  任务里都是死循环

  根据任务切换函数,根据优先级,根据任务状态进行任务切换。

osstart();

 

在使用tick中断时,将timer_isr放入os_cpu.c中。

 

注意: 转自其它的地方

posted @ 2017-06-27 20:46  960504502  阅读(180)  评论(0)    收藏  举报