FreeRTOS 优先级翻转

FreeRTOS 任务优先级 【杂记】 特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,,从而低优先级任务才有机会得到执行。无论何时中断的优先级都是最高的,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。0为最高,15为最低。2、用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是 0。 阅读详情

1、优先级翻转的现象

在使用二值信号量的时候会遇到很常见的一个问题——优先级翻转,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。

如下图所示,任务 H 的优先级实际上降到了任务 L 的优先级水平。因为任务 H 要一直等待直到任务 L 释放其占用的那个共享资源。由于任务 M 剥夺了任务 L 的 CPU 使用权,使得任务 H 的情况更加恶化,这样就相当于任务 M 的优先级高于任务 H,导致优先级翻转。

序号

说明

(1)

任务H和任务M为阻塞状态,等待某一事件发生,此时任务L正在运行

(2)

此时任务L要访问共享资源,因此需要获取信号量

(3)

任务L成功获取信号量,此时信号量已无资源,任务L开始访问共享资源

(4)

此时任务H就绪,抢占任务L运行

(5)

任务H开始运行

(6)

此时任务H要访问共享资源,因此需要获取信号量,但信号量已无资源,因此任务H阻塞等待信号量资源

(7)

任务L继续运行

(8)

此时任务M就绪,抢占任务L运行

(9)

任务M正在运行

(10)

任务M运行完毕,继续阻塞

(11)

任务L继续运行

(12)

此时任务L对共享资源的访问操作完成,释放信号量,任务H因成功获取信号量,解除阻塞并抢占任务L运行

(13)

任务H得以运行

2、优先级翻转实验

2.1、实验设计

1、创建一个开始任务,在开始任务里面再新建一二值信号量,task 1(低), task 2(中), task3(高)三个任务后,删除开始任务;

2、task 1间隔 1000ms 获取一次二值信号量,并连续进行任务切换,模拟信号量被占用,随后释放信号量;

3、task 2间隔 1000ms 打印中间优先级的任务正在运行;

4、较task 1 延迟 500ms 获取信号量,此时信号量被task 1 占用,task 3 不能执行,而中优先级的 task 2 一直在执行

2.2、实验代码

//任务1
k_task_handle_t task1_handle;           //任务1 句柄
#define TSK1_PRIO            2         //任务1 优先级
#define TASK1_STK_SIZE       (1*512)   //任务1 分配的堆栈大小

//任务2
k_task_handle_t task2_handle;           //任务2 句柄
#define TSK2_PRIO            3         //任务2 优先级
#define TASK2_STK_SIZE       (1*512)   //任务2 分配的堆栈大小

//任务3
k_task_handle_t task3_handle;           //任务3 句柄
#define TSK3_PRIO            4         //任务3 优先级
#define TASK3_STK_SIZE       (1*512)   //任务3 分配的堆栈大小


//开始任务
k_task_handle_t start_task_handle;      //开始任务 句柄
#define START_TSK_PRIO       1          //开始任务 优先级
#define START_TSK_STK_SIZE   1024       //开始任务 分配的堆栈大小


#define TEST_TIME_QUANTA 100
k_sem_handle_t    g_usSem;  //信号量


void task1(void)
{
    uint32_t i = 0;
    while(1)
    {

            csi_kernel_sem_wait(g_usSem, portMAX_DELAY);
            my_printf("Low task running!\r\n");
            for(i=0;i<2000000;i++)
            {
              taskYIELD();                        
            }                
            csi_kernel_sem_post(g_usSem);
            csi_kernel_delay_ms(1000);
    }
}


void task2(void)
{
    while(1)
    {
            my_printf("Middle task running!\r\n");
            csi_kernel_delay_ms(1000);
    }
}

void task3(void)
{
    while(1)
    {
            csi_kernel_delay_ms(500);
            my_printf("High task Pend Semaphore\r\n");
            csi_kernel_sem_wait(g_usSem, portMAX_DELAY);
            my_printf("High task running!\r\n");
            csi_kernel_sem_post(g_usSem);
            csi_kernel_delay_ms(500);
    }
}



