一般说来,任务可在OSStart()启动任务调度之前来创建,也可在任务中创建,但是UC/OS有个规定:在调用OSStart()启动任务调度之前,必须创建了至少一个任务。因此一般习惯上,在OSStart()启动任务调度之前先创建一个任务,并赋予它最高的优先级,从而使它成为起始任务,然后在这个起始任务中再创建其他任务。如果要使用统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用。

注意: 
UC/OS不允许在中断服务程序中创建任务。

下面是创建任务的示意性代码:

/******************主函数*****************/
void main(void)
{
... ...
OSInit(); //对ucos-ii进行初始化
... ...
OSTaskCreate(TaskStart,... ...); //创建起始任务
OSStart(); //开始多任务调度
}
/*****************起始任务***************/
void TaskStart(void *pdata)
{
... ... //在这个位置安装并启动ucos-ii的时钟
OSStatInit(); //初始化统计任务
... ... //在这个位置创建其他任务
for(; ;)
{ /*起始任务TaskStart的代码*/
} }

创建任务函数 
  任务的创建实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。UC/OS提供两个函数创建任务OSTaskCreate()和OSTaskCreateExt()。一般前者用的多,OSTaskCreate()如下所示:

 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
OS_CPU_SR cpu_sr = ;
#endif
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { //检测任务的优先级是否合法
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting > ) { /* Make sure we don't create the task from within an ISR */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_CREATE_ISR);
}
if (OSTCBPrioTbl[prio] == (OS_TCB *)) {//确认优先级未被使用
OSTCBPrioTbl[prio] = (OS_TCB *); //保留优先级 OS_EXIT_CRITICAL();
psp = OSTaskStkInit(task, p_arg, ptos, );//初始化堆栈
err = OS_TCBInit(prio, psp, (OS_STK *), , , (void *), );//初始化任务控制块
if (err == OS_NO_ERR) {
if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */
OS_Sched();//任务调度
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *);//放弃任务
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
#endif

  在“启动任务”中完成与系统硬件有关的各种初始化工作,然后创建各个实质任务和所需要的各种通信工具,至此系统才真正完成准备工作,“启动任务”的使命也就结束了,最
后将自己删除。为了保证“启动任务”能够连续运行,必须将“启动任务”的优先级选择为最高。否则,当“启动任务”创建一个优先级高于自己的任务时,刚刚创建的任务就会立即
进入运行状态,而与这个任务关联的其它任务可能还没有创建,它使用的通信工具也还没有创建,系统必然出错。“启动任务”调用的“自我删除”函数会进行任务调度操作,从而使
系统开始运行各个实质任务

ucos创建任务的一般方法的更多相关文章

  1. Gradle学习系列之二——创建Task的多种方法

    在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...

  2. 六个创建模式之工厂方法模式(Factory Method Pattern)

    问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...

  3. Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    引用自 :http://www.2cto.com/database/201307/224836.html   Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 先假设有这么一个表 ...

  4. Javascript 中创建自定义对象的方法(设计模式)

    Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...

  5. VS2010环境下用ANSI C创建DLL和使用方法(转)

    源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...

  6. Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

    [原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结by edata @2017-5-1objectARX 2015 Wizard安装向导在Wi ...

  7. Windows系统环境下创建mysql主从数据库方法(双向主从复制)

    创建mysql主从数据库方法(双向主从复制) (一)Windows系统下的MySQL主从复制(单向复制) (1)环境说明: 1,Mysql版本:mysql5.7.20(主从机mysql版本必须一致) ...

  8. C#创建自己的扩展方法

    C#可以创建自己的扩展方法Extension Method: 参考这篇<判断是否为空然后赋值>http://www.cnblogs.com/insus/p/8004097.html 里,前 ...

  9. 几种创建XMLHttpRequest对象的方法

    XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head ...

随机推荐

  1. 设置app的状态栏样式

    http://www.jianshu.com/p/9f7f3fa624e7 http://cocoa.venj.me/blog/view-controller-based-status-bar-sty ...

  2. VIM Ctrl-V Conflict with Windows Paste

    /************************************************************************************** * VIM Ctrl-V ...

  3. MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务

    如果您的应用需要通过脚本快速创建一个或多个MySQL数据库,MySQL Database on Azure目前开放了对于PowerShell的支持,可以帮助您快速利用自动化脚本进行数据库服务的创建.管 ...

  4. hibernate中使用fetch来决策性能方案

    什么时候用子查询,或者连接查询 一般多个数据的对应用子查询,单一行的数据用连接 (若要查询每个学生分别学了什么课程 ,若要fetch=join.fetch=select) 则是这种情况 Hiberna ...

  5. oracle interval-partition 解决range分区大难题

    博客<oracle分区>中讲了oracle的几种分区,并且对于oracle的典型分区如Range分区和List分区给了示例. 在实际运用Range分区时,遇到了这样的难题: createt ...

  6. 【原创】搭建Nginx(负载均衡)+Redis(Session共享)+Tomcat集群

    为什么移除首页?哪里不符合要求?倒是回我邮件啊! 一.环境搭建 Linux下Vagrant搭建Tomcat7.Java7 二.Nginx的安装配置与测试 *虚拟机下转至root sudo -i 1)下 ...

  7. Shell教程5-Shell运算符

    Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最 ...

  8. Bootstrap--全局CSS样式之栅格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin 用于生成更具 ...

  9. xampp无法打开phpmyadmin解决方案

    如果设置了apache的端口号(如8890),那么不可以用自带的admin按钮打开,而是要加上端口(如localhost:8890/phpmyadmin/)

  10. php codeigniter (CI) oracle 数据库配置-宋正河整理

    database.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $active_group = 'default'; $active_record ...