任务是操作系统处理的首要对象,在多任务运行的环境中,任务的管理需要考虑多方面的因素,最基本的任务管理是任务的创建。任务创建函数有两种,一种是基本的创建函数OSTaskCreate,另一种是扩展的任务创建函数OSTaskCreateExt。两个函数都实现了任务的创建,但是OSTaskCreateExt的功能更强,带有很多附加的功能,如果不需要附加功能,OSTaskCreate是完全可以胜任的,没有哪一个更好之说,完全根据需要来选择。

OSTaskCreate实现了最基本的任务创建功能,任务创建之后,就准备好了运行所需要的各种数据结构,函数源码如下:

#if OS_TASK_CREATE_EN > 0
INT8U  OSTaskCreate(void (*task)(void *p_arg),//任务代码的地址

void *p_arg,//任务参数

OS_STK *ptos,//任务堆栈栈顶指针

INT8U prio)//任务的优先级
{
    OS_STK    *psp;     //定义一个指向任务堆栈的指针
    INT8U      err;        //错误号
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif

#if OS_ARG_CHK_EN > 0   //是否进行参数检查
    if(prio > OS_LOWEST_PRIO)  /* 确保优先级在允许的范围内  */
   {           
        return (OS_ERR_PRIO_INVALID);      //无效的优先级
      }
#endif

OS_ENTER_CRITICAL();    //保存全局中断标志,关中断

if(OSIntNesting>0)      /* 不允许在中断服务子程序中调用任务创建函数,即中断服务子程序不能创建任务  */
     {                 
         OS_EXIT_CRITICAL(); //恢复全局中断标志
         return (OS_ERR_TASK_CREATE_ISR);
        }

if(OSTCBPrioTbl[prio]==(OS_TCB *)0)  /*确保此优先级的任务不存在  */
      {
           OSTCBPrioTbl[prio]=OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ...  */
                                              /* ... the same thing until task is created.              */
           OS_EXIT_CRITICAL(); //恢复全局中断标志
           psp = OSTaskStkInit(task,p_arg,ptos,0);              /* 初始化任务的堆栈    */
           err = OS_TCBInit(prio,psp,(OS_STK *)0,0,0,(void *)0,0);//任务控制块的初始化
           if(err == OS_ERR_NONE)
       {
               if(OSRunning==OS_TRUE) //如果多任务已经启动,则执行一次任务调度
        {      /* Find highest priority task if multitasking has started */
                   OS_Sched();
                 }
             }
     else
       {
               OS_ENTER_CRITICAL();  //保存全局中断标志,关中断
               OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 如果因为错误不能创建任务,重新将优先级指针表的对应项清零    */
               OS_EXIT_CRITICAL();   //恢复全局中断标志
             }
           return (err);
          }

OS_EXIT_CRITICAL();   //恢复全局中断标志
    return (OS_ERR_PRIO_EXIST); //返回优先级已经占用的信息
}
#endif

从前面的代码的基本描述中,可以清晰的了解到任务创建的过程,首先,如果配置了对任务参数进行检查,则价差任务参数的有效性,尤其对任务的优先级进行判断。当任务的优先级在核实的范围时,还需要判断指定的优先级的任务是否已经被创建,因为优先级必须是唯一的。然后进行任务堆栈的初始化、任务控制块的初始化、根据系统是否已经启动了多任务,决定是否进行一次任务调度。

任务创建函数OSTaskCreate解析相关推荐

  1. uC/OS-III任务创建函数OSTaskCreate()

    uC/OS-III任务创建函数OSTaskCreate() 欢迎进入linuxweiyh的博客 1.OSTaskCreate()函数原型 void TaskCreate(OS_TCB *p_tcb, ...

  2. uC/OS任务创建函数OSTaskCreate ()参数详解

    要使用 uC/OS 的任务必须先声明任务控制块和创建任务,调用 OSTaskCreate () 函数可以创建一个任务.OSTaskCreate () 函数的信息如下表所示.

  3. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  4. 语言中拟合函数 计算aic_Go语言函数深度解析(中)

    上回函数深度解析给大家聊了一些函数的基本知识,不知道还有没有人记得,不记得赶紧回去复习! 他们是 go语言中函数的基本原理 单/多个同/不同类型参数 单/多个同/不同类型返回值 值传递,引用传递 函数 ...

  5. mysql function怎么创建_mysql,function_mysql创建函数出现问题?,mysql,function - phpStudy

    mysql创建函数出现问题? 大家好,帮我看看下面的mysql的函数有什么问题?一直创建不了. DELIMITER $$ DROP FUNCTION IF EXISTS check_if_exists ...

  6. python创建单例模式_Python单例模式的四种创建方式实例解析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  7. (第十四章)创建储存过程与创建函数

    函数与存储过程的区别 存储过程:0至N个返回,是适合做批量插入,批量更新 函数:1个返回(不能0个与多个),适合做处理数据后返回一个结果 存储过程调用语法 :call 存储过程名(实参列表); 函数调 ...

  8. Python文本变量与函数的解析执行,增强自动化测试数据驱动

    关注我,每天分享软件测试技术干货.面试经验,想要领取测试资料.进入软件测试学习交流群的可以直接私信我哦~~ 我们在使用Python进行自动化测试或者测试脚本开发时,通常会在代码中融入数据驱动设计,以便 ...

  9. [机器学习数据挖掘]机器学习实战决策树plotTree函数完全解析

    [机器学习&数据挖掘]机器学习实战决策树plotTree函数完全解析 http://www.cnblogs.com/fantasy01/p/4595902.html点击打开链接 import ...

最新文章

  1. php生成高清缩略图,PHP生成缩略图函数
  2. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式
  3. webstorm 设置jsp支持
  4. Java IDE 的困惑
  5. 输入网址后,浏览器从访问服务器到呈现网页的过程
  6. Jmeter系列之接口断言
  7. 计算机音乐谱大全极乐净土,极乐净土maria曲谱
  8. PID参数整定方法介绍
  9. kernel Damon实现
  10. linux子系统下载错误,Win10系统开启linux子系统报错“0x80070057”怎么办?
  11. localhost已拒绝连接
  12. 宋浩概率论与数理统计-第一章-笔记
  13. 不要轻易在简历上写我热爱编程,我热爱学习—兄弟连IT教育
  14. Qt:Windows编程—Qt实现注册表启动项管理
  15. BZOJ 3653: 谈笑风生
  16. c语言 程序段 数据段,C语言程序的段
  17. Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)
  18. 【网络安全】应用实践题(无答案)
  19. 搭建即可运营的秒收录导航网源码带广告管理完美运营版
  20. 游戏数据分析用到的模型(二)留存率预估

热门文章

  1. DM数据库创建JOB的三种方式(一)
  2. 高配游戏组装电脑配置清单表 2022 游戏组装机电脑配置清单2022
  3. 对话尼基·帕玛:在Google Brain工作是一种怎样的体验?
  4. 用树型模型管理App数字和红点提示
  5. IntelliJ IDEA 常见图标
  6. fmod()函数、floor()函数、ceil()函数
  7. 程序员30 岁之后:如何实现质的突破?
  8. Springboot单元测试 Could not autowire. No beans of XXX 解决方案
  9. Python内存模型
  10. 华为q1设置虚拟服务器,华为Q1路由器上网设置方法【图文】