void start_task(void)
{
     //进入临界区
    taskENTER_CRITICAL(); 
    
    //创建二值信号量
    g_usSem = csi_kernel_sem_new(1, 1);
    if (g_usSem == NULL) 
    {
        printf("fail to create semaphore.\n");
    }

    //创建task 1
    csi_kernel_task_new((k_task_entry_t)task1, "task1", NULL, TSK1_PRIO, TEST_TIME_QUANTA, NULL, TASK1_STK_SIZE, &task1_handle);
    if (task1_handle == NULL) 
    {
        csi_kernel_sched_resume(0);
        my_printf("Fail to create task 1!\r\n");
    }

    //创建task 2
    csi_kernel_task_new((k_task_entry_t)task2, "task2", NULL, TSK2_PRIO, TEST_TIME_QUANTA, NULL, TASK2_STK_SIZE, &task2_handle);
    if (task2_handle == NULL) 
    {
        csi_kernel_sched_resume(0);
        my_printf("Fail to create task 2!\r\n");
    }
         
    //创建task 3
    csi_kernel_task_new((k_task_entry_t)task3, "task3", NULL, TSK3_PRIO, TEST_TIME_QUANTA, NULL, TASK3_STK_SIZE, &task3_handle);
    if (task3_handle == NULL) 
    {
        csi_kernel_sched_resume(0);
        my_printf("Fail to create task 3!\r\n");
    }
      

    //删除开始任务
    if(0 != csi_kernel_task_del(csi_kernel_task_get_cur()))
    {
            my_printf("Fail to delete start_task!\r\n");
    }
    else 
    {
            my_printf("start_task is deleted!\r\n");
    }

    
    //退出临界区
    taskEXIT_CRITICAL();            
}



void freertos_demo(void)
{

    my_printf("\r\n-->this is freertos task test demo!!!\r\n");                //print message
   
    //系统初始化
    csi_kernel_init();

        //创建开始任务
    csi_kernel_task_new((k_task_entry_t)start_task, "start_task", 0, START_TSK_PRIO, 0, 0, START_TSK_STK_SIZE, &start_task_handle);

        //任务调度开始
    csi_kernel_start();
        
}

2.3、实验现象

  • Task 3(High task)等待期间,Task 2(Middle task)已经运行了多次。

  • Task 2(Middle task)优先于Task 3(High task)运行,优先级翻转。

  • 在实际应用中,我们需要避免优先级翻转这种情况,因为其不符合抢占式内核的特点,所以就有了互斥信号量。

FreeRTOS的学习(八)——3.优先级翻转问题 前面提到了二值信号量的概念,但是在多个不同优先级的任务想要同时Take和Give二值信号量时,往往会因为被占用的问题,使得高优先级任务的执行顺序与低优先级任务一样。这种情况被称为优先级翻转,优先级翻转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。...... 阅读详情

相关推荐

【Freertos基础入门】freertos任务的优先级

本系列基于stm32系列单片机来使用freerots任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。任务管理是 FreeRTOS 提供的一个强大功能,它允许开发者以并发的方式组织和管理多个任务。

m0_62599305的博客 8076

freeRTOS任务优先级

在FreeRTOS中,任务的优先级是用数字表示的,数字越大,优先级越高。由于TaskB的优先级比TaskA高,因此在系统中运行TaskB时,它将抢占TaskA,直到TaskB完成或被阻塞为止。需要注意的是,在任务编写时应该遵循良好的编程实践,如避免任务优先级反转、使用适当的同步机制等,以确保系统的稳定性和可靠性。TaskA的优先级为1,而TaskB的优先级为2。需要注意的是,在设计多任务应用程序时,必须非常小心地选择和使用任务的优先级,否则可能会导致一些问题,如优先级反转、死锁等。

嵌入式之斋 2803

FreeRTOS入门教程(任务优先级,Tick)

本篇文章将带大家学习FreeRTOS中的任务优先级,并且了解什么是任务优先级,在FreeRTOS中,任务优先级用于确定任务的执行顺序和调度顺序。任务优先级越高,任务被调度执行的频率越高。FreeRTOS支持使用整数值来表示任务优先级,整数值越高,优先级越高。FreeRTOS中任务优先级的范围通常是从0到configMAX_PRIORITIES-1,其中configMAX_PRIORITIES是一个配置常量,表示系统中支持的最大任务优先级数量。

m0_49476241的博客 3338

FreeRTOS——优先级翻转

优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行注意:在实时操作系统中不允许出现,在二值信号量中经常出现。

李彬的c++ 1291

freeRTOS任务优先级翻转

freeRTOS优先级反转及方案

