test.c

来自「uCOS2嵌入式操作系统源码」· C语言 代码 · 共 349 行

C
349
字号
#include "includes.h"    //包含的主控头文件

#define    TASK_STK_SIZE    512    //定义堆栈容量

#define    TASK_START_ID    0    //任务标志符,OSTaskCreateExt()
#define    TASK_CLK_ID      1
#define    TASK_1_ID        2
#define    TASK_2_ID        3
#define    TASK_3_ID        4
#define    TASK_4_ID        5
#define    TASK_5_ID        6

#define    TASK_START_PRIO   10   //任务优先级
#define    TASK_CLK_PRIO     11
#define    TASK_1_PRIO       12
#define    TASK_2_PRIO       13
#define    TASK_3_PRIO       14
#define    TASK_4_PRIO       15
#define    TASK_5_PRIO       16

OS_STK     TaskStartStk[TASK_STK_SIZE];   //详细定义堆栈容量
OS_STK     TaskClkStk[TASK_STK_SIZE];
OS_STK     Task1Stk[TASK_STK_SIZE];
OS_STK     Task2Stk[TASK_STK_SIZE];
OS_STK     Task3Stk[TASK_STK_SIZE];
OS_STK     Task4Stk[TASK_STK_SIZE];
OS_STK     Task5Stk[TASK_STK_SIZE];

OS_EVENT   *AckMbox;
OS_EVENT   *TxMbox;

static void TaskStartDispInit(void);  //初始化屏幕的函数,用户自己直接设计。
static void TaskStartCreateTasks(void); //创建系统任务
static void TaskStartDisp(void);   //范例DOS屏幕底部的相关信息显示函数

       void TaskStart(void *pdata);  //范例2的6个任务的声明
       void TaskClk(void *pdata);
       void Task1(void *pdata);
       void Task2(void *pdata);
       void Task3(void *pdata);
       void Task4(void *pdata);
       void Task5(void *pdata);


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

  PC_DispClrScr(DISP_FGND_WHITE);

  OSInit();

  PC_DOSSaveReturn();
  PC_VectSet(uCOS,OSCtxSw);

  PC_ElapsedInit();  //初始化时间测量功能,用来计算OSTaskStkChk()函数的运行时间,
                     //精确记录PC_ElapsedStart()和PC_ElapsedStop()函数的调用时刻,从而计算这两个时刻间代码的执行时间。

  ptos = &TaskStartStk[TASK_STK_SIZE - 1];
  pbos = &TaskStartStk[0];
  size = TASK_STK_SIZE;         //以上三项都是因为OSTaskStkInit_FPE_x86()函数修改了堆栈顶、底及堆栈容量,需要把
                                //修改后的值传递给OSTaskCreateExt()函数。

  OSTaskStkInit_FPE_x86(&ptos,&pbos,&size);
  OSTaskCreateExt(TaskStart,  //OSTaskCreateExt()支持对堆栈的修改和运行时对堆栈容量的检查,是OSTaskCreate()函数的功能扩展函数。
                  (void *)0,
                  ptos,
                  TASK_START_PRIO,  //任务优先级
                  TASK_START_ID,   //任务标志符,这里未使用,可为任意值
                  pbos,
                  size,
                  (void *)0,   //这里未使用
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); //允许堆栈检查,并需要在任务建立时将堆栈清0。
  OSStart();
}

void TaskStart(void *pdata)
{
  #if OS_CRITICAL_METHOD == 3
      OS_CPU_SR cpu_sr;
  #endif
  INT16S   key;
  pdata = pdata;
  TaskStartDispInit();  //初始化屏幕

  OS_ENTER_CRITICAL();  //关中断
  PC_VectSet(0x08,OSTickISR);
  PC_SetTickRate(OS_TICKS_PER_SEC);
  OS_EXIT_CRITICAL();

  OSStatInit();

  AckMbox = OSMboxCreate((void *)0);
  TxMbox  = OSMboxCreate((void *)0);  //建立两个邮箱

  TaskStartCreateTasks();  //创建系统任务

  for(;;)
  {
    TaskStartDisp();  //范例DOS屏幕底部的相关信息显示函数

    if(PC_GetKey(&key))
    {
      if(key == 0x1B)
      {
        PC_DOSReturn();
      }
    }

    OSCtxSwCtr = 0;  //若没有按下ESC,则记录任务切换次数的全局变量清0
    OSTimeDly(OS_TICKS_PER_SEC);  //os_cfg.h中定义
  }
}

