STM32CubMx+FreeRTOS互斥锁和递归互斥锁(五)

2023-05-16

文章目录

  • FreeRTOS系统
    • 一.简绍
    • 二.STM32CubMx配置
      • 1.准备
      • 2.添加互斥锁
      • 2添加递归互斥锁
    • 三.互斥锁
      • 1.代码
      • 2.测试
    • 四.递归互斥锁
      • 1.代码
      • 2.测试

FreeRTOS系统

一.简绍

互斥锁,谁获得的消息谁来释放
递归互斥锁,可以连续获得两次,同时释放的时候也释放两次

二.STM32CubMx配置

1.准备

在这里插入图片描述

2.添加互斥锁

在这里插入图片描述

2添加递归互斥锁

在这里插入图片描述
在这里插入图片描述

三.互斥锁

1.代码

void StartDefaultTask_KEY1(void const * argument)
{

  osSemaphoreId semaphore = (osSemaphoreId) argument;
	for(;;)
  {
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
		{
			osDelay(10);
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
			{
				osThreadSuspendAll(); 
				printf("\nkey1按下\n");
				osThreadResumeAll();
				osThreadResume(myTask01Handle);
				osThreadResume(myTask02Handle);
				
				//=================获得====================
				if(osMutexWait(myMutex011Handle, osWaitForever) == osOK)
				{
					osThreadSuspendAll(); 
					printf("获得成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("获得失败\n");
					osThreadResumeAll();
				}
				
					
				//=================释放====================
				if(osMutexRelease(myMutex011Handle) == osOK)
				{
					osThreadSuspendAll(); 
					printf("释放成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("释放失败\n");
					osThreadResumeAll();
				}
			
				while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
				{
					osDelay(1);
				
				}
			}
		}
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask_KEY1 */
}
void StartTask01(void const * argument)
{
  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
  for(;;)
  {
		osThreadSuspend(NULL);
		osThreadSuspendAll(); 
		printf("我是任务1\n");
		osThreadResumeAll();
    	osDelay(1);
  }
  /* USER CODE END StartTask01 */
}

void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
	osThreadSuspend(NULL);
	osThreadSuspendAll(); 
	printf("我是任务2\n");
	osThreadResumeAll();
	osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

只能获得一次释放一次,只有在释放完成后才可以大家都共享信号量

2.测试

在这里插入图片描述

当存在获取两次信号的时候,就会阻塞

四.递归互斥锁

1.代码

void StartDefaultTask_KEY1(void const * argument)
{

  osSemaphoreId semaphore = (osSemaphoreId) argument;
	for(;;)
  	{
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
		{
			osDelay(10);
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1 )
			{
				osThreadSuspendAll(); 
				printf("\nkey1按下\n");
				osThreadResumeAll();
				osThreadResume(myTask01Handle);
				osThreadResume(myTask02Handle);
				
				//=================获得====================
				if(osRecursiveMutexWait(myRecursiveMutex01Handle, osWaitForever) == osOK)
				{
					osThreadSuspendAll(); 
					printf("获得成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("获得失败\n");
					osThreadResumeAll();
				}
				//=================获得====================
				if(osRecursiveMutexWait(myRecursiveMutex01Handle, osWaitForever) == osOK)
				{
					osThreadSuspendAll(); 
					printf("获得成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("获得失败\n");
					osThreadResumeAll();
				}
				
					
				//=================释放====================
				if(osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK)
				{
					osThreadSuspendAll(); 
					printf("释放成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("释放失败\n");
					osThreadResumeAll();
				}
				//=================释放====================
				if(osRecursiveMutexRelease(myRecursiveMutex01Handle) == osOK)
				{
					osThreadSuspendAll(); 
					printf("释放成功\n");
					osThreadResumeAll();
				}
				else
				{
					osThreadSuspendAll(); 
					printf("释放失败\n");
					osThreadResumeAll();
				}
				while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
				{
					osDelay(1);
				
				}
			}
		}
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask_KEY1 */
}

2.测试

在这里插入图片描述

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

STM32CubMx+FreeRTOS互斥锁和递归互斥锁(五) 的相关文章

  • 心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

    文章目录 前言 介绍 系统框架 原项目地址 本项目开发开源地址 硬件PCB 软件功能 详细内容 硬件外壳制作 WS2812级联及控制 MAX30102血氧传感器 0 96OLED FreeRTOS 效果视频 总结 前言 在好几年前 我好像就
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • freertos————互斥锁

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

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 防止GCC LTO删除函数

    我使用 GCC ARM Embedded 和 FreeRTOS FreeRTOS具有的功能vTaskSwitchContext 仅在某些情况下使用 内联汇编代码 问题是 当我使用LTO时 GCC不考虑内联汇编代码并认为该函数没有被使用 因此
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204

随机推荐

  • TensorFlow深度学习及教程分享

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者 xff0c 在机器学习和深度学习上也有很好的实践和积累 xff0c 在2015年年底开源了内部使用的深度学习框架TensorFlow 与Caffe Theano T
  • Python 中国象棋源码 V1

    Pygame 做的中国象棋 xff0c 一直以来喜欢下象棋 xff0c 写了 python 就拿来做一个试试 xff0c 水平有限 xff0c 电脑走法水平低 xff0c 需要在下次版本中更新电脑走法 xff0c 希望源码能帮助大家更好的学
  • python数据爬下来保存在哪里

    昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西 花了一个钟简单学习了python的基础语法 xff0c 然后参照网上的例子自己写了个爬虫 xff08 推荐学习 xff1a Python视频教程 xff09 python数据爬下来保存在本地
  • python求平均值

    python求平均值 首先我们先来了解一下计算平均数的IPO模式 输入 xff1a 待输入计算平均数的数 处理 xff1a 平均数算法 输出 xff1a 平均数 推荐 xff1a python教程 明白了程序的IPO模式之后 xff0c 我
  • 如何用for循环实现一个无限循环

    使用while True可以轻松的实现一个无限循环 xff0c 也叫死循环 xff0c 那么for循环能够实现类似的功能么 xff1f 当然可以 xff0c 借助itertools模块的cycle函数就可以 import time from
  • 闲得发慌之趣味技能:python之猫脸检测

    Python 小猫检测 xff0c 通过调用opencv自带的猫脸检测的分类器进行检测 分类器有两个 xff1a haarcascade frontalcatface xml和 haarcascade frontalcatface exte
  • 目标检测性能的衡量指标:mAP图解

    最近又重新复习了下mAP xff0c 在网上找了有关mAP的文章 xff0c 但是感觉大多数都是左抄一点又抄一点那种 写的比较乱 xff0c 可能因为mAP的计算方法前后变过几次 xff0c 所以导致有很多版本的说法存在 为了更好的理解 x
  • 热门编程——python

    python是干什么的 xff1f 要找出python火爆的原因 xff0c 我们就不得不先来了解python本身 Python 是一种面向对象的解释型计算机程序设计语言 xff0c 由荷兰人 Guido van Rossum 于 1989
  • Python求两个数的最大公约数

    一 求最大公约数算法 整数A对整数B进行取整 余数用整数C来表示 举例 C 61 A B 如果C等于0 则C就是整数A和整数B的最大公约数 如果C不等于0 将B赋值给A 将C赋值给B 然后进行 1 2 两步 直到余数为0 则可以得知最大公约
  • VINS-MONO学习笔记 [基于滑动窗口的非线性优化]

    目录 1 代码2 ceres解析求导3 ceres李代数加法代码实现4 预积分约束残差计算5 预积分雅克比计算6 视觉重投影约束7 滑动窗口边缘化 1 代码 代码位置 xff1a vins estimator gt src gt estim
  • CMakeLists入门

    目录 基础增加依赖库将 cpp文件 编译成一个库 xff0c 供其他文件调用 xff1a 变量名list自动检测编译器是否支持C 43 43 11add definitionsinclude directoriestarget includ
  • 记录一次rviz无法启动,报错segmentation fault (core dumped)的解决过程

    起因 好久没有使用ROS相关程序了 xff0c 突然想运行莫程序发现rviz打不开 仔细定位后发现在终端直接输入rviz也无法打开 经过 在网上尝试搜索了好几个小时 xff0c 尝试了以下各种方法 xff0c 更新3D graphics l
  • ROS创建功能包

    ROS创建自己的功能包 ROS中工作空间 workspace 是一个存放工程开发相关文件的文件夹 xff0c 其中有四个文件夹 src 代码空间 Source Space build 编译空间 Build Space devel 开发空间
  • webpack中的加载器(loader)

    一 了解webpack加载器 1 webpack加载器 xff08 loader xff09 的作用 在实际开发过程中 xff0c webpack默认只能打包处理以 js后缀名结尾的模块 xff0c 其他非 js后缀名结尾的模块 xff0c
  • python画图(线条颜色、大小、类型:点、虚线等)(图文详细入门教程四)

    初衷 本人由于平常写论文需要输出一些结果图 xff0c 但是苦于在网上搜python画图时 xff0c 详细的教程非常多 xff0c 但是就是找不到能马上解决自己问题那一行代码 xff0c 所以打算写一些适合需求简单的朋友应急用的教程 xf
  • Linux常用命令详解 xfs文件系统的备份与还原 xfsdump和xfsrestore命令详解

    Linux常用命令详解 xfs文件系统的备份与还原 xfsdump和xfsrestore命令详解 一 引言 1 xfsdump xff1a xfs文件系统的备份 2 xfsstore xff1a xfs文件系统的还原 二 命令具体介绍与用法
  • 小白入门gitee(码云)

    文章目录 一 介绍二 注册账户三 本地环境的配置1 如果是在linux系统2 如果是windows系统 四 本地代码库的操作1 基本概念2 命令操作 五 远程代码库的操作1 下载远程代码库的代码2 同步远程仓库 xff08 上传代码 xff
  • ubuntu:安装cmake后查看版本报错:CMake Error: Could not find CMAKE_ROOT !!!

    问题描述 xff1a ubuntu18原来安装过cmake xff0c 想升级下版本 xff0c 在安装新版本的cmake完成后 xff0c 输入指令 xff1a cmake version 查看版本号时出现以下错误 xff1a CMake
  • g++ 编译选项

    返回主页 lsgxeva MyGitee https gitee com lsgx MyGithub https github com lsgxeva 博客园首页新随笔联系订阅管理 随笔 437 文章 0 评论 1 GCC 警告 优化以及调
  • STM32CubMx+FreeRTOS互斥锁和递归互斥锁(五)

    文章目录 FreeRTOS系统一 简绍二 STM32CubMx配置1 准备2 添加互斥锁2添加递归互斥锁 三 互斥锁1 代码2 测试 四 递归互斥锁1 代码2 测试 FreeRTOS系统 一 简绍 互斥锁 xff0c 谁获得的消息谁来释放