FreeRTOS和RT-Thread的资源管理

2023-05-16

文章目录

  • 资源管理
    • 一、简述
      • 个人总结
    • 二、保证原子操作的二种方式
      • 1. 临界区
          • API
      • 2. 挂起调度器
      • 个人总结
    • 三、互斥量(mutex)
        • 优先级反转
        • 优先级继承
        • 死锁
    • 四、守护任务
    • 零: 线程间同步的名字解释
      • 1. 信号量
        • **互斥量和信号量**

资源管理

一、简述

  • 什么是资源管理

    防止不同的任务,对同一资源在并发访问的时候出现脏读,藏写现象。对此进行管理的操作叫资源管理。在单线程多任务的嵌入式领域,资源管理又分为线程间同步和线程间通信二个模块的知识。

  • 资源管理的具体实现方式

    1. 关闭中断: 保证 a 在访问资源的时候,为了不被 b 中断,直接关闭中断功能,导致即使 b 无法产生中断来打断 a 的操作。
    2. 关闭资源资源调度器: a 在访问资源的时候,直接将资源调度器挂起,即使 b 的中断产生了,但是调度器休眠, 也无法打断 a 的操作。
    3. 守护线程: 有些资源只有 c 才可以访问, a 和 b 都想访问的时候,必须通过给 c 发送消息,让 c 来直接操作资源,a 和 b 同时发消息给 c, 让 c 来决定先执行谁,在执行谁。

个人总结

就是通过一些操作,防止并行访问资源的时候,出现脏读藏写的管理称之为资源管理。

二、保证原子操作的二种方式

  • 原子性

    • 通俗解释

    物理上认为原子是最小的粒子,不能在进行分割。计算机的原子性讲的就是操作不能被打断,不能先执行一部分,过一会子执行另一部分,必须一次性完全执行完成。

    • 专业解释

    指事务的不可分割性,一个事务的所有操作要么不间断地全部被执行,要么一个也没有执行。

1. 临界区

  • 概念

临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。

  • 简介

每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。

  • 简述

把某优先级以下的中断全部关闭。进行原子操作。

  • 原理

把中断全部关掉,或是关掉优先级在 、configMAX_SYSCAL_INTERRUPT_PRIORITY 及以下的中断——依赖于具体使用的 FreeRTOS 移植。抢占式上下文切换只可能在某个中断中完成,所以调用 taskENTER_CRITICAL() 的任务可以在中断关闭的时段一直保持运行态,直到退出临界区.

API

临界区必须只具有很短的时间,否则会反过来影响中断响应时间。在每次调用 taskENTER_CRITICAL() 之后,必须尽快地配套调用一个 taskEXIT_CRITICAL(), 读写这种比较耗费时间的操作,尽量不要使用临界区这种保护机制。

  • FreeRTOS
void vPrintString( const portCHAR *pcString )
{
    /* 往stdout中写字符串,使用临界区这种原始的方法实现互斥。 */
    taskENTER_CRITICAL();
    {
        printf( "%s", pcString );
        fflush( stdout );
    }
    taskEXIT_CRITICAL();
    /* 允许按任意键停止应用程序运行。实际的应用程序如果有使用到键值,还需要对键盘输入进行保护。 */
    if( kbhit() )
    {
    	vTaskEndScheduler();
    }
}
  • RT-Thread
1)调用 rt_hw_interrupt_disable() 进入临界区,调用 rt_hw_interrupt_enable() 退出临界区;
2)调用 rt_enter_critical() 进入临界区,调用 rt_exit_critical() 退出临界区。

2. 挂起调度器

直接把任务调度器给挂起锁死,这个时候外部中断虽然使能,但是无法操作。

需要创建临界区除了 FreeRTOS 操作系统提供的函数外,还可以通过挂起调度器的操作来创建一个临界区。但是重新唤醒(resuming, or un-suspending)调度器是一个费时的操作。所以评估使用临界区函数来实现原子操作还是挂起调度器实现原子操作,需要结合实际情况。

在调度器处于挂起状态时,不能调用 FreeRTOS API 函数。

  • API
void vPrintString( const portCHAR *pcString )
{
    /* Write the string to stdout, suspending the scheduler as a method
    of mutual exclusion. */
    vTaskSuspendScheduler();
    {
        printf( "%s", pcString );
        fflush( stdout );
    }
    xTaskResumeScheduler();
    /* Allow any key to stop the application running. A real application that
    actually used the key value should protect access to the keyboard input too. */
    if( kbhit() )
    {
        vTaskEndScheduler();
    }
}

个人总结

就是将外部中断给屏蔽,原本的操作就不会被打断,这样操作起来就具有原子性了。

三、互斥量(mutex)

