uCOS OSTaskCreate()函数分析[通俗易懂]

uCOS OSTaskCreate()函数分析[通俗易懂]INT8U OSTaskCreate(void(*task)(void*pd), void*p_arg,OS_STK*ptos,INT8Uprio);函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

INT8U  OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio)

;函数返回一个8位的整型数,调用该函数需要四个参数。第一个参数一个指针,也就是用户代码的首地址,在平时使用中我们把自己创建的任务的名字作为这个参数就可以了;第三个参数是指向任务堆栈栈顶的指针,通常我们把创建的任务的堆栈数组的首地址给第三个参数就可以了;第四个参数是任务的优先级;第二个参数是什么意思?还不太理解。

    OS_STK    *psp;
    INT8U      err;                                ;创建一个指向数据类型为OS_STK的指针和一个8位的整型数

#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  */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing …  */
                                             /* … the same thing until task is created.              */
        OS_EXIT_CRITICAL();                      ;判断该优先级是否被占用

;优先级未被占用,执行以下程序
        psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0);     ;初始化堆栈
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);   ;初始化任务控制块
        if (err == OS_NO_ERR) {

            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                        /* Increment the #tasks counter        */
            OS_EXIT_CRITICAL();
            if (OSRunning == TRUE) {         /* Find highest priority task if multitasking has started */
                OS_Sched();                          ;此时OSRunning 等于假,也就是在创建任务的时候并不能引发任务调度仅                                                             ;仅是创建任务而已。
            }
        } else {                                         ;该优先级已经被占用,则只把该任务优先级释放掉
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
            OS_EXIT_CRITICAL();
        }
        return (err);

    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
}
综上所述,创建任务时的主要工作是:第一,判断该优先级是否有效;第二判断该优先级是否被占用,若被占用则释放掉该优先级并返回OS_PRIO_EXIST;第三,若优先级未被占用,就初始化任务堆栈和任务控制块,初始化任务控制块返回正确信息时,将 OSTaskCtr加1;第四,判断OSRunning,为真就引发一次任务调度,为假则程序结束。

似乎在创建任务的时候OSRunning值为假,所以创建任务的时候,不会引发一次任务调度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号