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

📄 uc-os_ii 任务管理.txt

📁 ucos中文讲解 任务管理
💻 TXT
字号:
uc-os_II 任务管理2007-09-03 10:13任务(Task)对于uC/OS-II,就像进程对应于Windows一样,是系统内核的重要组成部分。

在本例中,用OSTaskCreateExt建立任务,并使用自定义的TASK_USER_DATA对栈的使用情况进行统计,统计使用自定义的统计函数OSTaskStatHook进行,这是与书中范例2的最大不同。在OS_CFG.H文件中,需要定义#define OS_CPU_HOOKS_EN      0,否则不能使用自定义的统计函数。

#include "includes.h"

/*
*********************************************************************************************************
*                                                 CONSTANTS
*********************************************************************************************************
*/
#define    TASK_START_STK_SIZE             512
#define    TASK1_STK_SIZE                  512
#define    TASK2_STK_SIZE                  256

#define    TASK_START_PRIO                   4
#define    TASK1_PRIO                        5
#define    TASK2_PRIO                        6

#define    N_TASKS                           2         /* 除TaskStart外的任务数                               */

/*
*********************************************************************************************************
*                                                   类型
*********************************************************************************************************
*/
typedef    struct {
      INT32U    Max;
      INT32U    Min;
      INT32U    Ave;
      INT32U    Cur;
} TASK_USER_DATA;
/*
*********************************************************************************************************
*                                                 VARIABLES
*********************************************************************************************************
*/

OS_STK                    TaskStartStk[TASK_START_STK_SIZE];        /* 为不同的任务定义不同的栈              */
OS_STK                    Task1Stk[TASK1_STK_SIZE];               
OS_STK                    Task2Stk[TASK2_STK_SIZE];

TASK_USER_DATA            TaskUserData[N_TASKS];                    /* 保存栈的使用情况                      */

/*
*********************************************************************************************************
*                                             FUNCTION PROTOTYPES
*********************************************************************************************************
*/

          void    Task1(void *data);                        /* Function prototypes of tasks                    */
          void    Task2(void *data);
          void    TaskStart(void *data);                    /* Function prototypes of Startup task             */
static    void    TaskStartCreateTasks(void);
          void    OSTaskStatHook(void);

/*$PAGE*/ 
/*
*********************************************************************************************************
*                                                  MAIN
*********************************************************************************************************
*/

void    main (void)
{
      PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);        /* Clear the screen                           */

      OSInit();                                                /* Initialize uC/OS-II                        */

      PC_DOSSaveReturn();                                      /* Save environment to return to DOS          */
      PC_VectSet(uCOS, OSCtxSw);                               /* Install uC/OS-II's context switch vector */


      OSTaskCreateExt(TaskStart, 
          (void *)0, 
          &TaskStartStk[TASK_START_STK_SIZE - 1],
          TASK_START_PRIO,
          TASK_START_PRIO,
          &TaskStartStk[0],
          TASK_START_STK_SIZE,
          (void *)0,
          0);
      OSStart();                                               /* Start multitasking                         */
}


/*
*********************************************************************************************************
*                                                STARTUP TASK
*********************************************************************************************************
*/
void    TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                  /* Allocate storage for CPU status register */
      OS_CPU_SR    cpu_sr;
#endif
      INT16S       key;


      pdata = pdata;                                           /* Prevent compiler warning                   */

      OS_ENTER_CRITICAL();
      PC_VectSet(0x08, OSTickISR);                             /* Install uC/OS-II's clock tick ISR          */
      PC_SetTickRate(OS_TICKS_PER_SEC);                        /* Reprogram tick rate                        */
      OS_EXIT_CRITICAL();

      OSStatInit();                                            /* Initialize uC/OS-II's statistics           */

      TaskStartCreateTasks();                                  /* Create all the application tasks           */

      PC_DispStr(0, 0, 
          (INT8U *)"ID      MaxStk      MinStk      Ave      Cur      Cnt",
          DISP_FGND_WHITE);
        
      for (;;) {

          if (PC_GetKey(&key) == TRUE) {                       /* See if key has been pressed                */
              if (key == 0x1B) {                               /* Yes, see if it's the ESCAPE key            */
                  PC_DOSReturn();                              /* Return to DOS                              */
              }
          }

          OSTimeDlyHMSM(0, 0, 1, 0);                           /* Wait one second                            */
      }
}

