zoukankan      html  css  js  c++  java
  • uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()
        OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务。注意,ISR中禁止建立任务,一个任务必须为无限循环结构。   
        源码例如以下:

    #if OS_TASK_CREATE_EN > 0                    /* 条件编译,是否同意任务的创建               */
    INT8U  OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *pd为函数的參数             */
                         void *pdata,            /* 建立任务时,传递的參数                     */
                         OS_STK *ptos,           /* 指向堆栈任务栈顶的指针                     */
                         INT8U prio)             /* 任务优先级                                 */
    {
    #if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register   */
        OS_CPU_SR  cpu_sr;
    #endif
        OS_STK    *psp;
        INT8U      err;

    #if OS_ARG_CHK_EN > 0
        if (prio > OS_LOWEST_PRIO) {             /* 參数检查,优先级是否处于同意优先级之内     */
            return (OS_PRIO_INVALID);
        }
    #endif
        OS_ENTER_CRITICAL();                     /* 关中断                                     */
        if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 推断任务的优先级是否存在,如不存在,设置任 */
            OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* 务优先级为1设置优先级后,就能够开中断了,  */
                                                 /* 不用操心冲突,由于该优先级已经被占了       */
            OS_EXIT_CRITICAL();
            psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);   
                                        /* 初始化堆栈,此函数与详细的硬件有关,OS_CPU_C.C      */
            err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 详见此函数的说明  */
            if (err == OS_NO_ERR) {
                OS_ENTER_CRITICAL();
                OSTaskCtr++;                     /* 任务计数器加1,统计执行的任务数            */
                OS_EXIT_CRITICAL();
                if (OSRunning == TRUE) {         /* 假设是在任务执行过程中新建任务,须要进行   */
                    OS_Sched();                  /* 任务调度,保证 优先级最高的任务处于执行态  */
                }
            } else {
                OS_ENTER_CRITICAL();
                OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 假设任务创建失败,优先级设置为0,放弃该    */
                                                 /* 任务的优先级保证别的任务创建时能够使用     */
                                                 /* 此优先级                                   */
                OS_EXIT_CRITICAL();
            }
            return (err);                        /* 创建任务失败,返回错误代码                 */
        }
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);                  /* 返回OS_PRIO_EXIST,告知任务优先级已经存在  */
    }
    #endif

    2. OSTaskCreateExt()
        OSTaskCreateExt()为OSTaskCreate()的扩展函数,同意很多其它的内容设置。
        源码例如以下:

    #if OS_TASK_CREATE_EXT_EN > 0
    INT8U  OSTaskCreateExt (void   (*task)(void *pd), /* 同上                                    */
                            void    *pdata,    /* 同上                                           */
                            OS_STK  *ptos,     /* 同上                                           */
                            INT8U    prio,     /* 同上                                           */
                            INT16U   id,       /* 任务ID,2.52版本号,无实际作用,保留作为扩展用   */
                            OS_STK  *pbos,     /* 指向堆栈底部的指针,用于OSTaskStkChk()函数     */
                            INT32U   stk_size, /* 指定任务堆栈的大小,由OS_STK类型决定           */
                            void    *pext,     /* 定义数据结构的指针,作为TCB的扩展              */
                            INT16U   opt)      /* 存放于任务操作相关的信息,详见uCOS-II.H        */
    {
    #if OS_CRITICAL_METHOD == 3                /* Allocate storage for CPU status register       */
        OS_CPU_SR  cpu_sr;
    #endif
        OS_STK    *psp;
        INT8U      err;

    #if OS_ARG_CHK_EN > 0
        if (prio > OS_LOWEST_PRIO) {           /* Make sure priority is within allowable range   */
            return (OS_PRIO_INVALID);
        }
    #endif
        OS_ENTER_CRITICAL();
        if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
           /* Make sure task doesn’t already exist at this priority  */

           /* Reserve the priority to prevent others from doing …  */
           /* … the same thing until task is created.              */

            OSTCBPrioTbl[prio] = (OS_TCB *)1;                OS_EXIT_CRITICAL();

            if (((opt & OS_TASK_OPT_STK_CHK) != 0×0000) ||  
               /* See if stack checking has been enabled     */
                ((opt & OS_TASK_OPT_STK_CLR) != 0×0000)) {  
               /* See if stack needs to be cleared           */
                #if OS_STK_GROWTH == 1
                (void)memset(pbos, 0, stk_size * sizeof(OS_STK));
                #else
                (void)memset(ptos, 0, stk_size * sizeof(OS_STK));
                #endif
            }

            psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt);
                                              /* Initialize the task’s stack                   */
            err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
            if (err == OS_NO_ERR) {
                OS_ENTER_CRITICAL();
                OSTaskCtr++;                  /* Increment the #tasks counter                  */
                OS_EXIT_CRITICAL();
                if (OSRunning == TRUE) {      /* Find HPT if multitasking has started          */
                    OS_Sched();
                }
            } else {
                OS_ENTER_CRITICAL();
                OSTCBPrioTbl[prio] = (OS_TCB *)0;      /* Make this priority avail. to others  */
                OS_EXIT_CRITICAL();
            }
            return (err);
        }
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    }
    #endif

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4203291.html
Copyright © 2011-2022 走看看