uC/OS系统的任务一般都放在最开始介绍,我放在第四章主要是对模糊的概念作清晰的讲解。

从用户的角度来看,uC/OS-III 中的任务可以分为5 种状态,分别是休眠态、就绪态、运行态、挂起态和中断态,如下表所示。

任务状态之间的具体切换情况如下图所示。

也就是说,任务有五个状态,分别是休眠态、就绪态、运行态、等待态、中断服务态。即任务还没使用函数OSTaskCreate()创建时就是属于休眠态,而一但使用函数OSTaskCreate()创建了任务,并且函数OSStart()之前已经被执行的话,那么任务就属于就绪态了。然后系统会根据就绪表里任务的优先级来只执行最高的任务,而这个被执行的任务也从就绪态变为运行态,这个时刻就是这个优先级最高的任务的CPU独享moment(也就是独自拥有CPU的使用权),直到这个任务被被切换成其他状态(使用OSTimeDly()、OSSemPend()等函数能将运行态的函数变为等待态),那么就绪表里优先级最高的任务就会得到CPU的使用权执行任务,依次循环。

所以我这么分类,如果一个正在执行的任务M(即正在执行优先级最高的任务),它就只有两种情况,A.一直循环执行下去   B.改变自己任务状态。 改变状态也分为     b1.自己任务调用延时类函数或者等待信号值类函数的主动改变;    b2.被一个优先级更高的就绪任务H打断的被动改变(也就是只要有优先级更高的就绪任务,那么在下一个时钟节拍到来的的时候,任务H就会剥夺任务1的CPU)。

 主动改变的话可以是除运行态之外的任意状态,被动改变就是任务变为挂起态。

还有一种情况就是当两个任务的优先级一样怎么办?这里使用的是时间片轮转调度,就要在文件中使能  OSSchedRoundRobinCfg(DEF_ENABLED,1,&err)  函数,如下图所示。

然后在app.C文件的初始函数中初始化OSSchedRoundRobinCfg(DEF_ENABLED,1,&err) ,这个1代表1*5ms的时间,意思是相同的最高优先级时每个任务轮流运行5ms。

例子如下:

#define LED0_TASK_PRIO          4                   //任务优先级;
#define LED0_STK_SIZE 128 //任务堆栈大小,实际大小是:128*4字节
CPU_STK LED0_TASK_STK[LED0_STK_SIZE]; //任务堆栈;
OS_TCB Led0TaskTCB; //任务控制块;
//声明任务函数(一般将一个任务写成一个函数):
void Led0_task(void *p_arg); //注:“p_arg”这个参数基本用不上,但必须得写上 #define LED1_TASK_PRIO 4 //任务优先级;
#define LED1_STK_SIZE 128 //任务堆栈大小,实际大小是:128*4字节
CPU_STK LED1_TASK_STK[LED1_STK_SIZE]; //任务堆栈;
OS_TCB Led1TaskTCB; //任务控制块;
//声明任务函数(一般将一个任务写成一个函数):
void Led1_task(void *p_arg); //注:“p_arg”这个参数基本用不上,但必须得写上 //任务创建函数,注:一般将其它任务的创建放到一个专门创建任务的函数中;
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg; //故意使用一下这个参数,否则编译器会警告说此参数没有使用 CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为:1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,,&err);
#endif OS_CRITICAL_ENTER(); //进入临界区
//创建LED0任务:
OSTaskCreate( (OS_TCB *) &Led0TaskTCB,
(CPU_CHAR *) "led0 task",
(OS_TASK_PTR) Led0_task,
(void *) ,
(OS_PRIO) LED0_TASK_PRIO,
(CPU_STK *) &LED0_TASK_STK[],
(CPU_STK_SIZE) LED0_STK_SIZE/,
(CPU_STK_SIZE) LED0_STK_SIZE,
(OS_MSG_QTY) ,
(OS_TICK) , //时间片长度,启用时间片轮转调度时有用,这个参数用来设置此任务时间片长度
(void *) ,
(OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR *) &err
); //创建LED1任务:
OSTaskCreate( (OS_TCB *) &Led1TaskTCB,
(CPU_CHAR *) "led1 task",
(OS_TASK_PTR) Led1_task,
(void *) ,
(OS_PRIO) LED1_TASK_PRIO,
(CPU_STK *) &LED1_TASK_STK[],
(CPU_STK_SIZE) LED1_STK_SIZE/,
(CPU_STK_SIZE) LED1_STK_SIZE,
(OS_MSG_QTY) ,
(OS_TICK) , //时间片长度,启用时间片轮转调度时有用,这个参数用来设置此任务时间片长度
(void *) ,
(OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR *) &err
);
//OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起"start_task"任务
OS_CRITICAL_EXIT(); //退出临界区
OSTaskDel((OS_TCB *),&err);//删除任务自身;(第一个参数填写0,就是删除任务自身,要是填写别的任务的控制块,那就是删除别的任务)
}