互斥量是一种特殊的二值信号量,用于控制在两个或多个任务间访问共享资源。

  • 互斥量的特点

    用于互斥的信号量必须归还。

    用于同步的信号量通常是完成同步之后便丢弃,不再归还

  • API

static void prvNewPrintString( const portCHAR *pcString )
{
    /* 互斥量在调度器启动之前就已创建,所以在此任务运行时信号量就已经存在了。
    试图获得互斥量。如果互斥量无效,则将阻塞,进入无超时等待。xSemaphoreTake()只可能在成功获得互
    斥量后返回,所以无需检测返回值。如果指定了等待超时时间,则代码必须检测到xSemaphoreTake()返回
    pdTRUE后,才能访问共享资源(此处是指标准输出)。 */
    xSemaphoreTake( xMutex, portMAX_DELAY );
    {
        /* 程序执行到这里表示已经成功持有互斥量。现在可以自由访问标准输出,因为任意时刻只会有一个任
        务能持有互斥量。 */
        printf( "%s", pcString );
        fflush( stdout );
    }
    /* 互斥量必须归还! */
    xSemaphoreGive( xMutex );
    
    /* Allow any key to stop the application running. A real application that
    actually used the key value should protect access to the keyboard too. A
    real application is very unlikely to have more than one task processing
    key presses though! */
    if( kbhit() )
    {
    	vTaskEndScheduler();
    }
}


int main( void )
{
    /* 信号量使用前必须先创建。本例创建了一个互斥量类型的信号量。 */
    xMutex = xSemaphoreCreateMutex();
    /* 本例中的任务会使用一个随机延迟时间,这里给随机数发生器生成种子。 */
    srand( 567 );
    /* Check the semaphore was created successfully before creating the tasks. */
    if( xMutex != NULL )
    {
        /* Create two instances of the tasks that write to stdout. The string
        they write is passed in as the task parameter. The tasks are created
        at different priorities so some pre-emption will occur. */
        xTaskCreate( prvPrintTask, "Print1", 1000,
        "Task 1 ******************************************\r\n", 1, NULL );
        xTaskCreate( prvPrintTask, "Print2", 1000,
        "Task 2 ------------------------------------------\r\n", 2, NULL );
        /* Start the scheduler so the created tasks start executing. */
        vTaskStartScheduler();
    }
    /* 如果一切正常,main()函数不会执行到这里,因为调度器已经开始运行任务。但如果程序运行到了这里,
    很可能是由于系统内存不足而无法创建空闲任务。 */
    for( ;; );
}

image-20201220233035060

image-20201220233211865

优先级反转

高优先级任务被低优先级任务阻塞推迟的行为被称为”优先级反转”。

优先级反转可能会产生重大问题。但是在一个小型的嵌入式系统中,通常可以在设计阶段就通过规划好资源的访问方式避免出现这个问题。’

优先级继承

优先级继承是最小化优先级反转负面影响的一种方案-其并不能修正优先级反转带来的问题,仅仅是减小优先级反转的影响。优先级继承
使得系统行为的数学分析更为复杂,所以如果可以避免的话,并不建议系统实现对优先
级继承有所依赖。

优先级继承暂时地将互斥量持有者的优先级提升至所有等待此互斥量的任务所具有的最高优先级。

image-20201220233749531

死锁

  1. 任务 A 执行,并成功获得了互斥量 X。
  2. 任务 A 被任务 B 抢占。
  3. 任务 B 成功获得了互斥量 Y,之后又试图获取互斥量 X——但互斥量 X 已经被任务 A 持有,所以对任务 B 无效。任务 B 选择进入阻塞态以等待互斥量 X 被释放。
  4. 任务 A 得以继续执行。其试图获取互斥量 Y——但互斥量 Y 已经被任务 B持有而对任务 A 无效。任务 A 也选择进入阻塞态以等待互斥量 Y 被释放。

任务 A 在等待一个被任务 B 持有的互斥量,而任务 B 也在等待一个被任务 A 持有的互斥量。死锁于是发生,因为两个任务都不可能再执行下
去了。

四、守护任务

  1. 守护任务是对某个资源具有唯一所有权的任务。只有守护任务才可以直接访问其守护的资源——其它任务要访问该资源只能间接地通过守护任务提供的服务

  2. 守护任务提供了一种干净利落的方法来实现互斥功能,而不用担心会发生优先级反转和死锁。

守护任务使用了一个 FreeRTOS 队列来对终端实现串行化访问。该任务内部实现不必考虑互斥,因为它是唯一能够直接访问终端的任务。

  • 总结

有些资源只有守护线程才能访问,使用的时候发消息给守护线程,让守护线程去访问资源,从而避免死锁和优先级反转的问题

