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. 传入值参数&传入引用参数的区别

    传值&传引用 1.传值 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 2.传地址 是传值的一种特殊方式,只是他传递的是地址 那么传地址以后,实参和行参都指向同一个对象 3.传引用 ...

  2. Mongodb操作1-linux安装数据库

    1.下载mongodb 百度云盘连接 :链接:https://pan.baidu.com/s/1b-hTS0XHQKpatecFoumLxw  提取码:z9ax 并送上可视化工具:链接:https:/ ...

  3. [python]标准比较运算符

    1. python的标准比较运算符,根据表达式的值的真假返回布尔值. 比较运算符: <   <=   >   >=   ==   !=   <> >>& ...

  4. 并发、线程的基本概念&线程启动结束

    并发.进程.可执行程序.进程.线程的基本概念 1.并发 并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段 ...

  5. 牛客第七场 Minimum Cost Perfect Matching 规律

    题意:1-n-1个数和1-n-1个数两两匹配,每次匹配将两个数的值进行与运算,要求每次匹配与运算的和相加最小,问满足匹配的配对方式 分析:打表前10个数与运算最小的匹配,我们发现,从n-1开始按位取反 ...

  6. 【Offer】[59-2] 【队列的最大值】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和 pop_front 的时间复杂度都是0(1). ...

  7. SQL,如果碰到Json,你会怎么做?

    1.Json串如下: DECLARE @JsonInfo NVARCHAR() SET @JsonInfo=N' { "CalcPayInput":{ ", " ...

  8. Mac环境IntelliJ IDEA配置JDK提示The selected directory is not a valid home for JDK

    笔者使用mac配置如下: 硬件环境:MacBook Pro 操作系统:MacOS Sierra 10.13.6 开发工具:IntelliJ IDEA 2016.x JDK版本:已有Open JDK 8 ...

  9. Go语言基础之基本数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...

  10. spring boot不使用resoures而是建立一个conf

    一般配置文件都是放在rsources下,有时候我们不想放在这里,而是直接放在根目录下,那么我们应该怎么做呢? 1.在pom.xml中添加: <build> <!--<final ...