反转现象



任务优先级: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优先级反转的更多相关文章

  1. 优先级反转实验,使用信号量实现【RT-Thread学习笔记 5】

    RTOS中很经典的问题.就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题.这里模拟这种情况. 下面的实验模拟了优先级反转的情况: 先定义三个线程: //优先级反转实验 rt_se ...

  2. Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)

    死锁(deadlock) 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

  3. ucos互斥信号量解决优先级反转问题

    在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...

  4. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  5. 线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)

    Lock Convoy(锁封护) [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题.当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般 ...

  6. 【C# 线程】优先级反转与优先级继承

    什么是优先级反转(翻转)优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即:    高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CP ...

  7. UCOSIII优先级

    优先级 0:中断服务管理任务 OS_IntQTask() 优先级 1:时钟节拍任务        OS_TickTask()   滴答定时器任务 优先级 2:定时任务               OS ...

  8. UCOSIII信号量

    信号量通常分为两种 二进制信号量 计数型信号量 二进制信号量 二进制信号量只能取0和1两个值 计数型信号量 计数型信号量的范围由OS_SEM_CTR决定.OS_SEM_CTR可以为8位,16位和32位 ...

  9. 玩转X-CTR100 l STM32F4 l UCOS-III移植

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...

随机推荐

  1. IDEA把spring-boot项目打包成jar

    1.打开项目,然后右击项目选中‘Open Module Settings’进入project Structure( 快捷键 Ctrl+Shift+Alt+S或者File->Project Str ...

  2. PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题

    官方库地址:https://packagist.org/packages/endroid/qr-code PHP5.6 的最高版本为:2.5.1 通过composer安装 composer requi ...

  3. Redis系列 | Redis5.0 新特性

  4. Spring Boot方式的Dubbo项目

    项目依赖 需要org.apache.dubbo.dubbo-dependencies-bom, 需要org.apache.dubbo.dubbo-spring-boot-starter, 当前版本有2 ...

  5. Tomcat Response encode

    Character Encoding - Apache Tomcat - Apache Software Foundation https://cwiki.apache.org/confluence/ ...

  6. 从安装PHP到第一个tomcat执行的hello world其实没那么难

    001 初入门的朋友问我为什么她的PHP老是不能安装运行成功,作为一个乐(shi)于(li)助(liao)人(mei)的半程序员, 自然是要好好研究然后手把手教妹纸了! 002 话不多说,进入正题 为 ...

  7. 413(Request Entity Too Large)

    场景,在现金速达后台上传图片的时候,fetch请求报错,图片虽然不大,只有几百kb但是需要转成bese64传给后台, 413(Request Entity Too Large) 一开始以为是fetch ...

  8. 导入一个eclipse的java项目到IDEA报Cannot find JDK '1.7' for module 'TEST'

    解决办法: 右键你的项目--------------->OPen module settings 将dependencies里面的module sdk改成你安装的java版本就可以了(比如我电脑 ...

  9. [LeetCode] 232. Implement Queue using Stacks 用栈来实现队列

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  10. [LeetCode] 678. Valid Parenthesis String 验证括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...