零: 线程间同步的名字解释

1. 信号量

信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量 引用自: 百度百科-信号量

image-20201221005005945

互斥量和信号量

  1. 互斥量用于线程的互斥,信号量用于线程的同步。

    这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

2.互斥量无法保证线程对资源的有序访问,信号量可以。

二值信号量和互斥锁的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS和RT-Thread的资源管理 的相关文章

  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • python_os.walk(dir)

    for root dirs files in os walk dir os walk返回一个三元组 path 对当前路径以及其下所有的子目录进行递归 dirs 当前路径下的子目录 files 当前路径下的文件 gt gt gt for r
  • 使用org.apache.tools.zip包操作文件

    import java io import org apache tools zip import java util Enumeration 功能 zip压缩 解压 支持中文文件名 说明 本程序通过使用Apache Ant里提供的zip工
  • C++11多线程std::thread的简单使用

    文章转载自http blog csdn net star530 article details 24186783 在cocos2dx 2 0时代 我们使用的是pthread库 是一套用户级线程库 被广泛地使用在跨平台应用上 但在cocos2
  • Java线程的5种状态及状态之间转换

    Java中的线程的生命周期大体可分为5种状态 1 新建 NEW 新创建了一个线程对象 2 可运行 RUNNABLE 线程对象创建后 其他线程 比如main线程 调用了该对象的start 方法 该状态的线程位于可运行线程池中 等待被线程调度选
  • python基于字典多线程目录枚举工具

    基于字典多线程目录枚举工具 整体思路 命令行参数获取 字典文件的读取 多线程访问 命令行参数获得 使用模块 sys getopt sys argv获取命令行执行的数据 参数获得 opt args getopt getopt sys argv
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • 多核编程学习笔记之OpenMP(一)

    多核编程学习笔记之OpenMP 一 I 配置及简介 1 1 在VC 2008 VC9 0 中 如果没有任何设置 在代码中使用编译指导语句将不会报错 但是也不起作用 1 2 OpenMP发展与优势 1 2 1 OpemMP的规范由SGI发起
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • 多线程之创建工作者线程和用户界面线程区别

    转帖 部分原创 1 工作者线程倾向于琐碎的处理 与它不同的是 用户界面线程具有自己的界面而且实际上类似于运行其他应用程序 创建线程而不是其他应用程序的好处是线程可与应用程序共享程序空间 这样可以简化线程与应用程序共享数据的功能 2 典型情况
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • Android资源管理中的SharedLibrary和Dynamic Reference-------之资源共享库(一)

    一 引言 共享库的概念 相信大家都有所了解 它有有许多优点 可以设想 在一个系统上要跑100个应用 并且它们都使用到了同一个库 如果这个库做成静态库 那么每个应用中都要打包一次这个库 100个应用就是100次 这无疑是重复的 我们可不可以在
  • QT实现多线程,以及子线程调用主线程方法与变量

    实现思路 第一步需要将子线程声明为主线程的友元类 第二步是将主线程类对象的地址通过信号槽传递给子线程中创建的对象 使得子线程能访问主线程的数据的 1 子线程 displayresult h 头文件 伪代码 include tabwindow
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v

