uC/OS-III 任务详解(四)
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 任务详解(四)的更多相关文章
- .NET DLL 保护措施详解(四)各操作系统运行情况
我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- logback -- 配置详解 -- 四 -- <filter>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- pika详解(四) channel 通道
pika详解(四) channel 通道 本文链接:https://blog.csdn.net/comprel/article/details/94662394 版权 channel通道 通道 ...
- View绘制详解(四),谝一谝layout过程
上篇博客我们介绍了View的测量过程,这只是View显示过程的第一步,第二步就是layout了,这个我们一般译作布局,其实就是在View测量完成之后根据View的大小,将其一个一个摆放在ViewGro ...
- (转)python之os,sys模块详解
python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...
- 小白的Python之路 day5 os,sys模块详解
os模块详解 1.作用: 提供对操作系统调用的接口 2.常用方法: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname" ...
- 转载的:Python os 和 os.path模块详解
os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdi ...
- os.environ的详解
我们想要用Python获得一些有关系统的各种信息的时候就不得不想到os的environ,那这里面都具体包含了那些内容呢? 简介 对于官方的解释,environ是一个字符串所对应环境的映像对象.这是什么 ...
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...
随机推荐
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- codeforces 735C. Tennis Championship(贪心)
题目链接 http://codeforces.com/contest/735/problem/C 题意:给你一个数n表示有几个人比赛问最多能赢几局,要求两个比赛的人得分不能相差超过1即得分为2的只能和 ...
- CF982C Cut 'em all! DFS 树 * 二十一
Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- hdu 1671 Phone List 字典树模板
Given a list of phone numbers, determine if it is consistent in the sense that no number is the pref ...
- http gzip压缩功能记录
版权声明:本文为博主原创文章,转载请附上原文出处链接. 本文链接:https://www.cnblogs.com/shaoshuai95928/articles/Tomcat.html 最近在spri ...
- 在asp.net core中使用托管服务实现后台任务
在业务场景中经常需要后台服务不停的或定时处理一些任务,这些任务是不需要及时响应请求的. 在 asp.net中会使用windows服务来处理. 在 asp.net core中,可以使用托管服务来实现,托 ...
- [翻译] .NET Core 3.0 RC 1 发布
原文: Announcing .NET Core 3.0 Release Candidate 1 今天,我们宣布推出 .NET Core 3.0 Release Candidate 1.就像 Prev ...
- Winform中设置ZedGraph曲线图的水平与竖直参考线
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- mybatis #号与$号的区别
区别: 在sql中当传入的参数是字符型,则用#号会带上单引号,不会引起sql注入: 在sql中当传入的参数是字符型,则用$号不会带上单引号,会引起sql注入: 使用范围: 当传入的参数用于查询条件,尽 ...
- 让你的AI模型尽可能的靠近数据源
来源:Redislabs作者:Pieter Cailliau.LucaAntiga翻译:Kevin (公众号:中间件小哥) 简介 今天我们发布了一个 RedisAI 的预览版本,预集成了[tensor ...