uCosII中的任务
任务基本概念
任务是一个接受操作系统管理的独立运行单元,在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中的任务的更多相关文章
- uCOS-II中的任务切换-图解多种任务调度时机与问题
[@.1 任务调度时机] 之前的一篇文章分析了具体的uCOS-II中的任务切换机制,是从函数调用的角度上分析的.这次我具体从整个程序运行的时间上来看,分析多种任务调度发生的时机.以下所有图片均可点击放 ...
- uCos-II中任务的同步与通信
任务的同步与通信 任务间的同步 在多任务合作工作过程中,操作系统要解决两个问题: 各任务间应该具有一种互斥关系,即对某些共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放资源后,等待任 ...
- UCOSII中的主栈扩展
听陈*均说 UCOSII源代码中有这样的机制 当某个TASK的栈不够用.访问越界时 会自动调用系统生成的备用扩展栈区 但这样也有风险 备用扩展栈区如果被击穿则会造成更大的错误,可能会导致程序跑飞,如果 ...
- uC/OS-II中的中断(转)
中断是指在程序运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程. 中断服务函数(ISR)是应中断请求而运行的程序. 中断向量就是中断服务函数(ISR)的入口地址, ...
- linux底半部机制在视频采集驱动中的应用
最近在做一个arm+linux平台的视频驱动.本来这个驱动应该是做板子的第三方提供的,结果对方软件实力很差,自己做不了这个东西,外包给了一个暑期兼职的在读博士.学生嘛,只做过实验,没做过产品,给出的东 ...
- KEIL MDK环境下uCOS-II在LPC17xx上的移植实例
1. 知识准备 要想对ucos-ii的移植有较深的理解,需要两方面知识: (1)目标芯片,这里是lpc17xx系列芯片,它们都是基于ARMv7 Cortex-M3内核,所以这一类芯片的ucos-ii移 ...
- UCOS-II学习记录
本文主要记录使用UCOS II的相关内容.包括如何完成第一个UCOS II应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动完成时间获取,屏幕显示,按键驱动,信号量等内容. UCOS- ...
- ucos-ii的任务调度机制
1.在ucos-ii中,有这么几张表来管理任务. A.OSTCBPrioTbl[],其结构为OS_TCB指针的数组,其元素个数为64, 每一个元素对应一个任务的优先级,ucos-ii最多可以有64个任 ...
- 源码分析 ucosii/source 任务源码详细分析
分析源码: 得先学会读文档, 函数前边的 note :是了解该程序员的思想的途径.不得不重视 代码前边的 Notes,了解思想后,然后在分析代码时看他是如何具体实现的. 1. ucosii/sour ...
随机推荐
- Chrome 清除当前网站下的缓存
打开开发者工具(F12),选择 Network--Disable cache 即可.需要清除某网站缓存时 F12 打开开发者工具就会自动清除这个网站的缓存,而不必清除所有网站的缓存了. 如评论中大佬所 ...
- Ecto中的changeset,schema,struct,map
概要 schema changeset struct map 总结 概要 Ecto 中, 对数据库的操作中经常用到 4 个类型: schema changeset struct map 在 Ecto ...
- 解决Jenkins运行robot framework selenium脚本不打开浏览器的问题
1.总结就是,不能使用msi安装的jenkins,最好使用tomcat下的war包方式的jenkins 参考连接https://www.cnblogs.com/hotpsy/p/6907233.htm ...
- 学习storm实现求和操作
1 storm求和简单操作 主要逻辑,就是spout发送数据源,blot进行处理数据,主要注意的点就是 spout这有个nextTuple自旋,和使用父类的declare..方法声明要发送到下游的名称 ...
- iOS App上架流程(2016详细版)来源DeveloperLY
一.前言: 作为一名iOSer,把开发出来的App上传到App Store是必要的.下面就来详细讲解一下具体流程步骤. 二.准备: 一个已付费的开发者账号(账号类型分为个人(Individual).公 ...
- 安装Mediamanager 后Messenger后无法登录
安装MediaManager以后Messenger无法登录,提示无法连接服务,出现以下信息. 解决办法,进入控制面板,卸载"Microsoft URL Scan"程序,即可解决.
- windows 分页缓冲池 非分页缓冲池
最近在windows server 2012机器上在做性能测试时,发现8G物理内存,内存使用率占到了90%多,在“进程”列表中所有进程内存相加才2个多G,同时任务管理器->“性能”标签一项中,非 ...
- P3373 【模板】线段树 2
线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模. #include<bits/stdc++.h> using namespace std; ; struct ...
- sql server 复制表结构
1:复制表结构及数据到新表 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from ...
- es与solr对比
solr相关资料 自带Jetty服务器,也可以在tomcat发布solr,默认端口8983: 利用SolrJ操作solr API: Document文档和JavaBean相互转换,用到@Field(& ...