freertos————互斥锁

2023-11-12

线程安全

多线程程序处于一个多变的环境,可访问的全局变量和堆数据随时可能被其他的线程改变。多个线程同时访问一个共享数据,可能造成严重的后果。
出现问题的是之前移植了一个freemodbus的从站,多个任务访问全局变量保持寄存器区,导致最后读出来的数据出错。
例子:网上有个抢票的例子很形象。虽然是java的例子但是原理是一样的。

解决方案

1、原子操作

原子操作是指不会被线程调度机制打断的操作。但是只适用于简单的特定场合。我们要保证一个复杂的数据结构的原子性,就比较困难。这个时候我们就需要一个机制锁。

2、互斥锁

linux系统提供了很多种互斥锁,但是freertos却没有提供,我们可以使用互斥信号量来实现这个操作。
互斥量的一个特点:
1、优先级继承机制
低优先级任务在访问共享资源的时候,若高优先级任务获取互斥量的时候会让低优先级任务继承其优先级。
若有3个优先级任务 task_L,task_M,task_H分别代表优先级低中高。若task_L在获取了互斥量,然后task_H想要获取同样的互斥量,则这个时候task_L会继承高优先级,这样程序不会被task_M打断了。

SemaphoreHandle_t xSemaphore = NULL;//申明互斥型信号量,在FreeRTOS中二值型信号量和互斥型信号量类型完全相同。
xSemaphore = xSemaphoreCreateMutex();// 创建互斥型信号量。
xSemaphoreTake( xSemaphore, portMAX_DELAY );//获得资源的使用权,此处的等待时间为portMAX_DELAY(挂起最大时间),如果任务无法获得资源的使用权,任务会处于挂起状态。
xSemaphoreGive( xSemaphore );//释放信号量

如果不想任务a任务b同时操作全局数组可以这么写代码。当任务a在操作数组时,若任务b打断因为获取不到互斥量则会被挂起,等到任务a执行结束释放互斥量,任务b才会获取a的访问权限

