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

📄 test.c

📁 UCOS2.52 代码详细注释
💻 C
📖 第 1 页 / 共 2 页
字号:
    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;
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                               TASK #1
*********************************************************************************************************
*/

void  Task1 (void *pdata)
{
    char  *msg;
    INT8U  err;


    pdata = pdata;
    for (;;) {
        msg = (char *)OSQPend(MsgQueue, 0, &err);       /*消息队列无限期的等待消息队列的消息*/
        PC_DispStr(70, 13, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE);/*接收到一条消息,在屏幕上显示*/
        OSTimeDlyHMSM(0, 0, 0, 100);                     /*延时100ms,以便能看到消息已经接到*/
    }
}

/*
*********************************************************************************************************
*                                               TASK #2
*********************************************************************************************************
*/

void  Task2 (void *pdata)
{
    char  msg[20];


    pdata = pdata;
    strcpy(&msg[0], "Task 2");                           /**/
    for (;;) {
        OSQPost(MsgQueue, (void *)&msg[0]);             /*Task2()发送一个指向字符串'Task2'的指针*/
        OSTimeDlyHMSM(0, 0, 0, 500);                     /*Task2()将延时0.5S再次发送消息*/
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               TASK #3
*********************************************************************************************************
*/

void  Task3 (void *pdata)
{
    char  msg[20];


    pdata = pdata;
    strcpy(&msg[0], "Task 3");
    for (;;) {
        OSQPost(MsgQueue, (void *)&msg[0]);
        OSTimeDlyHMSM(0, 0, 0, 500);
    }
}

/*
*********************************************************************************************************
*                                               TASK #4
*********************************************************************************************************
*/

void  Task4 (void *pdata)
{
    char  msg[20];


    pdata = pdata;
    strcpy(&msg[0], "Task 4");
    for (;;) {
        OSQPost(MsgQueue, (void *)&msg[0]);
        OSTimeDlyHMSM(0, 0, 0, 500);
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               TASK #5
*********************************************************************************************************
*/

void  Task5 (void *pdata)
{
    pdata = pdata;
    for (;;) {
        OSTimeDlyHMSM(0, 0, 0, 100);          /*这个任务只是简单的让自己延时100MS如果一个任务里没有这样的步骤
        ,那么所有比这个任务优先级低的任务将不可能运行*/
    }
}

/*
*********************************************************************************************************
*                                               CLOCK TASK
*********************************************************************************************************
*/

void  TaskClk (void *pdata)                       /*调用这个函数显示当前的日期和时间*/
{
    char  s[40];


    pdata = pdata;
    for (;;) {
        PC_GetDateTime(s);
        PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);
        OSTimeDlyHMSM(0, 0, 0, 500);
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                      DISPLAY TASK RELATED STATISTICS
*********************************************************************************************************
*/

void  DispTaskStat (INT8U id)
{
    char  s[80];


    sprintf(s, "%-18s %05u      %5u          %10ld",
            TaskUserData[id].TaskName,
            TaskUserData[id].TaskCtr,
            TaskUserData[id].TaskExecTime,
            TaskUserData[id].TaskTotExecTime);
    PC_DispStr(0, id + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}

/*
*********************************************************************************************************
*                                       OS INITIALIZATION HOOK
*                                            (BEGINNING)
          程序运行时,产生的时间很难通过阅读每个任务的代码来确定。UCOS是提供源代码的,这样很容易通过UCOS
          提供的接口函数HOOK函数添加新的功能代码。在UCOS中,共有9个这样的接口函数。这些接口函数的函数原型在
          OS_CPU_C.C文件中通常是由为处理器一直UCOS的人完成的;但是,如果将配置长数OS_CPU_HOOKS_EN定义为0,
          就可以在另一个文件里重新申明这些接口函数。OS_CPU_HOOKS_EN是在OS_CFG.H文件中提供的众多的配置常数之一
          。每个使用UCOS的项目,起要求各不相同,其OS_CSG.H文件也不相同。本书中的每个范例都在SOURCE目录下提供了
          该范例的OS_CSG.H文件
*********************************************************************************************************
*/
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)
{
}

/*
*********************************************************************************************************
*                                           STATISTIC TASK HOOK统计任务借口函数
   当允许使用统计任务时(OS_CFG.H文件中的OS_TASK_STAT_EN配置长数设置为1)  ,统计任务将首先调用定义的OSTaskStatHook() 
接口函数,范例三中的该接口函数的代码如下  统计任务每秒运行一次,该借口函数也是每秒运行一次
*********************************************************************************************************
*/

void  OSTaskStatHook (void)
{
    char    s[80];
    INT8U   i;
    INT32U  total;
    INT8U   pct;


    total = 0L;                                          /* Totalize TOT. EXEC. TIME for each task */
    for (i = 0; i < 7; i++) {
        total += TaskUserData[i].TaskTotExecTime;          /*计算所有任务的运行时间(处空闲任务和统计任务)*/
        DispTaskStat(i);                                 /* Display task data调用了这个函数在合适的位置显示每个任务
        的累计运行时间,同时给每个任务定义的名字也显示出来*/
    }                                                     /**/
    if (total > 0) {
        for (i = 0; i < 7; i++) {                        /* Derive percentage of each task         */
            pct = 100 * TaskUserData[i].TaskTotExecTime / total;
            sprintf(s, "%3d %%", pct);
            PC_DispStr(62, i + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);/*显示以百分比表示的每个任务的相对CPU占有率*/
        }
    }
    if (total > 1000000000L) {                           /* Reset total time counters at 1 billion */
        for (i = 0; i < 7; i++) {
            TaskUserData[i].TaskTotExecTime = 0L;
        }
    }
}

/*
*********************************************************************************************************
*                                           TASK SWITCH HOOK
*********************************************************************************************************
*/
void  OSTaskSwHook (void)
{
    INT16U           time;
    TASK_USER_DATA  *puser;


    time  = PC_ElapsedStop();                    /* This task is done通过调用 time  = PC_ElapsedStop()
    函数,得到当前被切换的任务运行的时间*/
    PC_ElapsedStart();                           /* Start for next task;当下一个任务被切换到运行态之前调
    用PC_ElapsedStart(),记录当时的时刻。第一次任务切换时得到的值是不正确的,但是这并不是什么要紧的错误。
    void  OSTaskSwHook (void)接口函数允许计算机每个任务的运行时间,记录每个任务的总的运行时间和运行次数。
    每当UCOS从一个低优先级的任务切换到一个高优先级的任务是,调用该接口函数。*/
    puser = OSTCBCur->OSTCBExtPtr;               /* Point to used data当OSTaskSwHook 被调用时,全局变量OSTCBCur指向
    当前任务的TCB任务控制块,而OSTCBHighRdy指向即将被调度运行的任务的TCB任务控制块。在范例三中,OSTCBHighRdy并没有用到
    。OSTaskSwHook ()通过OSTCBCur得到当前任务在建立时指定的TASK_USER_DATA数据结构的指针*/
    if (puser != (TASK_USER_DATA *)0) {          /*检查该任务是否正确定义了一个TASK_USER_DATA数据结构。此情况
    有可能发生,实际上空闲任务和统计任务就没有定义TASK_USER_DATA数据结构。*/
        puser->TaskCtr++;                        /* Increment task counter任务运行次数加一。这个记录可以用来判断
        这个任务是否曾经运行过。*/
        puser->TaskExecTime     = time;          /* Update the task's execution time任务的本次运行时间记录
        在TASK_USER_DATA数据结构中*/
        puser->TaskTotExecTime += time;          /* Update the task's total execution time任务的总的运行时间也记录
        在TASK_USER_DATA数据结构中,这个记录可以用来判断几个任务之间的相对CPU占有率*/
    }
}

/*
*********************************************************************************************************
*                                           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 + -