任务基本概念

任务是一个接受操作系统管理的独立运行单元,在uCosII中类似与普通平台上的main()函数,需要自己来保护其因调用或中断二产生的断点,所以需要一个自己的私有堆栈,即任务堆栈;

任务有两种,分为:用户任务和系统任务;

uCosII中并没有给任务分配独立的运行空间,而是所有的任务共同使用一个内存空间,所以这里的任务属于线程;

系统中的任务共有5种状态:

  • 睡眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫睡眠状态;
  • 就绪状态:如果系统为任务分配了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件,这时任务的状态就是就绪状态;
  • 运行状态:处于就绪状态的任务如果经调度器判断获得CPU的使用权,则任务就进入了运行状态,任何时刻只能有一个任务处于运行状态;
  • 等待状态:正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就把CPU的使用权让给其他任务而使任务进入了等待状态;
  • 中断服务状态:一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时的任务状态就是中断服务状态;

CosII预定义了两个系统任务:空闲任务和统计任务,其中空闲任务是每个应用程序必须使用的,而统计任务则是应用程序可以根据实际需要来选择可配置的;

任务控制块及其链表

任务控制块

一条空任务块链表,其中所有任务控制块还未分配给任务;

一条任务块链表,其中所有任务控制块已分配给任务;

一个数据类型为OS_TCB*的数据OSPrioTbl[],按照任务优先级顺序存放了指向各个任务控制块的指针;

任务控制块初始化

OSTaskCreate() -> OSTCBInit();

流程:获取一个空的任务块 -> 创建任务控制块并初始化成员值 -> 将该任务控制块链入任务控制块链表中;

任务就续表及任务调度

任务就续表

任务就续表就是一个位图,系统中每个任务占据一个二进制位,1/0表示任务是否处于就绪状态;

实质是一个类型为INT8U的数组OSRdyTbl[],每个元素(每8个任务)是一个任务组;

位图中按照任务优先级高低为顺序依次分配对应位;

为了便于对就绪表查找,定义了一个数据类型为INT8U的变量OSRdyGrp,使该变量的每一个位都对应OSRdyTbl[]的一个任务组,如果某任务组中有任务就绪,则在变量OSRdyGrp里把该任务组所对应的位设置1,否则为0,因此也对应最多可以管理64个任务;

任务调度

uCossII中的任务调度由调度器来完成;

任务调度器主要工作有两项:

  • 在就续表中查找具有最高优先级别的就绪任务;
  • 实现任务的切换;

任务调度器有两种:

  • 任务级的调度器(由函数OS_Sched()来实现);
  • 中断级的调度器(由函数OS_IntExt()来实现);

调度器把任务切换工作分为两个步骤:

  • 获得待运行任务的TCB指针;
  • 进行断点数据的切换(在宏OS_TASK_SW()中实施任务切换,主要是靠OSCtxSw());

任务的创建

uCosII是通过任务控制块来管理任务的,所以创建任务的实质就是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务,还要使刚创建的任务进入就绪状态,并且接着引发一次任务调度;

创建任务的函数有两个:STaskCreate()OSTaskCreateExt(),后者是前者的扩展,提供了一些附加功能;

uCosII有一个规定:在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务;不允许在中断服务程序中创建任务;

任务的挂起和恢复

任务的挂起就是停止这个任务;

用户任务可通过调用系统提供的OSTaskSuspend()函数来挂起自身或者除空闲任务之外的其他任务,用该函数挂起后的任务只能在其他任务中通过调用恢复函数OSTaskResume()使其恢复为就绪状态;

其他任务相关函数

任务优先级修改

OSTaskChangePrio() 在程序的运行过程中,可调用该函数来改变任务优先级别;

任务的删除

删除任务就是把该任务置于休眠状态;

可调用函数OSTaskDel()来删除任务自身或者除了空闲任务之外的其他任务;

删除任务时为防止被删除任务所占用的一些资源没有释放,所以解决办法是:提出删除任务请求的任务只负责删除任务请求,而删除工作则由被删除任务自己来完成,这样被删除任务就可以根据自身的具体情况来决定何时删除自身,同hi也有机会删除自身所占用的资源;

能实现这种删除方式的方法是:利用被删除任务的任务控制块成员OSTCBDelReq作为请求删除方与被删除方的联络信号,同时提供了一个双方都能调用的函数(请求删除任务函数)OSTaskDelReq(),这样提出删除任务请求的任务和被删除任务双方就能使用该函数来访问OSTCBDelReq这个信号,从而可以根据这个信号的状态来决定各自的行为;

查询任务信息

在应用程序运行中需要了解一个任务的指针、堆栈等信息时,可以调用函数OSTaskQuery()来获取选定的任务信息;