uC/OS-III 任务详解(四)的更多相关文章

  1. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  2. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  3. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  4. pika详解(四) channel 通道

    pika详解(四) channel 通道   本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 ​ channel通道 通道 ...

  5. View绘制详解(四),谝一谝layout过程

    上篇博客我们介绍了View的测量过程,这只是View显示过程的第一步,第二步就是layout了,这个我们一般译作布局,其实就是在View测量完成之后根据View的大小,将其一个一个摆放在ViewGro ...

  6. (转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  7. 小白的Python之路 day5 os,sys模块详解

    os模块详解 1.作用: 提供对操作系统调用的接口 2.常用方法: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname" ...

  8. 转载的:Python os 和 os.path模块详解

    os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdi ...

  9. os.environ的详解

    我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面都具体包含了那些内容呢? 简介 对于官方的解释,environ是一个字符串所对应环境的映像对象.这是什么 ...

  10. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

随机推荐

  1. 问题.beego路由设置及请求参数传递

    最近项目组安排将一组Lua实现的web服务端代码重构成Go实现,所以顺便学习了下Lua和Go,这里记录下在尝试重构的过程中遇到的几个问题. 1.beego路由设置 路由设置简单说下,主要是调用了pac ...

  2. Solr7.0搭建过程

    小李经过Elasticsearch和solr之我为什么选择solr之后决定使用使用Solr作为项目的搜索引擎,然后和同事们开始讨论细节问题. 小李:虽然我会solr4.7版本的搭建,但是人总要有点梦想 ...

  3. 【selenium】-自动化测试的前提

    本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1.为什么要做自动化? 2.是否适合做自动化? 时间:时间如果很紧,连做功能测试的时间都很紧张,是没有时间做自动化的. 人员:如果都是初级的测 ...

  4. CF - 652 E Pursuit For Artifacts 边双联通

    题目传送门 题解总结起来其实很简单. 把所有的边双联通分量缩成一个点,然后建立好新边, 然后再从起点搜到终点就好了. 代码: /* code by: zstu wxk time: 2019/02/23 ...

  5. hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)

    Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...

  6. hdu 6016 Count the Sheep(思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6016 题意:给定男羊和女羊的朋友关系,即给定一个图,问从任意一只羊开始连续数四只不相同的羊的方法数. ...

  7. 工作中遇到的99%SQL优化,这里都能给你解决方案(三)

    -- 示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL ...

  8. JAVA代码解析String字符串(json格式的)

    java解析String字符串(json格式) 需要jar包:json-lib-2.4-jdk15.jar 一. String str = "{\"name\":\&qu ...

  9. 洛谷 P1091合唱队列

    吾王剑之所指,吾等心之所向                           ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...

  10. Spring Boot初识

    今天准备开一个新系列springboot,springboot结束后会更新springcloud,想要学会springcloud先学springboot吧.以后springboot和hadoop轮流更 ...