UCOSIII优先级反转
反转现象
任务优先级:H>M>L
绿色部分:任务占用共享资源
理想状态:7释放信号量后,最高优先级H任务抢占CPU
反转原因:H和L等待同一个信号量,H的任务优先级被降至和L相同优先级,此时M已经成为最高优先级
实验举例
void start_task(void *p_arg)
{
OS_CRITICAL_ENTER(); //进入临界区
//创建一个信号量
OSSemCreate ((OS_SEM* )&TEST_SEM,
(CPU_CHAR* )"TEST_SEM",
(OS_SEM_CTR)1, //信号量初始值为1
(OS_ERR* )&err);
//创建HIGH任务
OSTaskCreate((OS_TCB * )&High_TaskTCB,
(CPU_CHAR * )"High task",
(OS_TASK_PTR )high_task,
(void * )0,
(OS_PRIO )HIGH_TASK_PRIO,
(CPU_STK * )&HIGH_TASK_STK[0],
(CPU_STK_SIZE)HIGH_STK_SIZE/10,
(CPU_STK_SIZE)HIGH_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建MIDDLE任务
OSTaskCreate((OS_TCB * )&Middle_TaskTCB,
(CPU_CHAR * )"Middle task",
(OS_TASK_PTR )middle_task,
(void * )0,
(OS_PRIO )MIDDLE_TASK_PRIO,
(CPU_STK * )&MIDDLE_TASK_STK[0],
(CPU_STK_SIZE)MIDDLE_STK_SIZE/10,
(CPU_STK_SIZE)MIDDLE_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建LOW任务
OSTaskCreate((OS_TCB * )&Low_TaskTCB,
(CPU_CHAR * )"Low task",
(OS_TASK_PTR )low_task,
(void * )0,
(OS_PRIO )LOW_TASK_PRIO,
(CPU_STK * )&LOW_TASK_STK[0],
(CPU_STK_SIZE)LOW_STK_SIZE/10,
(CPU_STK_SIZE)LOW_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_CRITICAL_EXIT(); //退出临界区
}
//高优先级任务的任务函数
void high_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
while(1)
{
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err); //延时500ms
printf("high task Pend Sem\r\n");
OSSemPend(&TEST_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
printf("high task Running!\r\n");
OSSemPost(&TEST_SEM,OS_OPT_POST_1,&err); //释放信号量
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err); //延时500ms
}
}
//中等优先级任务的任务函数
void middle_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
while(1)
{
printf("middle task Running!\r\n");
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
//低优先级任务的任务函数
void low_task(void *p_arg)
{
static u32 times;
OS_ERR err;
while(1)
{
OSSemPend(&TEST_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
printf("low task Running!\r\n");
for(times=0;times<5000000;times++)
{
OSSched(); //发起任务调度
}
OSSemPost(&TEST_SEM,OS_OPT_POST_1,&err);
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
实验现象
解决办法
UCOSIII互斥信号量:http://blog.csdn.net/zhangxuechao_/article/details/78912647
UCOSIII优先级反转的更多相关文章
- 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】
RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...
- Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)
死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...
- ucos互斥信号量解决优先级反转问题
在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...
- ucos之互斥信号量及优先级反转
在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...
- 线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)
Lock Convoy(锁封护) [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题.当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般 ...
- 【C# 线程】优先级反转与优先级继承
什么是优先级反转(翻转)优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CP ...
- UCOSIII优先级
优先级 0:中断服务管理任务 OS_IntQTask() 优先级 1:时钟节拍任务 OS_TickTask() 滴答定时器任务 优先级 2:定时任务 OS ...
- UCOSIII信号量
信号量通常分为两种 二进制信号量 计数型信号量 二进制信号量 二进制信号量只能取0和1两个值 计数型信号量 计数型信号量的范围由OS_SEM_CTR决定.OS_SEM_CTR可以为8位,16位和32位 ...
- 玩转X-CTR100 l STM32F4 l UCOS-III移植
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...
随机推荐
- Delphi内存专题
第一课: Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序).一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题). ...
- mysql性能测试-------重要!!!
我们在做性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能,找到问题,然后解决它.当然一个系统由很多东西一起组合到一起,应用程序.数据库.服务器.中中间件等等很多东西 ...
- excel VBA 密码设置问题
Excel中VBA设置密码的步骤如下: 1.右键点击任何工作表,选择VBAProject属性: 2.在新对话框总,选择“保护”选项卡: 3.勾选查看时锁定,输入密码即可.
- LinQ中合并、连接、相交、与非查询
LinQ中Union合并查询:连接不同的集合,自动过滤相同项:延迟.即是将两个集合进行合并操作,过滤相同的项 var cities = (from p in mylinq.System_Places ...
- Jenkins - 插件管理
1 - Jenkins插件 Jenkins通过插件来增强功能,可以集成不同的构建工具.云平台.分析和发布工具等,从而满足不同组织或用户的需求. Jenkins 提供了不同的的方法来安装插件(需要不同级 ...
- ingress Whitelisting白名单机制
Whitelisting To restrict the service in a way that only a list of IPs can access it, modify the ingr ...
- 算法练习之二叉树的最大深度,二叉树的层次遍历 II
1.二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,n ...
- 如何在Linux中结合示例使用'cat'和'tac'命令
上一篇我们讲到了cat的使用示例:https://www.cnblogs.com/WeiLian1024/p/11863057.html 本篇我们将继续延续Cat讲讲Tac 本文是我们讲讲Linux技 ...
- 高性能Java代码的规范
代码优化的目标是 减小代码的体积 提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例 ...
- kubelet tls
当成功签发证书后,目标节点的 kubelet 会将证书写入到 --cert-dir= 选项指定的目录中:此时如果不做其他设置应当生成上述除ca.pem以外的4个文件 kubelet-client.cr ...