任务创建函数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
从前面的代码的基本描述中,可以清晰的了解到任务创建的过程,首先,如果配置了对任务参数进行检查,则价差任务参数的有效性,尤其对任务的优先级进行判断。当任务的优先级在核实的范围时,还需要判断指定的优先级的任务是否已经被创建,因为优先级必须是唯一的。然后进行任务堆栈的初始化、任务控制块的初始化、根据系统是否已经启动了多任务,决定是否进行一次任务调度。
任务创建函数OSTaskCreate解析相关推荐
- uC/OS-III任务创建函数OSTaskCreate()
uC/OS-III任务创建函数OSTaskCreate() 欢迎进入linuxweiyh的博客 1.OSTaskCreate()函数原型 void TaskCreate(OS_TCB *p_tcb, ...
- uC/OS任务创建函数OSTaskCreate ()参数详解
要使用 uC/OS 的任务必须先声明任务控制块和创建任务,调用 OSTaskCreate () 函数可以创建一个任务.OSTaskCreate () 函数的信息如下表所示.
- 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )
文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...
- 语言中拟合函数 计算aic_Go语言函数深度解析(中)
上回函数深度解析给大家聊了一些函数的基本知识,不知道还有没有人记得,不记得赶紧回去复习! 他们是 go语言中函数的基本原理 单/多个同/不同类型参数 单/多个同/不同类型返回值 值传递,引用传递 函数 ...
- mysql function怎么创建_mysql,function_mysql创建函数出现问题?,mysql,function - phpStudy
mysql创建函数出现问题? 大家好,帮我看看下面的mysql的函数有什么问题?一直创建不了. DELIMITER $$ DROP FUNCTION IF EXISTS check_if_exists ...
- python创建单例模式_Python单例模式的四种创建方式实例解析
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- (第十四章)创建储存过程与创建函数
函数与存储过程的区别 存储过程:0至N个返回,是适合做批量插入,批量更新 函数:1个返回(不能0个与多个),适合做处理数据后返回一个结果 存储过程调用语法 :call 存储过程名(实参列表); 函数调 ...
- Python文本变量与函数的解析执行,增强自动化测试数据驱动
关注我,每天分享软件测试技术干货.面试经验,想要领取测试资料.进入软件测试学习交流群的可以直接私信我哦~~ 我们在使用Python进行自动化测试或者测试脚本开发时,通常会在代码中融入数据驱动设计,以便 ...
- [机器学习数据挖掘]机器学习实战决策树plotTree函数完全解析
[机器学习&数据挖掘]机器学习实战决策树plotTree函数完全解析 http://www.cnblogs.com/fantasy01/p/4595902.html点击打开链接 import ...
最新文章
- php生成高清缩略图,PHP生成缩略图函数
- python 图片base64 编解码,转换成Opencv,PIL.Image图片格式
- webstorm 设置jsp支持
- Java IDE 的困惑
- 输入网址后,浏览器从访问服务器到呈现网页的过程
- Jmeter系列之接口断言
- 计算机音乐谱大全极乐净土,极乐净土maria曲谱
- PID参数整定方法介绍
- kernel Damon实现
- linux子系统下载错误,Win10系统开启linux子系统报错“0x80070057”怎么办?
- localhost已拒绝连接
- 宋浩概率论与数理统计-第一章-笔记
- 不要轻易在简历上写我热爱编程,我热爱学习—兄弟连IT教育
- Qt:Windows编程—Qt实现注册表启动项管理
- BZOJ 3653: 谈笑风生
- c语言 程序段 数据段,C语言程序的段
- Vue 之 echarts 图表数据可视化的基础使用(简单绘制各种图表、地图)
- 【网络安全】应用实践题(无答案)
- 搭建即可运营的秒收录导航网源码带广告管理完美运营版
- 游戏数据分析用到的模型(二)留存率预估
热门文章
- DM数据库创建JOB的三种方式(一)
- 高配游戏组装电脑配置清单表 2022 游戏组装机电脑配置清单2022
- 对话尼基·帕玛:在Google Brain工作是一种怎样的体验?
- 用树型模型管理App数字和红点提示
- IntelliJ IDEA 常见图标
- fmod()函数、floor()函数、ceil()函数
- 程序员30 岁之后:如何实现质的突破?
- Springboot单元测试 Could not autowire. No beans of XXX 解决方案
- Python内存模型
- 华为q1设置虚拟服务器,华为Q1路由器上网设置方法【图文】