UCOSIIIAPI函数接口OSTaskCreate();函数
任务的创建和删除实验
uCOSIII是多任务系统,那么肯定要创建任务,创建任务就是将任务控制块、任务堆栈、任务代码等联系在一起,并且初始化任务控制块的相应字段。在UCOSIII中我们通过函数OSTaskCreate ();来创建任务,OSTaskCreate();函数原型如下(在os_task.c中有定义)。电泳OSTaskCreate ();创建一个任务之后,刚创建的任务就会进入就绪状态,注意!不能够在中断服务程序中调用OSTaskCreate ();函数创建任务。
void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void *p_ext,OS_OPT opt,OS_ERR *p_err)
{CPU_STK_SIZE i;
#if OS_CFG_TASK_REG_TBL_SIZE > 0uOS_REG_ID reg_nbr;
#endif
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)OS_TLS_ID id;
#endifCPU_STK *p_sp;CPU_STK *p_stk_limit;CPU_SR_ALLOC();#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;}
#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == DEF_TRUE) {*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;return;}
#endif#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0uif (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ---------- CANNOT CREATE A TASK FROM AN ISR ---------- */*p_err = OS_ERR_TASK_CREATE_ISR;return;}
#endif#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */if (p_tcb == (OS_TCB *)0) { /* User must supply a valid OS_TCB */*p_err = OS_ERR_TCB_INVALID;return;}if (p_task == (OS_TASK_PTR)0) { /* User must supply a valid task */*p_err = OS_ERR_TASK_INVALID;return;}if (p_stk_base == (CPU_STK *)0) { /* User must supply a valid stack base address */*p_err = OS_ERR_STK_INVALID;return;}if (stk_size < OSCfg_StkSizeMin) { /* User must supply a valid minimum stack size */*p_err = OS_ERR_STK_SIZE_INVALID;return;}if (stk_limit >= stk_size) { /* User must supply a valid stack limit */*p_err = OS_ERR_STK_LIMIT_INVALID;return;}if (prio >= OS_CFG_PRIO_MAX) { /* Priority must be within 0 and OS_CFG_PRIO_MAX-1 */*p_err = OS_ERR_PRIO_INVALID;return;}
#endif#if OS_CFG_ISR_POST_DEFERRED_EN > 0uif (prio == (OS_PRIO)0) {if (p_tcb != &OSIntQTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use priority 0 */return;}}
#endifif (prio == (OS_CFG_PRIO_MAX - 1u)) {if (p_tcb != &OSIdleTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use same priority as idle task */return;}}OS_TaskInitTCB(p_tcb); /* Initialize the TCB to default values */*p_err = OS_ERR_NONE;/* --------------- CLEAR THE TASK'S STACK --------------- */if ((opt & OS_OPT_TASK_STK_CHK) != (OS_OPT)0) { /* See if stack checking has been enabled */if ((opt & OS_OPT_TASK_STK_CLR) != (OS_OPT)0) { /* See if stack needs to be cleared */p_sp = p_stk_base;for (i = 0u; i < stk_size; i++) { /* Stack grows from HIGH to LOW memory */*p_sp = (CPU_STK)0; /* Clear from bottom of stack and up! */p_sp++;}}}/* ------- INITIALIZE THE STACK FRAME OF THE TASK ------- */
#if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)p_stk_limit = p_stk_base + stk_limit;
#elsep_stk_limit = p_stk_base + (stk_size - 1u) - stk_limit;
#endifp_sp = OSTaskStkInit(p_task,p_arg,p_stk_base,p_stk_limit,stk_size,opt);/* -------------- INITIALIZE THE TCB FIELDS ------------- */p_tcb->TaskEntryAddr = p_task; /* Save task entry point address */p_tcb->TaskEntryArg = p_arg; /* Save task entry argument */p_tcb->NamePtr = p_name; /* Save task name */p_tcb->Prio = prio; /* Save the task's priority */p_tcb->StkPtr = p_sp; /* Save the new top-of-stack pointer */p_tcb->StkLimitPtr = p_stk_limit; /* Save the stack limit pointer */p_tcb->TimeQuanta = time_quanta; /* Save the #ticks for time slice (0 means not sliced) */
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0uif (time_quanta == (OS_TICK)0) {p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;} else {p_tcb->TimeQuantaCtr = time_quanta;}
#endifp_tcb->ExtPtr = p_ext; /* Save pointer to TCB extension */p_tcb->StkBasePtr = p_stk_base; /* Save pointer to the base address of the stack */p_tcb->StkSize = stk_size; /* Save the stack size (in number of CPU_STK elements) */p_tcb->Opt = opt; /* Save task options */#if OS_CFG_TASK_REG_TBL_SIZE > 0ufor (reg_nbr = 0u; reg_nbr < OS_CFG_TASK_REG_TBL_SIZE; reg_nbr++) {p_tcb->RegTbl[reg_nbr] = (OS_REG)0;}
#endif#if OS_CFG_TASK_Q_EN > 0uOS_MsgQInit(&p_tcb->MsgQ, /* Initialize the task's message queue */q_size);
#else(void)&q_size;
#endifOSTaskCreateHook(p_tcb); /* Call user defined hook */#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)for (id = 0u; id < OS_CFG_TLS_TBL_SIZE; id++) {p_tcb->TLS_Tbl[id] = (OS_TLS)0;}OS_TLS_TaskCreate(p_tcb); /* Call TLS hook */
#endif/* --------------- ADD TASK TO READY LIST --------------- */OS_CRITICAL_ENTER();OS_PrioInsert(p_tcb->Prio);OS_RdyListInsertTail(p_tcb);#if OS_CFG_DBG_EN > 0uOS_TaskDbgListAdd(p_tcb);
#endifOSTaskQty++; /* Increment the #tasks counter */if (OSRunning != OS_STATE_OS_RUNNING) { /* Return if multitasking has not started */OS_CRITICAL_EXIT();return;}OS_CRITICAL_EXIT_NO_SCHED();OSSched();
}
**void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void *p_ext,OS_OPT opt,OS_ERR *p_err)**
*p_tcb 指向任务的控制块OS_TCB
*p_name 指向任务的名字,我们可以为每一个任务取一个名字
p_task 执行任务代码,也就是任务函数的名字
*p_arg 传递给任务的参数
prio 任务优先级,数值越低优先级越高,用户不能够使用系统任务使用的那些优先级!
*p_stk_base 指向任务堆栈的基地址
stk_limit 任务堆栈深度,用来检测和确保堆栈不溢出
stk_size 任务堆栈大小
q_size COSIII中每个任务都有一个可选的内部消息队列,我们要定义OS_CFG_TASK_Q_EN>0,这时才能使用这个内部 消息队列
time_quanta 在使能时间片轮转调用时用来设置时间片长度,默认节拍为时钟节拍除以10.
*p_ext 指向用户补充的存储区。
opt 包含任务的特定选项,有如下选项可以设置。
OS_OPT_TASK_NONE 表示没有任何选项
OS_OPT_TASK_STK_CHK 指定是否允许检测该任务的堆栈
OS_OPT_TASK_STK_CLR 指定是否清除该任务的堆栈
OS_OPT_TASK_SAVE_FP 指定是否存浮点寄存器,CPU需要浮点运算硬件并且有专用代码保护浮点 寄存器
*p_err 用来保存调用该函数后返回的错误代码。
UCOSIIIAPI函数接口OSTaskCreate();函数相关推荐
- lambda表达式函数接口_函数Lambda表达式中UnaryOperator的示例
lambda表达式函数接口 Java 8 Lambda表达式的实现需要介绍一些具有深奥名称的新接口,这些接口可能会对没有任何函数式编程经验的开发人员造成一定的威胁. 功能性UnaryOperator接 ...
- 【C 语言】文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )
文章目录 一.函数接口形参 二.读取配置文件的逐行遍历操作 1.读取配置文件的逐行遍历操作 2.读取一行数据 3.查找字符 4.删除字符串前后的空格 5.完整代码示例 一.函数接口形参 函数作用 : ...
- JDK 8 新特性 之 函数接口
函数接口 定义:接口中只有唯一的一个抽象方法,该接口就称之为函数接口. //函数接口 public interface FunctionInterface1 {//1.只有一个方法的接口,默认称之为函 ...
- 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
本文经授权转载自微信公众号:未读代码 Java 8 早已经在2014 年 3月 18日发布,毫无疑问 Java 8 对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言.库.工具.JVM ...
- 信号量PV操作以及函数接口讲解
systemV消息队列-不用详细了解 创建消息队列msgget函数,删除msgctl函数,发消息msgsnd,收消息msgrcv 信号量Semaphore 了解5个概念 信号量本质上是一个计数器,用来 ...
- linux操作系统信号捕捉函数之回调函数小结
(1)signal 信号捕捉函数:注册一个信号捕捉函数(不参与捕捉,那是内核的事情) 函数实现: typedef void(*sighandler_t)(int); //声明了一个函数指针(代 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...
- 【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )
文章目录 前言 一.业务子函数接口定义要点 二.完整代码示例 前言 字符串开发模型 : strstr-while/do-while 模型 : 在 字符串 中 查找 子串特征 ; 两头堵模型 : 两个指 ...
- 把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递...
把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递 转载于:https://www.cnblogs.com/xiaodangshan/p/9784315.html
最新文章
- 【HDU】1251统计难题 (字典树:二维数组,结构体数组,链表,map)
- java源码 - ReentrantReadWriteLock介绍
- php chr() ord()中文截取乱码问题解决方法
- hdu 5783——Divide the Sequence
- 报复性充值?《和平精英》iOS版上线三天 收入近1亿元
- JPA之@GeneratedValue注解
- selenium 验证元素是否存在_使用selenium判断标签的元素值是否存在
- wps 打开xml格式乱码_WPS文件打开之后是乱码
- Apple Pay 详解
- 十大免费PHP编辑器-开发工具
- 如何选择适合你的兴趣爱好(二十八),小提琴
- jlh吃水果(C++)
- Git下载安装及使用说明
- 农村科学实验杂志农村科学实验杂志社农村科学实验编辑部2022年第12期目录
- 深圳市海平线科技有限公司
- 淘宝京东拼多多优惠券,买东西省钱的秘密
- 夏季忌发怒 适当午休抗疲劳
- 【mpvue】小程序开发入门
- vscode无法打开源文件的问题
- Android异形屏适配(官方方案)