当前位置:首页 > IT技术

任务创建函数OSTaskCreate解析

时间:2019-06-01 00:42:05来源:IT技术作者:SEO探针小编阅读:99次「手机版」
 

ostaskcreate

任务是操作系统处理的首要对象,在多任务运行的环境中,任务的管理需要考虑多方面的因素,最基本的任务管理是任务的创建。任务创建函数有两种,一种是基本的创建函数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

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

相关阅读

C语言:lseek函数-----改变文件偏移量

1.文件偏移 通常调用read或write每读写一个文件,就会改变文件的读写位置。在linux中同样可以使用lseek函数来修改文件偏移量,即读

oracle中的greatest 函数和 least函数

greatest (max(one),max(two),max(three))求多列的最大值,oracle中的greatest 函数 已知表TB的数据如下 SQL> select * from tb; 

Python product函数介绍

Python product函数介绍 ​ product(A,B)函数,返回A和B中的元素组成的笛卡尔积的元组,具体见如下代码:import itertools for item

关于java中Pattern.compile函数的相关解释

Pattern.compile函数:Pattern Pattern.compile(String regex, int flag)flag的取值范围如下:Pattern.CANON_EQ,当且仅当两个字符的"

析构函数

析构函数:在类中声明的一种成员函数①析构函数与类名同名②析构函数无参(不可重载)③表示: ~类名() { 析构函数体; }

分享到:

栏目导航

推荐阅读

热门阅读