任务创建函数OSTaskCreate解析

 

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

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

相关阅读

wait(),waitpid()函数

首先我们来了解一下所谓的僵尸进程,僵尸进程就是两个进程,一个父进程,一个子进程,其子进程终止后,0-3G的用户内存被回收,而3-4G的部分内

C/C++ 学习笔记:istringstream、ostringstream、string

0、C++的输入输出分为三种:(1)基于控制台的I/O(2)基于文件的I/O(3)基于字符串的I/O 1、头文件[cpp] view plaincopyprint? #incl

container of()函数简介

在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(

matlab中contour 函数的用法(绘制等高线)

原文contour矩阵的等高线图全页折叠语法contour(Z)contour(Z,n)contour(Z,v)contour(X,Y,Z)contour(X,Y,Z,n)contour(X,Y,Z,v)con

Python函数学习中return func 和return func() 的区别

最近学习了python中的闭包及装饰器部分,对于内部函数下需要return func 大为不解,非常想知道为啥不是return func()呢?于是我分别定

发表评论