ucos创建任务的一般方法

  一般说来,任务可在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()如下所示:

 1 INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
 2 {
 3     OS_STK    *psp;
 4     INT8U      err;
 5 #if OS_CRITICAL_METHOD == 3
 6     OS_CPU_SR  cpu_sr = 0;
 7 #endif
 8 #if OS_ARG_CHK_EN > 0
 9     if (prio > OS_LOWEST_PRIO) { //检测任务的优先级是否合法
10         return (OS_PRIO_INVALID);
11     }
12 #endif
13     OS_ENTER_CRITICAL();
14     if (OSIntNesting > 0) {   /* Make sure we don‘t create the task from within an ISR  */
15         OS_EXIT_CRITICAL();
16         return (OS_ERR_TASK_CREATE_ISR);
17     }
18     if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {//确认优先级未被使用
19         OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留优先级
20
21         OS_EXIT_CRITICAL();
22         psp = OSTaskStkInit(task, p_arg, ptos, 0);//初始化堆栈
23         err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);//初始化任务控制块
24         if (err == OS_NO_ERR) {
25             if (OSRunning == OS_TRUE) {      /* Find highest priority task if multitasking has started */
26                 OS_Sched();//任务调度
27             }
28         } else {
29             OS_ENTER_CRITICAL();
30             OSTCBPrioTbl[prio] = (OS_TCB *)0;//放弃任务
31             OS_EXIT_CRITICAL();
32         }
33         return (err);
34     }
35     OS_EXIT_CRITICAL();
36     return (OS_PRIO_EXIST);
37 }
38 #endif
时间: 2024-10-10 13:12:17

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

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

Android编程动态创建视图View的方法

在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layoutResID),指定layout中的一个XML的ID即可,这种方法简单.另一个方法是 setContentView(android.view.View),参数是指定一个视图View对象,这种方法可以使用自定义的视图类. 在一些场合中,需要对View进行一些定制处理,比如获取到Canvas进行图像绘制,

三种创建XMLHttpRequest对象的方法

XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples&

Floodlight 中创建消息对象的方法

在 floodlight 中创建各种openflow message 和 action 等采用的是简单工厂方式,BasicFactory类(实现OFMessageFactory接口,)会根据消息的类型创建不同的对象,达到更好的封装效果:此外这里调用的是枚举类型的方法.下面是具体代码: ----------工厂接口,还有OFActionFactory,约束需要具体工厂完成的事情 public interface OFMessageFactory { // 根据消息类型得到具体的实例 public 

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

Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. 1 var student = new Object(); 2 student.name = "xiao ming"; 3 student.age = 20; 4 student.getName = function () { 5 alert(this.name); 6 } 熟悉javascrip

MySQL创建用户与授权方法

MySQL创建用户与授权方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-10我要评论 MySQL中创建用户与授权的实现方法,对于刚开始接触mysql的朋友可以参考下 注:我的运行环境是widnows xp professional + MySQL5.0 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以

字符设备设备节点创建的两种方法

在Linux下,字符设备和块设备都体现了"一切皆为文件"的思想,对于这两种设备而言,他们在Linux系统中都有一个对应的文件来"代表"它们的存在,那就是设备文件.应用程序通过操作某个设备文件,便可以操作对应的硬件.设备有主设备号和次设备号,例如在Linux下通过ls -l /dev/ttyS0命令可以看到如图信息 对于/dev/ttyS0设备文件,c表示它是一个字符设备文件(如果是'b'则是块设备文件),4是它的主设备号,64是它的次设备号.Linux系统根据设备文

ios8使用ALAssetsLibrar创建单独文件夹方法以及删除文件夹闪退的bug

在ios8以下的系统创建新相册,然后在相册中手动删除了这个"琳小兮"相册,再使用下面的代码重新创建"琳小兮"相册是没有问题的:  [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮"                                                resultBlock:^(ALAssetsGroup *group)                  {         

【Linux】创建Linux系统服务的方法

http://www.cnblogs.com/silverwings/archive/2010/08/02/1790801.html 使用这个做系统服务,反而导致超图服务的apache无法启动??? 该方法在Ret Hat Enterprise Linux Server 5.5上测试成功.首先需要编写系统服务启动脚本,脚本大致如下: #!/bin/bash # test.sh # chkconfig: 2345 20 81 # description: just for test EXEC_PA