嘉禾天成‘s Blog 822

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 466

FreeRTOS优先级翻转实战教程:从代码到现象分析

优先级翻转是指高优先级任务被低优先级任务间接阻塞的现象。低优先级任务获取了某个共享资源高优先级任务尝试获取同一资源,但因资源被占用而阻塞中优先级任务此时可以抢占低优先级任务执行结果:中优先级任务先于高优先级任务执行,违背了优先级调度原则。

Despacito0o的博客 1600

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 142

FreeRTOS 优先级翻转以及互斥信号量

关于FreeRTOS 优先级翻转以及互斥信号量相关知识。在实时操作系统(RTOS)中,优先级翻转是一个常见的问题,特别是在多任务环境中。当一个高优先级的任务被一个低优先级的任务阻塞时,可能会导致系统性能问题和响应延迟。FreeRTOS中的互斥信号量(也称为互斥量或二值信号量)是用来解决这个问题的一种机制。,详细仔细说明优先级翻转带来的困难,以及通过互斥信号量来降低优先级翻转带来的影响!!!

上山的月的博客 1710

如何快速学习 PHP 编程:从入门到实战的高效路径

PHP高效学习路线摘要:4-8周掌握Web开发核心技能。阶段1(1周)搭建XAMPP/MAMP环境,掌握基础语法和变量处理;阶段2(2周)重点学习表单处理、会话管理和PDO数据库操作(防SQL注入);阶段3(2-3周)实战开发个人博客等小项目。关键原则:边学边练(每个知识点配3-5个案例)、优先掌握Web刚需技能(HTTP请求、数据库、动态页面)、善用官方手册。避坑点:密码必须加密、SQL使用预处理、统一UTF-8编码。建议每天2-3小时实操,通过项目驱动学习,快速形成开发能力。

2501_94233638的博客 1383

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 989

FreeRTOS—优先级翻转问题

优先级翻转顾名思义就是:高优先级的任务变成最后执行,低优先级的任务反而优先执行。优先级翻转在抢占式内核中是很常见的问题,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破环任务的预期顺序,可能会导致未知的严重后果。在使用二值信号量的时候,经常会遇到优先级翻转问题。

m0_75103637的博客 696

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 258

FreeRTOS互斥信号量解决优先级翻转实战教程

通过本文的实践,我们清晰地看到了互斥信号量是如何通过优先级继承机制解决优先级翻转问题的。当高优先级任务等待低优先级任务持有的资源时,低优先级任务的优先级被临时提升,以防止中优先级任务抢占执行权。

Despacito0o的博客 1294

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 345

解锁RK3588芯片超强网络性能:多队列网卡与IRQ负载均衡实战

摘要:本文针对RK3588芯片的网络性能优化展开研究,重点探讨了多队列网卡配置和IRQ负载均衡技术。通过配置多队列网卡,将网络流量分散到多个队列处理,显著提升了吞吐量(测试显示提升67%)。同时,通过IRQ负载均衡配置使中断请求均匀分配到各CPU核心,CPU利用率降低至35%。文章详细介绍了配置步骤、测试方法,并分析了常见问题及解决方案。这些优化措施有效提升了RK3588在网络录像机、边缘计算等应用场景中的性能表现,为高性能网络应用提供了有力支持。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 485

linux 互斥锁优先级反转,FreeRTOS 之 优先级翻转

支持原创,转载请附上原文链接0、平台FreeRTOS源码版本:V9.0.01、引言RTOS历史上,有一个非常有名bug,“What Happened on Mars?”。 这里说的比较详细,参见:https://www.dazhuanlan.com/2020/02/09/5e3f9f811e02a/开始下面的正文之前,先讲述2个RTOS中常用的概念:互斥量与信号量1.1、互斥量互斥量一般用于共享资...

weixin_31759829的博客 978

【华为OD机试真题】29、组成最大数 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字

KJ.JK 2411

FreeRTOS 任务与任务优先级翻转详解

本文详细介绍了FreeRTOS任务机制,包括任务的基本概念、四种状态(运行、就绪、阻塞、挂起)及其转换关系。重点阐述了任务优先级调度规则,解释了优先级翻转现象及其解决方案。文章还涵盖了任务生命周期管理(创建、删除、挂起/恢复)、任务通信机制(队列、信号量、事件组)以及资源管理要点。最后提供了任务设计的最佳实践,包括合理划分任务、优先级分配、避免忙等待等注意事项,帮助开发者构建高效可靠的FreeRTOS应用系统。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 660

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

