一般说来,任务可在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. 深入理解OpenERP的工作流(Workflow)

    一.工作流定义: <?xml version="1.0"?>  <terp><data>    <record model="w ...

  2. hadoop数据容易出现错误的地方

    最近在搞关于数据分析的项目,做了一点总结. 下图是系统的数据流向.容易出现错误的地方.1.数据进入hadoop仓库有四种来源,这四种是最基本的数据,简称ods,original data source ...

  3. web.xml中load-on-startup的作用(转)

    web.xml中load-on-startup的作用 如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker< ...

  4. mysql script for dynamic running sql script

    ),startTime datetime,endTime datetime) BEGIN set @s1 = concat('SELECT * FROM ', deviceName , ' where ...

  5. win32 API 学习

    SendMessage 函数原型 LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) 详情:百度百科     msd ...

  6. equal 和 ==

    刚才看了一下别人的博客,想加深一下对 equal 和 == 的了解. 总结了几点: 1.equal 每个类都有必要覆盖一下,对于String 类,已经覆盖,比较的是String对象的字符序列是否相等. ...

  7. exp/imp使用

    [sql]view plaincopy 1.EXP: 1.完全: EXP  SYSTEM/MANAGER   BUFFER=64000  FILE=C:\FULL.DMP  FULL=Y 如果要执行完 ...

  8. JBPM4之decision节点:1、好学生 | 坏学生

    JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...

  9. [转]vi与vim的区别

    一直用着vi,有朋友劝我用vim,那么它们有什么区别呢? 简单点来说,它们都是多模式编辑器, 不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令, 而且还有一些新的特性在里面. vim的这些优 ...

  10. android定时三种方式

    一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方 ...