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互斥锁和递归互斥锁(五) 的相关文章

  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • FreeRTOS系列

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

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • 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,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 防止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 谁获得的消息谁来释放