当前位置: 首页 > news >正文

【STM32】FreeRTOS互斥量学习

互斥量(Mutex)

互斥量又称互斥信号量(本质也是一种信号量,不具备传递数据功能),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性。比如有两个任务,A在运行,B就运行不了。

实验:创建三个任务,从高到低设置优先级,在任务一和三中使用互斥量,观察执行顺序。

实现:在【STM32】FreeRTOS消息队列和信号量学习基础上进行修改

d4ea330caa814e4f92766c07264f9c4f.png

9c2930c618e342f5aee425657b9a7fc9.png

void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init *//* USER CODE END Init *//* Create the mutex(es) *//* definition and creation of Mutex01 */osMutexDef(Mutex01);Mutex01Handle = osMutexCreate(osMutex(Mutex01));/* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* Create the semaphores(s) *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* definition and creation of Task1 */osThreadDef(Task1, StartDefaultTask, osPriorityHigh, 0, 128);Task1Handle = osThreadCreate(osThread(Task1), NULL);/* definition and creation of Task2 */osThreadDef(Task2, StartTask02, osPriorityAboveNormal, 0, 128);Task2Handle = osThreadCreate(osThread(Task2), NULL);/* definition and creation of Task3 */osThreadDef(Task3, StartTask03, osPriorityNormal, 0, 128);Task3Handle = osThreadCreate(osThread(Task3), NULL);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... *//* USER CODE END RTOS_THREADS */}/* USER CODE BEGIN Header_StartDefaultTask */
/*** @brief  Function implementing the Task1 thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){osDelay(10);//堵塞if(xSemaphoreTake(Mutex01Handle,portMAX_DELAY)!=pdTRUE){printf("task1,进不去\r\n");}else{printf("task1,抢占进入\r\n");}xSemaphoreGive(Mutex01Handle);printf("task1,完成\r\n");}/* USER CODE END StartDefaultTask */
}/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){osDelay(2);//堵塞printf("task2,运行\r\n");}/* USER CODE END StartTask02 */
}/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the Task3 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{/* USER CODE BEGIN StartTask03 *//* Infinite loop */for(;;){xSemaphoreTake(Mutex01Handle,0);printf("task3,进入\r\n");xSemaphoreGive(Mutex01Handle);printf("task3,完成\r\n");}/* USER CODE END StartTask03 */
}

 现象:

84ad3238b47b489ea48b64674e5df15d.png

最低优先级先执行,最高优先级其次执行,最后是中间优先级执行。

 

 

相关文章:

【STM32】FreeRTOS互斥量学习

互斥量(Mutex) 互斥量又称互斥信号量(本质也是一种信号量,不具备传递数据功能),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性…...

Docker容器基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Docker概述1、docker是什么2、Docker的设计宗旨3、容器在内核中支持2种重要技术: 三、Docker的核心概念四、Docker相关命令1.安装依赖包2.设置阿里云…...

Ajax及前端工程化

Ajax:异步的js与xml。 作用: 1、通过ajax给服务器发送数据,并获得其响应的数据。 2、可以在不更新整个网页的情况下,与服务器交换数据并更新部分网页的技术。 一、同步与异步 二、原生Ajax 1、准备数据地址 2、创建XMLHttpReq…...

electron的使用和操作

