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

uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()的更多相关文章

  1. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  2. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  3. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  4. uC/OS-II 一些函数简介

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 以前搞硬件的经验,最近突然翻出来了.分享给大家:主要讲解uC/OS-II常用函数:虽说现在转行软件了,但是感觉之前搞硬件的经验还真是很有用对于理解 ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  7. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  8. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

  9. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

随机推荐

  1. ajenti试用感受

    ajenti试用感受_展现技术动态_百度空间 ajenti试用感受   今天看开源中国介绍一款名为"服务器管理系统"的开源软件发布了,名为ajenti,页面感觉不错,对机器的采集信 ...

  2. CF 191 div2

    A.数据量很小,直接爆搞. #include <iostream> #include <cstdio> #include <algorithm> #include ...

  3. 【Android病毒分析报告】 - ZxtdPay 吸费恶魔

    本文章由Jack_Jia编写,转载请注明出处.  文章链接:http://blog.csdn.net/jiazhijun/article/details/11581543 作者:Jack_Jia    ...

  4. 关于js闭包是否真的会造成内存泄漏(转载)

    闭包是一个非常强大的特性,但人们对其也有诸多无解.一种危言耸听的说法是闭包会造成内存泄露. 局部变量本来应该在函数退出的时候被解除引用,但如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直 ...

  5. IOS中的自动布局

    Autolayout是一种“自动布局”技术,专门用来布局UI界面 Autolayout能很轻松地解决屏幕适配问题 Autolayout的两条核心概念:   >1 参照:通过参照其他控件或父控件来 ...

  6. Java之JDOM生成XML和解析

    一.生成XML文件 1.JDOM是对Java原始的类进行了封装.让解析XML文件变得很方便 2.创建一个XML文件的根节点: Element root = new Element("HD&q ...

  7. Java学习03

    Java学习03 1.java面试一些问题 一.什么是变量 变量是指在程序执行期间可变的数据.类中的变量是用来表示累的属性的,在编程过程中,可以对变量的值进行修改.变量通常是可变的,即值是变化的 二. ...

  8. Judge loop in directed graph

    1 深度优先方法 首先需要更改矩阵初始化函数init_graph() 然后我们需要初始化vist标记数组 深度优先访问图,然后根据是否存在back edge判断是否存在环路 算法如下: #includ ...

  9. 转:用JS判断IE浏览器的版本(-- 很巧妙实用的方法)

    ~~在看到这篇文章之前如果让我来判断IE的版本,那么我基本上会用 navigator.userAgent去做字符串检索,现在觉得特性检测的确比较靠谱一点 今天一个项目中需要判断IE版本号,又因为 jQ ...

  10. Qt configure 参数不完全说明

    只需要加个 -fast参数就ok了.其他参数视自己情况而定,比如你不需要qt3支持可以添加-no-qt3support,或者不需要webkit插件 -no-webkit配置参数选项: 前面是*号的表示 ...