细说STM32单片机FreeRTOS优先级翻转及其展示实例

高优先级的任务TaskHP需要等待低优先级的任务TaskLP释放二值信号量之后,才可以运行,这也是期望的运行效果。但是在t4时刻,虽然任务TaskMP的优先级比TaskHP低,但是它先于TaskHP抢占了CPU的使用权,这破坏了基于优先级抢占式执行的原则,对系统的实时性是有不利影响的。下图中有3个任务,分别是低优先级的TaskLP、中等优先级的TaskMP和高优先级的TaskHP,它们的运行过程可描述如下。结合此图中的消息字符串出现的顺序和3个任务函数的代码,可以归纳程序的工作原理,具体如下。

wenchm的博客 1195

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

FreeRTOS操作系统——优先级翻转(十三)

FreeRTOS操作系统学习 文章目录FreeRTOS操作系统学习前言一、什么是优先级翻转二、优先级翻转实验1.引入库总结 前言 在使用二值信号量的时候会遇到很常见的一个问题——优先级翻转,优先级翻转在可剥夺 内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预 期顺序,可能会导致严重的后果 一、什么是优先级翻转 例如:三个不同优先级的任务——低任务、中任务、高任务 创建二值信号量,然后释放一次信号量。 低任务获取信号量,长时间不释放。 高任务获取信号量,但是此时信号量被低任务占用着

戚晨夕的博客 2834

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

freertos的优先级翻转问题

那么该如何解决优先级翻转问题,上述问题所在与高优先级多等待了中优先级任务执行的时间,我们肯定希望高优先级任务只需要等待持有互斥资源的低优先级执行的时间,不希望低优先级执行时被别的低于高优先级的任务打断,这时就可以把低优先级任务的优先级提升,提升到等待资源的阻塞队列中的最高优先级,这样的话就可以避免优先级翻转问题。今天刚看了一下freertos的使用信号量对资源进行访问控制时会出现的优先级翻转问题,由于自己对这部分内容认识还不够清楚,所以写下这篇文章来理清自己的学习思路,并分享出来。

qq_67014287的博客 437

FreeRTOS操作系统优先级翻转问题(八)

FreeRTOS总结 文章目录前言一、浅浅了解优先级翻转二、模拟 优先级翻转实验1.代码总结 前言 在使用二值信号量的时候会遇到很常见的一个问题——优先级翻转,优先级翻转在可剥夺 内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能 会导致严重的后果。 提示:以下是本篇文章正文内容,下面案例可供参考 一、浅浅了解优先级翻转 例如:三个不同优先级的任务——低任务、中任务、高任务 创建二值信号量,然后释放一次信号量。 低任务获取信号量,长时间不释放,占住了高任务的资源。 高.

qq_52572339的博客 5015

【FreeRTOS进阶】优先级翻转现象详解及解决方案

较低优先级的任务阻塞了较高优先级任务的执行。有同学可能会觉得奇怪:"这不对啊,不是应该高优先级任务抢占低优先级任务吗?怎么会反过来呢?“没错,这确实与我们对抢占式调度的认知相反,所以它被称为"优先级翻转”。优先级翻转是实时系统设计中容易被忽视但又非常重要的问题。合理使用互斥量和优先级继承机制是解决此问题的关键。在设计多任务实时系统时,我必须谨慎思考任务间的资源共享和优先级分配。,那里有从入门到精通的完整教程和示例代码,包括本文讨论的优先级翻转问题的实战解决方案!📚。

Despacito0o的博客 1741

FreeRTOS优先级翻转问题及解决方法

在 FreeRTOS 中,优先级翻转的典型诱因是低优先级任务占用资源时被中优先级任务抢占。通过使用互斥量(内置优先级继承)或设计时遵循实时系统原则(如优先级天花板、缩短临界区),可有效避免此问题。

wanghao312的博客 865

FreeRTOS 中导致优先级翻转的机制及解决方案

在 FreeRTOS 中,共享资源由二值信号量。

wanghao312的博客 942
上一篇: CK800系列内核的APTCHIP 中断和唤醒逻辑
下一篇: FreeRTOS 互斥信号量(互斥锁)
APTCHIP
博客等级 码龄3年 25粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值