uint8_t a[256];
SemaphoreHandle_t xSemaphore = NULL;//创建互斥量
void Task_A()
{
	while(1){
	 //...
	xSemaphoreTake( xSemaphore, portMAX_DELAY );
	//do  something 操作数组a[]
		
	xSemaphoreGive( xSemaphore );//释放信号量
    //...
    }
}
void Task_B()
{
	while(1){
	 //...
	xSemaphoreTake( xSemaphore, portMAX_DELAY );
	//do  something 操作数组a[]
		
	xSemaphoreGive( xSemaphore );//释放信号量
    //...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freertos————互斥锁 的相关文章

  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)

    记录一下一个实际项目由裸机程序改成FreeRTOS 以前产品的平台还是C8051单片机上面的程序 硬件平台改成了STM32L051 同时使用STM32CubeMX生成的工程 使用FreeRTOS系统 EEPROM数据存储读取函数修改更新 2
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • FreeRTOS任务基础知识

    多任务系统 对于单任务系统 每个任务的优先级都是相同的 多任务将一个大问题分成小问题 每个小任务完成的时间很短 看起来像同时完成 多任务系统通过任务调度器来安排任务优先顺序 FreeROTS根据是一个抢占式的实时多任务系统 高优先级的任务可
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 计算机硬盘启动设置方法,bios设置硬盘启动,详细教您bios设置硬盘启动操作步骤...

    我们在操作电脑的时候 会遇到要重装系统的情况 每当这种时候我们就会想到通过bios设置来进行系统的重装 所以今天小编就来重点给你们说说关于bios设置硬盘启动的操作步骤 重装系统是我们在使用电脑的时候会经常在遇到问题时采用的解决方法 但说到
  • spring boot 获取yaml配置的对象和数组对象

    一 获取对象 例子 yaml中的配置 permission method POST path auth login spring boot 中 在需要使用到该配置的controller或者service或者专门的配置类中 添加method和
  • 磁盘加新盘扩容

    注 如果有磁盘超过2T 如下调整 使用parted来对GPT磁盘操作 进入交互式模式 没有的话yum安装下 parted dev sdb 将MBR磁盘格式化为GPT parted mklabel gpt 到这就可以进行下面的了 先查看下新磁
  • QT UI不能索引控件

    原因 Qt程序使用的UI h文件并不是最新的UI文件 最新的ui h在bulid文件夹里面了 软件依旧使用旧的ui h文件 简单讲就是先要从 ui生成ui h然后再编译 所以界面未更新实际上是因为ui h这个文件没有更新导致的 解决办法 1
  • 论文阅读-(GLIP)Grounded Language-Image Pre-training (目标检测+定位)

    Paper Grounded Language Image Pre training Code https github com microsoft GLIP 简介 定位任务与图像检测任务非常类似 都是去图中找目标物体的位置 目标检测为给出
  • 好一场逗鹅冤:一瓶老干妈撬动BAT

    近日 号称 南山必胜客 的腾讯法务部将低调做酱料的老干妈送上了热搜 腾讯状告老干妈欠广告费 老干妈则称腾讯遭遇诈骗 双方各执一词 引得不明真相的吃瓜群众热闹围观 01 腾讯被骗 老干妈躺赚 6月29日 广东省深圳市南山区人民法院发布一则民事
  • QTcpSocket 发送数据心得

    遇到不会用的函数前 最好还是看看手册QAQ 今天居然吃了这个大亏 先交代一下背景 在做TCP客户端的发送数据功能 要和服务器程序进行TCP IP通信 且根据通信协议要发送数组或者结构体 并且数组的每一个位都是有效数据位 因此不能像大多数人一
  • 跳转小程序:wx-open-launch-weapp 注意事项,不显示按钮问题

    JSSDK参考文件 一 注意查看引入JS的版本 版本 版本 引用1 6 引用1 6 引用1 6 http res wx qq com open js jweixin 1 6 0 js 如果不引用1 6会出现什么情况 开放标签列表不显示 所以
  • 浅谈路由器工作原理

    路由器的作用是实现网络的三层通信 将二层网络互联形成一个三层网络 路由器工作内容 1 封装和解封装 网卡CU 数据帧 2 维护路由表 3 IP转发 也叫网络转发 三层转发 路由器接口特点 路由器接口和计算机网卡接口一样 都能封装和解封装数据
  • 【Python:Pycharm】mmSegmentation语义分割框架教程

    文章目录 一 MMSegmentation介绍 二 MMSegmentation基本框架 1 model设置 2 dataset设置 2 1 Dataset Class文件配置 2 2 Dataset Config文件配置 2 3 Tota
  • C语言实现贪吃蛇(详细版)

    一 需要掌握的知识 C语言基础语法 结构体 指针 链表
  • MyBatis 源码解析MyBatis如何解析配置 ?(六)

    XMLMapperBuilder parameterMapElement 代码比较长了 因为parameterMap 涉及到比较多的东西
  • 基于bandersnatch搭建pip本地源

    由于现在工作在单位局域网环境下 不能联接互联网 Python程序的开发和部署需要很多地三方的包 为了便于在局域网环境下学习和使用Python进行程序开发 特在有互联网的电脑上同步了一份Pip源 定期同步部署到局域网服务器上 查了不少资料 发
  • Qt事件过滤器原理EventFilter(installEventFilter函数)

    Qt事件过滤器原理 installEventFilter函数 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s
  • 【433 发射接收源码】

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 433小结记录 记录 一 433小功率无线射频代码模块 二 使用步骤 1 433发射 主循环阻塞发射 中断发射 2 433接收数据 中断接收 总结 记录 提示 这里可以添加本
  • 介绍一款非常好用的高效率截图工具----Snipaste(下载及安装)

    高效率截图工具 Snipaste 一 简单介绍 二 下载安装 snipaste工具下载地址如下 点击下载地址进入如下页面 三 使用介绍 最后 一 简单介绍 snipaste工具是一款开源免费的超级截图工具 它可以让你将截图贴到到电脑屏幕上
  • 20个热门少儿编程网站与应用【家长必读】

    少儿编程是新的文化潮流 它涵盖了儿童学习的方方面面 逻辑思维训练 系统化思考训练 问题解决能力训练 团队协作 创造性思维培养 你可以利用我们整理的这些得到广泛认可的少儿编程网站教孩子学会编程 例如code org tynker com和sc
  • 关于Java音频播放不循环和暂停、继续播放(非Android)

    我使用的是MediaPlayer播放 设置其不循环播放方法为setPlaybackLoop 需要暂停时 只需要设置setPlaybackLoop 为true 使用stop 方法 即可暂停播放 继续播放设置setPlaybackLoop 为f
  • 毕业论文:支持向量机在铝电解槽况分类中的应用

    1 前言 机器学习在分类中已经非常成熟 受限于本人的专业能力与认知 所以本论文 课题是我在机器学习领域的初步探索 在关键的算法和代码部分其实我也一知半解 所以我重点讲述机器学习应用的过程 及探讨如何增强自己论文的叙事性 以及如何利用Chat
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出