uCosII中的任务的更多相关文章

  1. uCOS-II中的任务切换-图解多种任务调度时机与问题

    [@.1 任务调度时机] 之前的一篇文章分析了具体的uCOS-II中的任务切换机制,是从函数调用的角度上分析的.这次我具体从整个程序运行的时间上来看,分析多种任务调度发生的时机.以下所有图片均可点击放 ...

  2. uCos-II中任务的同步与通信

    任务的同步与通信 任务间的同步 在多任务合作工作过程中,操作系统要解决两个问题: 各任务间应该具有一种互斥关系,即对某些共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放资源后,等待任 ...

  3. UCOSII中的主栈扩展

    听陈*均说 UCOSII源代码中有这样的机制 当某个TASK的栈不够用.访问越界时 会自动调用系统生成的备用扩展栈区 但这样也有风险 备用扩展栈区如果被击穿则会造成更大的错误,可能会导致程序跑飞,如果 ...

  4. uC/OS-II中的中断(转)

    中断是指在程序运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程. 中断服务函数(ISR)是应中断请求而运行的程序. 中断向量就是中断服务函数(ISR)的入口地址, ...

  5. linux底半部机制在视频采集驱动中的应用

    最近在做一个arm+linux平台的视频驱动.本来这个驱动应该是做板子的第三方提供的,结果对方软件实力很差,自己做不了这个东西,外包给了一个暑期兼职的在读博士.学生嘛,只做过实验,没做过产品,给出的东 ...

  6. KEIL MDK环境下uCOS-II在LPC17xx上的移植实例

    1. 知识准备 要想对ucos-ii的移植有较深的理解,需要两方面知识: (1)目标芯片,这里是lpc17xx系列芯片,它们都是基于ARMv7 Cortex-M3内核,所以这一类芯片的ucos-ii移 ...

  7. UCOS-II学习记录

    本文主要记录使用UCOS II的相关内容.包括如何完成第一个UCOS II应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动完成时间获取,屏幕显示,按键驱动,信号量等内容. UCOS- ...

  8. ucos-ii的任务调度机制

    1.在ucos-ii中,有这么几张表来管理任务. A.OSTCBPrioTbl[],其结构为OS_TCB指针的数组,其元素个数为64, 每一个元素对应一个任务的优先级,ucos-ii最多可以有64个任 ...

  9. 源码分析 ucosii/source 任务源码详细分析

    分析源码: 得先学会读文档, 函数前边的 note :是了解该程序员的思想的途径.不得不重视 代码前边的  Notes,了解思想后,然后在分析代码时看他是如何具体实现的. 1. ucosii/sour ...

随机推荐

  1. 报错TypeError: $(...).live is not a function解决方法

    报错的原因是这个方法在jquery1.7以后就被废除了, 1.7以后的版本改用.on()方法 之前的用法: .live(events, function) 新方法: .on(eventType, se ...

  2. thinkPHP HTML输出多条查询结果

    控制端 $select=M('Baojiao')->query("select * from think_Baojiao where COMPANY='$comname'") ...

  3. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  4. [kuangbin带你飞]专题二十二 区间DP----POJ - 2955

    区间DP标准入门题目. 区间DP大概思路是这样的. 第一层枚举长度,因为我们需要从小区间一步步推到大区间 第二层枚举左端点,那么右端点就定了. 第三层枚举间断点,由间断点合并得到大区间. 这道括号匹配 ...

  5. JAVA的三个版本,JSE,JEE,JME三者之间的区别

    JAVA是一种面向对象语言由SUN公司出品 J针对不同的使用方向规划出JSE,JEE,JME三个版本 1.JSE 指标准版一般用于用户学习JAVA语言的基础也是使用其他两个版本的基础主要用于编写C/S ...

  6. PY3_线程红绿灯

    # Author:jum_# event 事件监测 红灯停绿灯行 线程标志位# 事件主要提供了三个方法wait.clear.set# clear:将“Flag”设置为False#set:将“Flag” ...

  7. 关于微信小程序分享提示{"errMsg":"config:ok"}

    提示 {"errMsg":"config:ok"} {errMsg: "onMenuShareTimeline:ok"} {errMsg: ...

  8. (二)jdk8学习心得之Lambda表达式

    二.Lambda表达式 1. 格式 (参数1,参数2,…,参数n)->{方法体} 注意: (参数1,参数2,...,参数n)要与方法接口中的参数一致,但是名字可以不一样. 此外,方法类型接口,有 ...

  9. [2019.03.25]Linux中的查找

    TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...

  10. 如何获得select被选中option的value和text

    如何获得select被选中option的value和text 一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById( ...