文章目录 先创建一个基本的electron应用electron生命周期事件 先创建一个基本的electron应用 先安装 npm install --save-dev electron然后在package.json里面创建如下内容 {"name": "my-electron-app","version": "1.0.0","d…...

Python最重要的数据结构是列表(list)的使用方法

列表是一种有序的集合,可以包含任意类型的元素,包括数字、字符串、布尔值、元组等。列表使用方括号[]来表示,元素之间用逗号,分隔。 以下是一些使用列表的例子: 1. 创建一个空列表: my_list []2. 创建一个包含元素的…...

二开ChatGPT微信小程序源码 AI聊天微信小程序源码 适配H5和WEB端 支持AI聊天次数限制

ChatGPT-MP是一款基于的微信小程序,同时适配H5和WEB端。它提供了前后台二开的能力,支持打字效果的流式输出,以及限制AI聊天次数和分享增加次数等功能。该开源版本仅供学习交流使用,禁止商业用途和倒卖。感谢大家的关注与支持!技术栈方面,我们使用了JDK8、SpringBoot、Vue…...

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上,为了设计深层神经网络,牛津大学设计了VGG网络,采用块的设计理念,将AlexNet中多个重复的卷积层和池化层组成一个块 论文中,使用3x3卷积核,padding1的卷积层 和带有2x2的汇…...

Stable Diffusion - 人物坐姿 (Sitting) 的提示词组合 与 LoRA 和 Embeddings 配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132201960 拍摄人物坐姿时,需要注意: 选择一个舒适和自然的坐姿,符合个性和心情。可以坐在椅子、沙发、长凳、…...

[oneAPI] 手写数字识别-GAN

[oneAPI] 手写数字识别-GAN 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolki…...

爬虫逆向实战(十五)--阿某某营登录

一、数据接口分析 主页地址:阿某某营 1、抓包 通过抓包可以发现登录接口是Users/Login 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个s加密参数 请求头是否加密? 无响应是否加密? 无cookie是…...

【计组】校验码(奇偶校验码、海明校验码、CRC)

前言 1、小提示:本篇博文是参考王道,在复习 ASCII 码的基础上,总结校验码的相关学习知识点,并在最后搭配习题(含408真题)进行巩固练习。(对重点内容进行划线、标色) 2、适用人群&…...

File Inclusion

File Inclusion 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含…...

函数性能探测:更简单高效的 Serverless 规格选型方案

作者:拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮,以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…...

嵌入式Linux Qt5 (C++)开发栏目概述

本栏目开始介绍Linux系统下的Qt C程序开发,资源是以嵌入式为切入点(现在Linux系统下的Qt C程序开发好像就是应用于嵌入式),那就跟着一起学习Linux系统下的Qt C程序开发知识,再扩展一下嵌入式的知识吧。我这里默认已经熟…...

C语言“牵手”微店商品详情数据方法,微店商品详情API接口申请指南

微店平台的商品详情通常包括以下信息: 商品名称:展示商品的名称,用于描述商品的特性和分类。 商品图片:展示商品的图片,可以有多张图片以展示不同角度和细节。 商品价格:显示商品的销售价格,可…...

C++ volatile

volatile 一、volatile 使用场景 volatile 是 C 和 C 中的一个关键字,用于告诉编译器不要对标记为 volatile 的变量进行优化,以确保每次访问都从内存中读取变量的最新值。主要用于以下情况: 硬件寄存器和内存映射设备:在访问硬…...

空洞卷积学习笔记

文章目录 1. 扩张卷积的提出2. 理解的难点 本片博客的主题思路来自于这篇文章——如何理解Dilated Convolutions(空洞卷积),但是作者似乎是很久之前写的,文字的排版很混乱,自己来写一个新的。 1. 扩张卷积的提出 Multi-Scale Context Aggre…...

WPF中的UseLayoutRounding和SnapsToDevicePixels

WPF中的UseLayoutRounding和SnapsToDevicePixels 最近在调试项目中的UI时发现几个诡异问题: Grid容器里的GridSplitter设置粗细一样, 但截屏放大后发现线条不一样粗并且明暗不一致,导致打印出来有问题。 自定义控件的边缘在某些窗体中显示模…...

Windows权限维持—自启动映像劫持粘滞键辅助屏保后门WinLogon

Windows权限维持—自启动&映像劫持&粘滞键&辅助屏保后门&WinLogon 1. 前置2. 自启动2.1. 路径加载2.1.1. 放置文件2.1.2. 重启主机 2.2. 服务加载2.2.1. 创建服务2.2.2. 查看服务2.2.3. 重启主机 2.3. 注册表加载2.3.1. 添加启动项2.3.2. 查看注册表2.3.3. 重启…...

Mysql之explain详解

1. explain作用 使用explain可以展示出sql语句的执行计划,再根据sql的执行计划去判断这条sql有哪些点可以进行优化,从而让sql的效率达到最大化。 2. 执行计划各列含义 (1)id:id列是select的序列号,这个…...

5步打造Windows桌面美学:TranslucentTB任务栏透明化完全指南

5步打造Windows桌面美学:TranslucentTB任务栏透明化完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 厌倦了Windows系…...

超高压输电线路空载运行时的电压升高现象解析

1. 为什么空载时线路末端电压会升高? 第一次接触超高压输电线路时,很多工程师都会对这个现象感到困惑:明明没有接任何用电设备,为什么线路末端的电压反而比始端更高?这就像往一根长长的水管里注水,结果发现…...

使用MATLAB进行DeOldify结果的后处理与定量分析

使用MATLAB进行DeOldify结果的后处理与定量分析 如果你是一位习惯在MATLAB环境中工作的研究人员或工程师,当你想对DeOldify这类AI图像上色工具的输出结果进行更深入的评估时,可能会觉得缺少趁手的分析工具。直接看效果图固然直观,但如何量化…...

fre:ac开源音频转换工具:让无损音乐在全设备自由流动的专业级解决方案

fre:ac开源音频转换工具:让无损音乐在全设备自由流动的专业级解决方案 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 你是否遇到过这些音乐管理难题:珍藏多年的CD专辑不知如何数…...

Z-Image Atelier 生成动态效果预览:通过序列图像模拟简单动画过程

Z-Image Atelier 生成动态效果预览:通过序列图像模拟简单动画过程 最近在玩一个挺有意思的AI图像工具,叫Z-Image Atelier。它最吸引我的地方,不是生成单张多么精美的图片,而是它能帮你“脑补”出一段动态过程。简单来说&#xff…...

【技术解析】SimpleNet:用极简网络架构革新工业图像异常检测

1. 工业图像异常检测的现状与挑战 工业生产线上的质检环节一直是个让人头疼的问题。想象一下,你站在一条每分钟生产上百件产品的流水线旁,需要肉眼检查每个产品表面是否有划痕、凹陷或污渍——这几乎是不可能完成的任务。传统计算机视觉方法在这个领域已…...

iarduino_KB矩阵键盘库:硬件感知型Arduino按键驱动方案

1. 项目概述iarduino_KB是由俄罗斯嵌入式开发团队 iArduino.ru 面向 Arduino IDE 推出的专用矩阵键盘驱动库。该库并非通用型扫描抽象层,而是针对其自研四款物理形态与电气特性高度定制化的柔性/机械式矩阵键盘模块进行深度适配的固件级解决方案。其核心价值在于将底…...

避开这3个坑!Cortex-M3/M4使用DWT计数器时的常见错误与解决方法

Cortex-M3/M4开发实战:DWT计数器避坑指南与高阶应用技巧 在嵌入式系统开发中,精确的时间测量往往是性能优化和调试的关键。Cortex-M3/M4内核内置的DWT(Data Watchpoint and Trace)组件,特别是其CYCCNT计数器,为开发者提供了一个零…...

【独家首发】基于eBPF+Java Agent+Istio Telemetry V2的零侵入式调试框架(已落地金融级生产环境,QPS>50K场景验证)

第一章:零侵入式调试框架的演进逻辑与金融级落地价值传统调试方式依赖代码埋点、日志增强或代理注入,不仅增加系统耦合度,更在高敏感、强一致性的金融核心系统中引入不可控风险。零侵入式调试框架应运而生——它不修改业务字节码、不依赖特定…...

AVR机器人固件基座:负熵架构与确定性调度

1. 项目概述“Negentropic Base”是一个面向AVR微控制器平台的嵌入式固件基础框架,专为移动机器人(尤其是轮式探测车、自主巡线小车、轻量级自主导航平台)设计。其名称中的“Negentropic”(负熵)并非玄学术语&#xff…...