μC/OS之OSTaskCreate()[通俗易懂]

μC/OS之OSTaskCreate()[通俗易懂]转自 http://blog.csdn.net/xiaocaichonga/article/details/7449409建立任务OSTaskCreate()1.OSTaskCreate()函数的声明  INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)   1.1返

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

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

转自 http://blog.csdn.net/xiaocaichonga/article/details/7449409

建立任务OSTaskCreate()
1.OSTaskCreate()函数的声明
    INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK *ptos,INT8U prio)
     1.1返回类型 INT8U
     1.2参数:4个参数,分别是指向任务代码段的函数指针task,指向任务数据的指针pdata,指向任务所分配的堆栈的栈顶指针ptos,以及任务的优先级prio
2.OSTaskCreate()函数的定义
     INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK *ptos,INT8U prio)
     {

         void *psp;                             /*用于指向任务堆栈初始化后栈顶的指针*/
         INT8U err;                             /*用于存放任务TCB初始化后返回的值*/
 
         if(prio>OS_LOWEST_PRIO)                /*判断任务的优先级是否在允许的范围内,即如果该任务的优先级比系统的空闲优先级*/
         {                                       /*都低的话,那么就出错了*/
             return (OS_PRIO_INVALID)            /*返回优先级不可得*/
         }
         OS_ENTER_CRITICAL();
         if (OSTCBPrioTbl[prio]==(OS_TCB *)0)   /*判断所分配的优先级是否已经被其他任务占用,(OS_TCB)*0 表示没有占用*/
         {

             OSTCBPrioTbl[prio]=(OS_TCB *)1;    /*将新分配的优先级在OSTCBPrioTbl[]中更改为已占用状态即(OS_TCB)*1,注意:
             OS_EXIT_CRITICAL();                /*在(OS_TCB)*1状态下表示仅仅被占用,但是并没有为任务分配资源等操作*/
             psp=(void *)OSTaskStkInit(task,pdata,ptos,0);/*将任务堆栈进行初始化,并返回初始化后的栈顶指针给psp*/  
                                                          /*注意任务堆栈的初始化函数的参数:①代码段指针②数据段指针③堆栈的栈顶*/
             err=OSTCBInit(prio,psp,(void *)0,0,0,(void*0),0);/*TCB的初始化,注意传入的参数:①任务的优先级即任务的标识符②堆栈初始化后的栈顶指针*/
             if(err==OS_NO_ERR)                              /*如果TCB初始化成功*/
             {

                OS_ENTER_CRITICAL();
                OSTaskCtr++;                                 /*则将系统中的进程数加1*/
                OSTaskCreateHook(OSTCBPrioTbl[prio]);        /*新建任务的扩展功能,可以由用户自行定义,但是代码不能太长,因为此时中断关闭*/
                OS_EXIT_CRITICAL();
                if(OSRunning)                               /*判断任务建立时,系统中是否有其他任务在运行,即系统是否已经OSStart()了*/
                   {

                      OSSched();                           /*如果系统中已经有其他任务运行,则用任务调度函数OSSched()进行任务调度*/
                   }
              }
              else
              {

                 OS_ENTER_CRITICAL();
                 OSTCBPrioTble[prio]=(OS_TCB *)0;          /*如果TCB初始化失败,则将本来占用的OSTCBPrioTble[]中对应的位标识为此优先级未被使用*/
                 OS_EXIT_CRITICAL();
              }
              return (err);                                /*在判断优先级在于规定范围内的情况下,无论TCB初始化是成功还是失败,都将返回TCB初始化的值*/
           }
           else
           {

               OS_EXIT_CRITICAL();
               return (OS_PRIO_EXIST);                    /*如果此优先级已经被占用,则返回OS_PRIO_EXIST,以告诉系统和用户优先级已被占用*/
            }
      }
    
    
3.小结
任务的建立函数OSTaskCreate()到底做了哪些事情呢?    
①判断任务的优先级;
②系统的OSTCBPrioTbl[];
③任务堆栈的初始化;
④任务TCB的初始化。    