随机推荐

  • 神策数据荣获“MarTech 领域最具商业合作价值企业”称号

    近日 xff0c 数据猿 2023 年度 3 月 企业盘点 活动落下帷幕 xff0c 2023 中国 MarTech 领域最具商业合作价值企业盘点 正式对外发布 神策数据依托在 MarTech 领域的专业度与知名度 xff0c 被评为 Ma
  • 多业态连锁商超如何扩大品牌影响力?

    现阶段 xff0c 消费者以购物为主的目的性消费减少 xff0c 促使连锁商超业务加速延伸至更广泛的领域 xff0c 在传统零售基础上增加餐饮 娱乐 运动等场景 同时 xff0c 伴随着数字化和互联网技术的高速发展 xff0c 多业态连锁商
  • 科普丨关于 A/B 测试的十问十答

    你想知道的 xff0c 都在这里 xff01 本文是神策数据 十问十答 科普系列文章的第二期 xff0c 围绕 A B 测试展开 1 Q xff1a 什么是 A B 测试 xff1f A xff1a A B 测试作为互联网企业的核心增长手段
  • 神策数据荣登胡润百富 2023 全球独角兽榜

    4 月 18 日 xff0c 胡润研究院于广州 2023 全球独角兽 CEO 大会发布 2023 全球独角兽榜 xff08 Global Unicorn Index 2023 xff09 xff0c 列出了全球成立于 2000 年之后 xf
  • 游戏企业如何做用户行为序列分析?

    用户行为序列是指固定时间内单个用户按照时间顺序依次触发的部分或全部事件 通过对用户行为序列进行分析 xff0c 企业可以归纳出群体用户的行为特征 xff0c 辅助产品运营和迭代 通常 xff0c 企业可以将用户行为序列分析应用于所有的分析场
  • 神策营销云时效性升级,秒级营销即刻开启

    信息化时代 xff0c 时效性成为企业营销与管理的重要竞争力之一 高时效营销能够帮助企业提高决策效率 降低成本 xff0c 争分夺秒 留住用户并给用户带来更好的体验 xff0c 它是促成企业成功营销的关键 为了帮助企业全面提升营销时效性 x
  • 修改Mac python默认pip源

    1 打开Application Support文件夹 command 43 空格 打开聚焦搜索 输入 Library Application Support 找到Application Support文件夹 2 如果里面没有pip pip
  • ubuntu20.04 proxychains4

    1 搜索包 span class token function sudo span span class token function apt span search proxychains4 2 安装proxychains4 span c
  • 神策微报告丨10 页速览「生成式 AI」能力边界与商业化!

    以 ChatGPT 为代表的生成式 AI 投入规模化应用后 xff0c 一场人工智能的军备竞赛正在上演 xff0c 生成式 AI 成为科技领域关注的焦点 基于此背景 xff0c 神策数据正式发布微报告 关于生成式 AI xff0c 这 10
  • 银行业数字化运营体系(上):渠道触点矩阵建设

    数字化运营体系是构建从获客 激活 留存 营收转化到转介的客户全生命周期的运营体系 xff0c 推动线上产品和业务运营的数字化与智能化 随着互联网技术的不断发展 xff0c 移动设备已经成为人们日常生活中不可或缺的一部分 xff0c 越来越多
  • 5 月 23 日,直播解读神策数据 X 网易云商智能营销解决方案

    点击 阅读原文 xff0c 免费报名
  • 一篇讲清:数据采集与埋点

    在这篇文章里面 xff0c 我们会对数据采集的一些基本概念进行阐述 xff0c 然后 xff0c 会针对目前市面上新增的一些前端埋点技术 xff0c 如可视化埋点与 无埋点 的技术细节做一个具体的介绍 xff0c 并且阐述我们自己对于这些技
  • 大数据分析的四个关键环节

    什么是大数据 xff1f 随着大数据时代的到来 xff0c AI 概念的火热 xff0c 人们的认知有所提高 为什么说大数据有价值 xff1f 这是不是只是一个虚的概念 xff1f 大家怎么考虑数据驱动问题 xff1f 为什么掌握更多的数据
  • 数据分析师的具体工作职责和工作内容有哪些?

    我和我们数据分析师总监深入聊了一下 xff0c 这个答案不仅会和大家聊一下工作内容和工作职责 xff0c 还会真心实意的和大家聊下这个工作是不是像想象中那么光鲜 xff0c 有什么大家其实没想到的工作 xff0c 其实很重要 xff0c 也
  • 一篇讲清:数据采集中的安全与隐私

    1 数据采集面临的安全与隐私挑战 不管是第三方分析工具 xff0c 还是企业的第一方分析系统 xff0c 在分析用户行为时 xff0c 通常都会选择在客户端 xff08 一般是安卓 iOS 和 Web 端 xff09 采集用户的行为 xff
  • 什么是全埋点?

    全埋点 xff0c 也叫无埋点 无码埋点 自动埋点 全埋点是指预先收集用户的所有行为数据 xff0c 然后再根据实际分析需求从中提取行为数据 全埋点采集的事件主要包括下面四种 AppStart 事件 指 App 启动 xff0c 包括冷启动
  • 一分钟解决你的公有云私有云选择困难症

    全球的云计算产业如今是一日千里的发展势头 xff0c 最近国际调研机构RightScale数据显示 xff0c 有88 的企业在使用公有云 xff0c 其余的选择了私有云与混合云 许多的企业负责技术人员在选择哪种云服务时也往往有这样的疑问
  • Ubuntu将默认python版本改为python3

    文章目录 具体流程bash操作记录 具体流程 查看当前系统默认python版本 python version 查看 安装python 安装python3 apt install python3查看python3 whereis python
  • MacOS通过homebrew安装python 3.7方法

    显示Mac系统隐藏文件 xff1a 显示 defaults write com apple finder AppleShowAllFiles boolean true killall Finder 隐藏 defaults write com
  • FreeRTOS和RT-Thread的资源管理

    文章目录 资源管理一 简述个人总结 二 保证原子操作的二种方式1 临界区API 2 挂起调度器个人总结 三 互斥量 xff08 mutex xff09 优先级反转优先级继承死锁 四 守护任务零 xff1a 线程间同步的名字解释1 信号量 互