UCOS-II部分函数笔记
2017-08-31 08:46
190 查看
目录
目录OSTaskCreate
OSTaskCreateExt
OSTaskCreate()
OSTaskCreate()建立一个新任务,可以在多任务环境启动之前,或者运行任务中建立任务。注意,ISR中禁止建立任务,一个任务必须为无限循环结构。#if OS_TASK_CREATE_EN > 0 /* 条件编译,是否允许任务的创建 */ INT8U OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *pd为函数的参数 */ void *pdata, /* 建立任务时,传递的参数 */ OS_STK *ptos, /* 指向堆栈任务栈顶的指针 */ INT8U prio) /* 任务优先级 */ { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif OS_STK *psp; INT8U err; #if OS_ARG_CHK_EN > 0 if (prio > OS_LOWEST_PRIO) { /* 参数检查,优先级是否处于允许优先级之内 */ return (OS_PRIO_INVALID); } #endif OS_ENTER_CRITICAL(); /* 关中断 */ if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 判断任务的优先级是否存在,如不存在,设置任 */ OSTCBPrioTbl[prio] = (OS_TCB *)1; /* 务优先级为1设置优先级后,就可以开中断了, */ /* 不用担心冲突,因为该优先级已经被占了 */ OS_EXIT_CRITICAL(); psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); /* 初始化堆栈,此函数与具体的硬件有关,OS_CPU_C.C */ err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 详见此函数的说明 */ if (err == OS_NO_ERR) { OS_ENTER_CRITICAL(); OSTaskCtr++; /* 任务计数器加1,统计运行的任务数 */ OS_EXIT_CRITICAL(); if (OSRunning == TRUE) { /* 如果是在任务运行过程中新建任务,需要进行 */ OS_Sched(); /* 任务调度,保证 优先级最高的任务处于运行态 */ } } else { OS_ENTER_CRITICAL(); OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 如果任务创建失败,优先级设置为0,放弃该 */ /* 任务的优先级保证别的任务创建时可以使用 */ /* 此优先级 */ OS_EXIT_CRITICAL(); } return (err); /* 创建任务失败,返回错误代码 */ } OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); /* 返回OS_PRIO_EXIST,告知任务优先级已经存在 */ } #endif
OSTaskCreateExt()
OSTaskCreateExt()为OSTaskCreate()的扩展函数,允许更多的内容设置。#if OS_TASK_CREATE_EXT_EN > 0 INT8U OSTaskCreateExt (void (*task)(void *pd), /* 条件编译,是否允许任务的创建*/ void *pdata, /* 函数指针,void *pd为函数的参数*/ OS_STK *ptos, /* 建立任务时,传递的参数*/ INT8U prio, /* 指向堆栈任务栈顶的指针*/ INT16U id, /* 任务ID,2.52版本,无实际作用,保留作为扩展用 */ OS_STK *pbos, /* 指向堆栈底部的指针,用于OSTaskStkChk()函数 */ INT32U stk_size, /* 指定任务堆栈的大小,由OS_STK类型决定 */ void *pext, /* 定义数据结构的指针,作为TCB的扩展 */ INT16U opt) /* 存放于任务操作相关的信息,详见uCOS-II.H */ { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif OS_STK *psp; INT8U err; #if OS_ARG_CHK_EN > 0 if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */ return (OS_PRIO_INVALID); } #endif OS_ENTER_CRITICAL(); if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn’t already exist at this priority */ /* Reserve the priority to prevent others from doing … */ /* … the same thing until task is created. */ OSTCBPrioTbl[prio] = (OS_TCB *)1; OS_EXIT_CRITICAL(); if (((opt & OS_TASK_OPT_STK_CHK) != 0×0000) || /* See if stack checking has been enabled */ ((opt & OS_TASK_OPT_STK_CLR) != 0×0000)) { /* See if stack needs to be cleared */ #if OS_STK_GROWTH == 1 (void)memset(pbos, 0, stk_size * sizeof(OS_STK)); #else (void)memset(ptos, 0, stk_size * sizeof(OS_STK)); #endif } psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); /* Initialize the task’s stack */ err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); if (err == OS_NO_ERR) { OS_ENTER_CRITICAL(); OSTaskCtr++; /* Increment the #tasks counter */ OS_EXIT_CRITICAL(); if (OSRunning == TRUE) { /* Find HPT if multitasking has started */ OS_Sched(); } } else { OS_ENTER_CRITICAL(); OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */ OS_EXIT_CRITICAL(); } return (err); } OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); } #endif
相关文章推荐
- UCOS_II学习笔记---任务管理之建立任务函数分析
- UCOS_II学习笔记---任务管理之删除任务函数分析
- UCOS_II学习笔记---任务管理之请求删除任务函数分析
- uCOS-II 学习笔记之事件管理--------信号量管理相关函数的学习
- UCOSII task 任务建立笔记记录
- linux read() 函数读文件时应注意的部分!!!笔记
- ucos-II 任务就绪表学习笔记
- STM32移植uCOS-ii笔记
- Python入门笔记(Python常用函数<部分>及小知识点)
- 【theano-windows】学习笔记五——theano中张量部分函数
- ucos-ii学习笔记——首个多任务程序的创建
- uCOS-II 常用函数参考手册(转)
- uCOS-II 学习笔记--------OSInit函数
- 069 - 问,lua程序设计(第四部分)笔记三,c++调用lua函数 - everettjf - C++博客
- UCOS_II学习笔记---信号量管理之信号量的使用-进程(任务)同步
- iOS开发学习笔记 2-6 C语言部分 函数及变量的作用域
- ucos-ii学习笔记——消息邮箱的原理及使用
- ucos-ii学习笔记——消息队列的原理及使用
- ucos-ii移植之OSStkInit()函数的改写
- uCOS-II中断相关函数介绍