/*
*********************************************************************************************************
*                                               CREATE TASKS
*********************************************************************************************************
*/

static    void    TaskStartCreateTasks (void)
{

      memset(&TaskUserData[0], 0, N_TASKS * sizeof(TASK_USER_DATA));
      TaskUserData[0].Min = 0xFFFFFFFF;                                         /* 为了能正常比较最小数          */
      TaskUserData[1].Min = 0xFFFFFFFF;
    
      OSTaskCreateExt(Task1,
          (void *)0,
          &Task1Stk[TASK1_STK_SIZE - 1],
          TASK1_PRIO,
          TASK1_PRIO,
          &Task1Stk[0],
          TASK1_STK_SIZE,
          (void *)0,
          OS_TASK_OPT_STK_CHK + OS_TASK_OPT_STK_CLR);
        
      OSTaskCreateExt(Task2,
          (void *)0,
          &Task2Stk[TASK2_STK_SIZE - 1],
          TASK2_PRIO,
          TASK2_PRIO,
          &Task2Stk[0],
          TASK2_STK_SIZE,
          (void *)0,
          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);        
}

/*
*********************************************************************************************************
*                                                    TASKS
*********************************************************************************************************
*/

void    Task1 (void *pdata)
{
      pdata = pdata;
    
      for (;;) {
          OSTimeDly(2);
      }
}

void    Task2 (void *pdata)
{
      INT16U as;
    
      pdata = pdata;
    
      as = 32;
    
      for (;;) {
          OSTimeDly(10);
      }
}

/*
*********************************************************************************************************
*                                                 自定义统计任务
*********************************************************************************************************
*/
void    OSTaskStatHook (void)
{
             INT8U          i, s;
             OS_STK_DATA    stkdata;
             INT32U         stkused;
      static INT32U         CallCnt;
      static INT32U         tasktotal[N_TASKS];
             char           str[50];
    
      ++CallCnt;
      for (i = TASK1_PRIO; i < N_TASKS + TASK1_PRIO; i++) {
          OSTaskStkChk(i, &stkdata);
          stkused = stkdata.OSUsed;
        
          s = i - TASK1_PRIO;
        
          TaskUserData[s].Cur = stkused;
          if (TaskUserData[s].Max < stkused) { 
              TaskUserData[s].Max = stkused;
          }
          if (TaskUserData[s].Min > stkused) {
              TaskUserData[s].Min = stkused;
          }
          tasktotal[s] += stkused;
          TaskUserData[s].Ave = (INT32U)(tasktotal[s] / CallCnt);
        
          sprintf(str, "%2d      %6ld      %6ld      %3ld      %3ld      %3ld",
              i,
              TaskUserData[s].Max,
              TaskUserData[s].Min,
              TaskUserData[s].Ave,
              TaskUserData[s].Cur,
              CallCnt);
          PC_DispStr(0, s + 1, (INT8U *)str, DISP_FGND_GREEN);
      }
}

void    OSInitHookBegin (void)
{
}

/*
*********************************************************************************************************
*                                         OS INITIALIZATION HOOK
*                                                 (END)
*********************************************************************************************************
*/
void    OSInitHookEnd (void)
{
}

/*
*********************************************************************************************************
*                                            TASK CREATION HOOK
*********************************************************************************************************
*/
void    OSTaskCreateHook (OS_TCB *ptcb)
{
      ptcb = ptcb;                         /* Prevent compiler warning                                       */
}

/*
*********************************************************************************************************
*                                             TASK DELETION HOOK
*********************************************************************************************************
*/
void    OSTaskDelHook (OS_TCB *ptcb)
{
      ptcb = ptcb;                         /* Prevent compiler warning                                       */
}

/*
*********************************************************************************************************
*                                               IDLE TASK HOOK
*********************************************************************************************************
*/
void    OSTaskIdleHook (void)
{
}

void    OSTaskSwHook (void)
{

}

/*
*********************************************************************************************************
*                                             OSTCBInit() HOOK
*********************************************************************************************************
*/
void    OSTCBInitHook (OS_TCB *ptcb)
{
      ptcb = ptcb;                                             /* Prevent Compiler warning                   */
}

/*
*********************************************************************************************************
*                                                 TICK HOOK
*********************************************************************************************************
*/
void    OSTimeTickHook (void)
{
}
 


⌨️ 快捷键说明

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