任务基本概念

任务是一个接受操作系统管理的独立运行单元,在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. 一:SqlServer中的 CEILING函数和 FLOOR函数以及ROUND()

    例如 1.ROUND() 格式为ROUND(y1,y2,y3) y1:要被四舍五入的数字y2:保留的小数位数 y3:为0,可以不写,y1进行四舍五入,不为0则y1不进入四舍五入,如果y1有值就直接根据 ...

  2. Pycharm安装并配置jupyter notebook

    Pycharm安装并配置jupyter notebook Pycharm安装并配置jupyter notebook 一: 安装命令jupyter: pip install jupyter 如果缺少依赖 ...

  3. 基于gdal的格网插值

    格网插值就是使用离散的数据点创建一个栅格图像的过程.通常情况下,有一系列研究区域的离散点,如果我们想将这些点转换为规则的网格数据来进行进一步的处理,或者和其他网格数据进行合并 等处理,就需要使用格网插 ...

  4. Django-admin管理工具

    知识预览 admin组件使用 admin源码解析 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目 ...

  5. Trie树(字典树)推荐文章

    Trie树也被称为字典树,通过这个名字,可以明显知道这种树的结构:像字典一样进行查找的树(想想采用拼音法查找汉字的时候的过程,实质上就是一个逐字母匹配的过程).Trie树就是利用了这种思想构造出来的多 ...

  6. mac系统下安装jdk并配置环境变量

    1.点击如下链接进入下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  7. 转:eclipse 设置Java快捷键补全

    1.打开Eclipse,点击" Window - Preferences"; 2. 在目录树上选择"Java——Editor——Content Assist", ...

  8. Appium could not connect to server are you sure it's running appium desktop

    use remote host value : 127.0.0.1 switch to Custom server to Automatic server adb kill-server adb st ...

  9. Binding介绍

    一.Binding的源与路径 在大多数情况下Binding的源是逻辑层的对象,但有时候为了让UI元素产生一些联动效果也会使用Binding在控件间建立关联, 下面的代码是把一个TextBox的Text ...

  10. [ffmpeg] 滤波

    ffmpeg中有很多已经实现好的滤波器,这些滤波器的实现位于libavfilter目录之下,用户需要进行滤波时,就是是调用这些滤波器来实现的.ffmpeg对于调用滤波器有一整套的调用机制. 基本结构 ...