任务是操作系统处理的首要对象,在多任务运行的环境中,任务的管理需要考虑多方面的因素,最基本的任务管理是任务的创建。

任务创建函数有两种,一种是基本的创建函数OSTaskCreate,另一种是扩展的任务创建函数OSTaskCreateExt。

两个函数都实现了任务的创建,但是OSTaskCreateExt的功能更强,带有很多附加的功能,如果不需要附加功能,OSTaskCreate是完全可以胜任的,没有哪一个更好之说,完全根据需要来选择。



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



#ifOS_TASK_CREATE_EN0INT8U?

OSTaskCreate(void(*task)(void*p_arg),//任务代码的地址



void*p_arg,//任务参数



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



INT8Uprio)//任务的优先级{?

OS_STK?

*psp?

//定义一个指向任务堆栈的指针?

INT8U?

err?

//错误号#ifOS_CRITICAL_METHOD==3?

/*AllocatestorageforCPUstatusregister?

*/?

OS_CPU_SR?

cpu_sr=0;#endif

#ifOS_ARG_CHK_EN0?

//是否进行参数检查?

if(prioOS_LOWEST_PRIO)?

/*?

确保优先级在允许的范围内?

*/?

{?

return(OS_ERR_PRIO_INVALID)?

//无效的优先级?

}#endif



OS_ENTER_CRITICAL()?

//保存全局中断标志,关中断



if(OSIntNesting0)?

/*?

不允许在中断服务子程序中调用任务创建函数,即中断服务子程序不能创建任务?

*/?

{?

OS_EXIT_CRITICAL()?

//恢复全局中断标志?

return(OS_ERR_TASK_CREATE_ISR)?

}



if(OSTCBPrioTbl[prio]==(OS_TCB*)0)?

/*确保此优先级的任务不存在?

*/?

{?

OSTCBPrioTbl[prio]=OS_TCB_RESERVED;/*Reservetheprioritytopreventothersfromdoing?

*/?

/*thesamethinguntiltaskiscreated?

*/?

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)?

//如果多任务已经启动,则执行一次任务调度?

{?

/*Findhighestprioritytaskifmultitaskinghasstarted*/?

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



从前面的代码的基本描述中,可以清晰的了解到任务创建的过程,首先,如果配置了对任务参数进行检查,则价差任务参数的有效性,尤其对任务的优先级进行判断。

当任务的优先级在核实的范围时,还需要判断指定的优先级的任务是否已经被创建,因为优先级必须是唯一的。

然后进行任务堆栈的初始化、任务控制块的初始化、根据系统是否已经启动了多任务,决定是否进行一次任务调度?

授予成功创建个人博客专栏的用户。

专栏中添加五篇以上博文即可点亮!

撰写博客专栏浓缩技术精华,专栏达人就是你!

授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

授予每个自然周发布1篇到3篇原创IT博文的用户。


亚博靠谱么