任务基本概念

任务是一个接受操作系统管理的独立运行单元,在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. C# Dictionary 函数解析及使用方法

    要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)  Dictionary的描述 1.从一组键(Key)到一组值 ...

  2. vue(6)—— vue中向后端异步请求

    异步请求 其实什么是异步请求已经不用多说了,通俗的说,就是整个页面不会刷新,需要更新的部分数据做局部刷新,其他数据不变. 学到这里,你应该用过jquery里的ajax了,所以很能理解了,不多说了.详细 ...

  3. 标识符and数据类型

    一,标识符 1.标识符用来给类,变量,包,方法等起名字的. 2.只能由字符,下滑线,美元符组成:这里的字符有大小写字母,中文字符,数字字符,但是符号只能有两个下划线和美元符. 3.不能由数字开头. 4 ...

  4. JavaScript中编码函数escape,encodeURI,encodeURIComponent

    第一:escape():对字符串进行编码,escape()不编码的字符:@*/+ 第二:encodeURI() 函数可把字符串作为 URI 进行编码.不会进行转义的:;/?:@&=+$,# 第 ...

  5. 练习 python之数据库增删改查

    # 文件存储时可以这样表示 ## id,name,age,phone,dept,enroll_date# 1,Alex Li,22,13651054608,IT,2013-04-01# 2,Jack ...

  6. [题解] P2513 [HAOI2009]逆序对数列

    动态规划,卡常数 题目地址 设\(F[X][Y]\)代表长度为\(X\)的序列,存在\(Y\)组逆序对的方案数量. 考虑\(F[X][i]\)向\(F[X+1][i]\)转移: 把数字\(X+1\)添 ...

  7. node编写定时任务,for循环只执行一遍的解决办法

    在用node编写定时任务时候,发现for循环只执行i=0这一次,就不接着循环执行了,下面贴上代码: exports.task = async function(ctx){ let { app } = ...

  8. day09(垃圾回收机制)

    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...

  9. css基本介绍

    目录 CSS初识 构造规则 注意 样式表的定义和使用 行内式(内联样式) 内部样式表 外部样式表(外链式) 选择器 标签选择器(元素选择器) 类选择器 id选择器 通配符选择器 伪类选择器 链接伪类选 ...

  10. jdbc连接字符串

    MySQL:String Driver="com.mysql.jdbc.Driver"; //驱动程序String URL="jdbc:mysql://localhost ...