μ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返


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于JavaMail的Java邮件发送:简单邮件发送

    本文链接:http://blog.csdn.net/xietansheng/article/details/51673073电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过Java代码来创建电子邮件,并连接邮件服务器发…

    2022年4月12日
  • c语言编写图书管理系统程序_C语言图书管理系统

    c语言编写图书管理系统程序_C语言图书管理系统DOS界面的图书管理系统,具体内容如下程序分为两块:管理员操作(收录图书、删除图书等)和会员操作(注册、借书、还书等);1、管理员操作界面2、会员操作界面global.h头文件:(程序中只使用了一个编写的头文件,在这里存放了所有的接口函数以及需要使用到的头文件,还有结构体的定义)#include”iostream”#include”string”#include”fstream”#inclu…

    2022年10月11日
  • python字符串删除指定符号(不限位置)「建议收藏」

    python字符串删除指定符号(不限位置)「建议收藏」python中去掉字符串中某些不想要的字符:1、一般的可以用replace()这个函数不限定位置,是可以替换原来不想要的字符,替换成空字符就相当于删除了2、也可以用strip(),删除两边的字符(默认是删除左右空格)rstrip(),lstrip()这两个可以选择只删除左边或者右边3、re.sub这个可以根据正则删除,此处是删除串中的数字1-9,字符a-z,A-Z,还可以加其他的importrestr=”aksj2343ngr4545g黄金叶子fg”temp=re.sub(‘[a

    2022年6月4日
  • Not enough information to list image symbols. Not enough information to list load addresses in …「建议收藏」

    Not enough information to list image symbols. Not enough information to list load addresses in …「建议收藏」linking…..\Objects\BBQ_Wifi.axf:Error:L6218E:UndefinedsymbolClear_Led_Timer(referredfrommain.o)…\Objects\BBQ_Wifi.axf:Error:L6218E:UndefinedsymbolGet_Led_Timer(referredfrommain.o…

    2022年9月17日
  • 【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

    【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)本文提供粒子群算法简介和一个算法举例,提供粒子群算法仿真PID的M文件代码及simulink仿真。另外,本文还提供了一种动态simulink仿真方法,可以让M文件和simulink文件之间互相交换数据,实现仿真与程序的反馈,增加了仿真的灵活度。

    2022年6月10日
  • 汇编指令和机器码的对应表_汇编和机器码对照表

    汇编指令和机器码的对应表_汇编和机器码对照表指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,遵循下列约定:lreg8:8位寄存器。lreg16:16位寄存器。lmem8:8位内存数值。lmem16:16位内存数值。limmed8:8位立即数值。limmed16:16位立即数值。limmed32:32位立即数值。lsegReg:16位段寄存器。机器操作码汇编助记符和操作数00ADDreg8/mem8,reg801ADD

    2022年9月25日

发表回复

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

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