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

📄 test.c

📁 UCOS2.52 代码详细注释
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                           All Rights Reserved
*
*                                               EXAMPLE #2
*********************************************************************************************************
*/

#include "includes.h"

/*
*********************************************************************************************************
*                                              CONSTANTS
*********************************************************************************************************
*/

#define          TASK_STK_SIZE     512                /* Size of each task's stacks (# of WORDs)这里所有任务
堆栈的容量都设置成相同的值,但是UCOS允许为每个任务指定不同的的堆栈 */

#define          TASK_START_ID       0                /* Application tasks IDs 为每个堆栈分配实际存储空间*/
#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                /* Application tasks priorities                  */
#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

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/

OS_STK        TaskStartStk[TASK_STK_SIZE];            /* Startup    task stack                         */
OS_STK        TaskClkStk[TASK_STK_SIZE];              /* Clock      task stack                         */
OS_STK        Task1Stk[TASK_STK_SIZE];                /* Task #1    task stack                         */
OS_STK        Task2Stk[TASK_STK_SIZE];                /* Task #2    task stack                         */
OS_STK        Task3Stk[TASK_STK_SIZE];                /* Task #3    task stack                         */
OS_STK        Task4Stk[TASK_STK_SIZE];                /* Task #4    task stack                         */
OS_STK        Task5Stk[TASK_STK_SIZE];                /* Task #5    task stack                         */

OS_EVENT     *AckMbox;                                /* Message mailboxes for Tasks #4 and #5         */
OS_EVENT     *TxMbox;

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

        void  TaskStart(void *data);                  /* Function prototypes of tasks                  */
static  void  TaskStartCreateTasks(void);
static  void  TaskStartDispInit(void);
static  void  TaskStartDisp(void);
        void  TaskClk(void *data);
        void  Task1(void *data);
        void  Task2(void *data);
        void  Task3(void *data);
        void  Task4(void *data);
        void  Task5(void *data);

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

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


    PC_DispClrScr(DISP_FGND_WHITE);                        /* 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 */

    PC_ElapsedInit();                                      /* Initialized elapsed time measurement;main()函数
    调用PC_ElapsedInit()函数,初始化时间测量功能。这个功能用来计算OSTaskStkChk()函数运行的时间,精确记录PC_Elapsed
    Start()和PC_ElapsedStop()函数的调用时刻。通过计算这两个时刻的差值,可以很容易的得到这两个时刻之间的执行
    代码的运行时间*/

    ptos        = &TaskStartStk[TASK_STK_SIZE - 1];        /* TaskStart() will use Floating-Point*/
    pbos        = &TaskStartStk[0];
    size        = TASK_STK_SIZE;
    OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);            /*这个例子中
    TaskStart()任务调用浮点运算仿真程序库,而不是使用浮点处理器FPU,因为只有在80486和更高级别的计算机中才有这一部分
    。如果系统中没有浮点处理器,Borland的编译器将默认使用其提供的浮点运算仿真程序库。换句话说,如果在一台安装了DOS
    系统的80386EX(没有安装80387浮点处理器)的计算机上运行例二的程序那么浮点运算将由仿真实现。浮点运算程序库的程序都是
    不可重入的,必须找到某些方法,以使更多个任务都能够进行浮点运算。(重入函数:主要用于多任务环境中,一个可重入的函数
    简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回
    控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话
    ,可能会出现问题,这类函数是不能运行在多任务环境下的。)例子中通过对堆栈的修改,满足了浮点运算运算仿真程序库的要求。
    这个修改是通过OSTaskStkInit_FPE_x86()函数来完成的。注意此时报告的任务堆栈容量是624B而不是建立时定义的1024B。这是
    因为函数OSTaskStkInit_FPE_x86()把一部分堆栈保留给浮点运算仿真程序库使用了*/
    OSTaskCreateExt(TaskStart,                             /*这里没有使用OSTaskCreate()函数来建立TaskStart(),而是使用了
    OSTaskCreateExt(

⌨️ 快捷键说明

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