执行过程:第一步,判断任务的优先级是否越界,如果越界则返回失败,如果没越界进行下一步;
          第二步,判断任务的优先级是否已经被占用,如果被占用则返回失败,如果没有被占用进行下一步;
          第三步,对OSTCBPrioTbl[]相应位置1,表明此优先级被使用了;
          第四步,任务堆栈的初始化;
          第五步,任务TCB的初始化,无论初始化失败还是成功,都将TCB初始化的返回值返回给OSTaskCreate();
          第六步,如果TCB初始化失败了,则将OSTCBPrioTbl[]中的相应位再清0,以表明此优先级没被使用;如果TCB初始化成功了
                  则将系统中的任务数加1,并进行下一步;
          第七步,盘对系统是否已经处于运行状态,如果处于运行状态则进行任务调度。

注意:1.OSTaskCreate()的四个参数分别做了什么:
      ①task,pdata和ptos用于了任务堆栈的初始化,即要对任务的代码指针,数据指针,根据当前分配的栈顶继续压栈
      ②prio用于了PCB的初始化。
      2.对于OSTCBPrioTbl[]的理解,该表中的元素是指向TCB的指针,当该指针为(OS_TCB *)0时标明该位对应的优先级并未被使用,
      该为不为(OS_TCB *)0时,标明该位对应的优先级被使用,至于使用的情况还要分为两种:
      ①(OS_TCB *)1时,标明该优先级被占用但是并没说明该优先级对应哪个TCB;
      ②指名该优先级被占用并且指向对应的TCB,这部分在TCB的初始化中完成了。
            

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

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

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


相关推荐

  • zencart模板,外贸鞋子模板

    zencart模板,外贸鞋子模板演示地址:http://www.zentem.com/shoes1

    2022年7月27日
    3
  • java8 list转换对象_Java8将List对象转换Map「建议收藏」

    java8 list转换对象_Java8将List对象转换Map「建议收藏」基于Java8的函数式编程概念,去实现List转换MappublicclassDemoMian2{publicstaticvoidmain(String[]args){ListusersList=newArrayList();Usersusers=newUsers();users.setId(1L);users.setName(“张三”);users.setSex(…

    2022年5月16日
    300
  • 推荐一款神仙颜值的 Redis 客户端工具

    推荐一款神仙颜值的 Redis 客户端工具日常开发过程中,项目常常都会使用Redis来做缓存或者Session服务器,为了更直观方便,开发者常常会使用一些可视化工具,如RedisDesktopManager、RedisClent等,但界面UI做得不尽人意,作为当今时代,对软件的UI还是有所期待的,今天给大家分享一款,高颜值、功能强大的Redis客户端工具。AnotherRedisDesktopMan…

    2022年9月15日
    4
  • iocomp入门教程(绘制Plot)[通俗易懂]

    iocomp入门教程(绘制Plot)[通俗易懂]最近要做一个项目需要绘制曲线,为了节省时间,就选用了iocomp控件,可网上相关的教程极少,官方给的文档还是比较详尽,但缺少具体的前期准备步骤,在初次接触这个控件很容易蒙,所以我写下这篇,给入门者以便利。用到的材料:iocomp激活成功教程版(目前常见的为V3和V4,两个版本按喜好选择吧~…

    2022年7月25日
    24
  • 小米6最好用的系统版本[通俗易懂]

    小米6最好用的系统版本[通俗易懂]小米6最好用的系统版本小米6最好用的系统稳定版10.4.3首先说一下为什么这个版本的系统我认为最好用,因为自己是米粉,也比较喜欢用最新的系统,去年用小米6收到了10.4.2版本的系统更新,体验之后感觉真的很nice,安卓9流畅度提升非常高,包括软件的启动速度,各项反应,但是有一些小瑕疵,比如断流,软件闪退,系统掉帧,然后过了一段时间小米推送了10.4.3稳定版,修复了这三个问题,体验至今为止,没有其他任何问题该版本优点总结如下第一,该版本基于miui10,系统简单易用,基本上算是miui的一个小成的

    2022年6月27日
    108
  • 服务器系统防盗,Windows系统中IIS防盗链设置详细介绍Windows服务器操作系统 -电脑资料…

    服务器系统防盗,Windows系统中IIS防盗链设置详细介绍Windows服务器操作系统 -电脑资料…在Windows系统中IIS防盗链设置需一个ISAPI_Rewrite组件,然后我们把ISAPI_Rewrite加载到iis中,再就可以在iis中的httpd.ini中写防盗链功能了,下面我来给各位同学介绍,首页我们安装一个组件:isapi.msi安装完后,对软件安装目录的IIS_WGP组的读写权限(重要,如果不设置安装完后你的网站就会直接ServiceUnavailable,无法访问)。假如你…

    2022年7月23日
    11

发表回复

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

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