前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用OSTaskCreate()建立一个任务后,该任务处于( )_worksheetfunction函数用法

使用OSTaskCreate()建立一个任务后,该任务处于( )_worksheetfunction函数用法

作者头像
全栈程序员站长
发布2022-10-04 13:04:47
2870
发布2022-10-04 13:04:47
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月6日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档