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

📄 test.c

📁 uCOS2嵌入式操作系统源码
💻 C
字号:
//2005-6-19 16:03   全部整理后编译通过。
#include "includes.h"

#define   TASK_STK_SIZE     512
#define   N_TASKS            10

OS_STK    TaskStk[N_TASKS][TASK_STK_SIZE];
OS_STK    TaskStartStk[TASK_STK_SIZE];

char      TaskData[N_TASKS];
OS_EVENT  *RandomSem;

        void  Task(void *data);                       /* Function prototypes of tasks                  */
        void  TaskStart(void *data);                  /* Function prototypes of Startup task           */
static  void  TaskStartCreateTasks(void);
static  void  TaskStartDispInit(void);
static  void  TaskStartDisp(void);

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.20                            ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0,  3, "                                    EXAMPLE #1                                  ", 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, "                                                                                ", 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, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 13, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 14, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 15, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 16, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 17, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 18, "                                                                                ", 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);

#if OS_TASK_STAT_EN > 0
    sprintf(s, "%3d", OSCPUUsage);                                 /* Display CPU usage in %               */
    PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
#endif

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

    sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* 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;
    }
}


void main(void)
{
  PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);  //清除屏幕显示
  OSInit();  //必须调用的一个函数,该函数建立两个系统任务:空闲任务、CPU利用率统计任务
  PC_DOSSaveReturn();  //保存当前DOS环境,使用户可以返回到没有运行uC/OS-II之前的DOS环境
  PC_VectSet(uCOS,OSCtxSw);  //指定任务切换处理函数
  RandomSem = OSSemCreate(1);  //建立一个信号量,保护随机数发生函数。
  OSTaskCreate(TaskStart,(void *)0,&TaskStartStk[TASK_STK_SIZE - 1],0);  //开始多任务前,必须至少建立一个任务。
             //任务指针,任务初始化数据指针,任务堆栈栈顶,任务优先级         这里建立了一个TaskStart的任务
  OSStart();  //启动uC/OS-II,控制权移交。   启动OSStart()之前至少要先建立一个任务,否则会崩溃。
}

void TaskStart(void *pdata)
{
  #if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
  #endif
  char    s[100];
  INT16S  key;
  pdata = pdata;   //防止编译器优化或报错
  TaskStartDispInit();  //初始化屏幕
  
  OS_ENTER_CRITICAL();  //关中断
  PC_VectSet(0x08,OSTickISR);  //时钟源处理
  PC_SetTickRate(OS_TICKS_PER_SEC);   //更改时钟频率到200Hz
  OS_EXIT_CRITICAL();  //开中断
  OSStatInit();   //测试CPU使用率
  
  TaskStartCreateTasks();  //创建更多的任务
  
  for(;;)
  {
    TaskStartDisp();
    if(PC_GetKey(&key) == TRUE)
    {
      if(key == 0x1B)   //如果按下ESC键
      {
        PC_DOSReturn();
      }
    }
    OSCtxSwCtr = 0;
    OSTimeDlyHMSM(0,0,1,0);
  }
}

static void TaskStartCreateTasks(void)
{
  INT8U i;
  for(i = 0;i < N_TASKS;i++)
  {
    TaskData[i] = '0' + i;  //初始化一个数组,内容包括0~9的ASCII字符
    OSTaskCreate(Task,      //循环建立了N_TASKS个完全相同的任务
                (void *)&TaskData[i],   //每一个任务接受一个指向字符数组的指针
                &TaskStk[i][TASK_STK_SIZE - 1],   //每个任务分配一个堆栈空间
                i + 1);   //分配优先级
  }
}

void Task(void *pdata)
{
  INT8U x;
  INT8U y;
  INT8U err;
  
  for(;;)
  {
    OSSemPend(RandomSem,0,&err);  //检查随机数函数
    x = random(80);  //产生x随机数,范围0~79
    y = random(16);  //产生y随机数,范围0~15
    OSSemPost(RandomSem);  //释放信号量
    
   PC_DispChar(x,y + 5,*(char *)pdata,DISP_FGND_LIGHT_GREEN);  //开始在屏幕上显示字符
// PC_DispChar(x,y + 5,*(char *)pdata,DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

    OSTimeDly(1);  //延时、挂起该任务
  }
}

⌨️ 快捷键说明

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