static void TaskStartDispInit(void)
{
  PC_DispStr( 0,  0, "                         uC/OS-II, The Real-Time Kernel                         ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
  PC_DispStr( 0,  1, "                                Jean J. Labrosse                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  2, "                              by Xu Dong   2005.6.21                            ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  3, "                                    EXAMPLE #2                                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  4, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  5, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  6, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  7, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  8, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0,  9, "Task           Total Stack  Free Stack  Used Stack  ExecTime (uS)               ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 10, "-------------  -----------  ----------  ----------  -------------               ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 11, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 12, "TaskStart():                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 13, "TaskClk()  :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 14, "Task1()    :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 15, "Task2()    :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 16, "Task3()    :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 17, "Task4()    :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 18, "Task5()    :                                                                    ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 19, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 20, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 21, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 22, "#Tasks          :        CPU Usage:     %                                       ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 23, "#Task switch/sec:                                                               ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
  PC_DispStr( 0, 24, "                            <- PRESS 'ESC' TO QUIT ->                           ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
}

static void TaskStartDisp(void)
{
  char   s[80];

  sprintf(s, "%5d", OSTaskCtr);         /* Display #tasks running */
  PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

  sprintf(s, "%3d", OSCPUUsage);        /* Display CPU usage in % */
  PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

  sprintf(s, "%5d", OSCtxSwCtr);        /* Display #context switches per second */
  PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

  sprintf(s, "V%4.2f", (float)OSVersion() * 0.01);    /* Display uC/OS-II's version number */
  PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);

  switch (_8087)
  {             /* Display whether FPU present */
    case 0: PC_DispStr(71, 22, " NO  FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE);  break;
    case 1: PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);  break;
    case 2: PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);  break;
    case 3: PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE);  break;
  }
}

static void TaskStartCreateTasks(void)
{
  OSTaskCreateExt(TaskClk,
                 (void *)0,
                 &TaskClkStk[TASK_STK_SIZE - 1],
                 TASK_CLK_PRIO,
                 TASK_CLK_ID,
                 &TaskClkStk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  OSTaskCreateExt(Task1,
                 (void *)0,
                 &Task1Stk[TASK_STK_SIZE - 1],
                 TASK_1_PRIO,
                 TASK_1_ID,
                 &Task1Stk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  OSTaskCreateExt(Task2,
                 (void *)0,
                 &Task2Stk[TASK_STK_SIZE - 1],
                 TASK_2_PRIO,
                 TASK_2_ID,
                 &Task2Stk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  OSTaskCreateExt(Task3,
                 (void *)0,
                 &Task3Stk[TASK_STK_SIZE - 1],
                 TASK_3_PRIO,
                 TASK_3_ID,
                 &Task3Stk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  OSTaskCreateExt(Task4,
                 (void *)0,
                 &Task4Stk[TASK_STK_SIZE-1],
                 TASK_4_PRIO,
                 TASK_4_ID,
                 &Task4Stk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  OSTaskCreateExt(Task5,
                 (void *)0,
                 &Task5Stk[TASK_STK_SIZE-1],
                 TASK_5_PRIO,
                 TASK_5_ID,
                 &Task5Stk[0],
                 TASK_STK_SIZE,
                 (void *)0,
                 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}

void Task1(void *pdata)
{
  INT8U         err;
  OS_STK_DATA   data;
  INT16U   time;
  INT8U    i;
  char     s[80];
  
  pdata = pdata;
  for(;;)
  {
    for(i = 0;i < 7;i++)
    {
      PC_ElapsedStart();
      err = OSTaskStkChk(TASK_START_PRIO + i,&data);
      time = PC_ElapsedStop();
      if(err == OS_NO_ERR)
      {
        sprintf(s,"%4ld    %4ld    %4ld   %6d",
                data.OSFree + data.OSUsed,
                data.OSFree,
                data.OSUsed,
                time);
        PC_DispStr(19,12 + i,s,DISP_FGND_YELLOW);
      }
    }
    OSTimeDlyHMSM(0,0,0,100);
  }
}

void Task2(void *data)
{
  data = data;
  for(;;)
  {
    PC_DispChar(70,15,'|',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(10);
    PC_DispChar(70,15,'/',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(10);
    PC_DispChar(70,15,'-',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(10);
    PC_DispChar(70,15,'\\',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(10);
  }
}

void Task3(void *data)
{
  char   dummy[500];
  INT16U i;
  
  data = data;
  for(i = 0;i < 499;i++)
  {
    dummy[i] = '?';
  }
  
  for(;;)
  {
    PC_DispChar(70,16,'|',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(20);
    PC_DispChar(70,16,'/',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(20);
    PC_DispChar(70,16,'-',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(20);
    PC_DispChar(70,16,'\\',DISP_FGND_WHITE + DISP_BGND_RED);
    OSTimeDly(20);
  }
}

void Task4(void *data)
{
  char   txmsg;
  INT8U  err;
  
  data = data;
  txmsg = 'A';
  for(;;)
  {
    OSMboxPost(TxMbox,(void *)&txmsg);
    OSMboxPend(AckMbox,0,&err);
    txmsg++;
    if(txmsg == 'Z')
    {
      txmsg = 'A';
    }
  }
}

void Task5(void *data)
{
  char  *rxmsg;
  INT8U   err;
  
  data = data;
  for(;;)
  {
    rxmsg = (char *)OSMboxPend(TxMbox,0,&err);
    PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW + DISP_BGND_RED);
  //  OSTimeDlyHMSM(0,0,1,0);
    OSMboxPost(AckMbox,(void *)1);
  }
}

void TaskClk(void *data)
{
  char   s[40];
  data = data;
  for(;;)
  {
    PC_GetDateTime(s);
    PC_DispStr(60,23,s,DISP_FGND_BLUE + DISP_BGND_CYAN);
    OSTimeDly(OS_TICKS_PER_SEC);
  }
}

⌨️ 快捷键说明

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