[FreeRTOS 功能应用] 互斥量 功能应用

文章目录

    • 一、基础知识点
    • 二、代码讲解
    • 三、结果演示
    • 四、代码下载


一、基础知识点

[FreeRTOS 基础知识] 互斥量 概念
[FreeRTOS 内部实现] 互斥量

本实验是基于STM32F103开发移植FreeRTOS实时操作系统,互斥量实战操作。
使用工具:Keil、串口工具


二、代码讲解

1、使用xSemaphoreCreateMutex函数创建信号量

// 路径:项目\Core\Src\freertos.c
// 全局变量
SemaphoreHandle_t g_Semaphore_Mutex;
g_Semaphore_Mutex= xSemaphoreCreateBinary( );

2、使用osThreadCreate创建任务
创建两个任务优先级不同。

// 路径:项目\Core\Src\freertos.c
// 全局变量
osThreadId Sender1_Handle;
osThreadId Seceiver_Handle;if ( g_Semaphore != NULL )
{// 创建两个任务osThreadDef(Sender1, vSendTask, osPriorityHigh, 0, 1000);Sender1_Handle = osThreadCreate(osThread(Sender1), NULL);if( Sender1_Handle != NULL ){printf("Succeeded in creating Sender1_Handle Queue. Procedure!\n\r");}else{printf("Fail in creating Sender1_Handle Queue. Procedure!\n\r");}osThreadDef(Seceiver, vSeceiverTask, osPriorityNormal, 0, 1000);Seceiver_Handle = osThreadCreate(osThread(Seceiver), NULL);		if( Seceiver_Handle != NULL ){printf("Succeeded in creating Seceiver_Handle Queue. Procedure!\n\r");}else{printf("Fail in creating Seceiver_Handle Queue. Procedure!\n\r");}		
}

函数中通过osThreadDef 宏构建osThreadDef_t 结构体,名称os_thread_def_##name(## 表示字符拼接),结构体成员包括 :#name 任务名称;thread 任务处理函数;priority 任务优先级;instances 实例; stacksz 栈大小;

#define osThreadDef(name, thread, priority, instances, stacksz)  \
const osThreadDef_t os_thread_def_##name = \
{ #name, (thread), (priority), (instances), (stacksz), NULL, NULL }

将构建的osThreadDef_t 结构体传入osThreadCreate函数中,实际调用xTaskCreate函数创建任务。

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{TaskHandle_t handle;if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),&handle) != pdPASS)  {return NULL;} return handle;
}

3、Sender1 任务函数vSendTask 实现

void vSendTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask */int32_t i;/* Infinite loop */for(;;){/* 获得互斥量: 上锁 */xSemaphoreTake(g_Semaphore_Mutex, portMAX_DELAY);for (i = 0; i < 26; i++)printf("vSendTask ---- %d", i);printf("\r\n");		/* 释放互斥量: 开锁 */xSemaphoreGive(g_Semaphore_Mutex);vTaskDelay(pdMS_TO_TICKS(250));   // 延时250ms}	/* USER CODE END StartDefaultTask */
}

4、Seceiver任务函数 vSeceiverTask实现

void vSeceiverTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask */int32_t i;/* Infinite loop */for(;;){/* 获得互斥量: 上锁 */xSemaphoreTake(g_Semaphore_Mutex, portMAX_DELAY);for (i = 0; i < 34; i++)printf("vSeceiverTask ---- %d", i);printf("\r\n");		/* 释放互斥量: 开锁 */xSemaphoreGive(g_Semaphore_Mutex);vTaskDelay(pdMS_TO_TICKS(300));   // 延时300ms}	
}

三、结果演示

如下图演示结果发现,两个任务虽然优先级不同,但没有发现有抢占的现象。若低优先级获取到互斥锁没有释放之前,高优先级任务获取互斥锁失败后会提高低优先级的任务,等低优先级释放锁之后,高优先级才能获取到锁运行。
在这里插入图片描述


四、代码下载

[FreeRTOS] 互斥量 功能应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust变量绑定

变量绑定 Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型&#xff0c;不过在多数情况下&#xff0c;编译器能够从上下文推导出变量的类型&#xff0c;从而大大减少了类型说明的工作。 使用 let 绑定操作可以将值&#xff08;比如字面量&#xff09;绑定&#…

全面解析智慧校园行政办公的协作日程功能

在智慧校园的行政办公生态系统中&#xff0c;协作日程功能成为促进团队互动与工作同步的桥梁&#xff0c;它超越了传统个人日程的范畴&#xff0c;强调的是集体效率与信息的无缝对接。这一功能设计的核心&#xff0c;在于创造一个开放而有序的平台&#xff0c;让教育工作者们能…

2-4 Softmax 回归的从零开始实现

就像我们从零开始实现线性回归一样&#xff0c; 我们认为softmax回归也是重要的基础&#xff0c;因此应该知道实现softmax回归的细节。 本节我们将使用刚刚在2-3节中引入的Fashion-MNIST数据集&#xff0c; 并设置数据迭代器的批量大小为256。 import torch from IPython impo…

主从复制原理及操作

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术&#xff0c;通过将一个数据库服务器&#xff08;主服务器&#xff09;上的数据变更自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;上&#xff0c;以此来实现数据的冗余备份、读…

dtpay聚合支付系统在跨境支付场景中技术及业务方案

1 什么是跨境支付 我们从两个维度来分析什么是跨境支付&#xff0c;第一个维度我们从资金流向分析&#xff0c;国内的消费者在境外进行消费对于国内资金流来说这属于资金流出&#xff0c;这是跨境支付的第一种应用场景。第二个场景国外游客在国内进行消费&#xff0c;这属于资…

昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别

1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

js的作用域链

function test(){} 运行期上下文&#xff1a;当函数执行时&#xff0c;会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境&#xff0c;函数每次执行时对应的执行上下文都是 独一无二的&#xff0c;所以多次调用一个函数对导致创建多个执行上下…

springboot集成tika解析word,pdf,xls文件文本内容

介绍 Apache Tika 是一个开源的内容分析工具包&#xff0c;用于从各种文档格式中提取文本和元数据。它支持多种文档类型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文档、图像文件等。Tika 的主要功能包括内容检测、文本提取和元数据提取。 官网 https…

基于STM32F407ZG的FreeRTOS移植

1.从FreeRTOS官网中下载源码 2、简单分析FreeRTOS源码目录结构 2.1、简单分析FreeRTOS源码根目录 &#xff08;1&#xff09;Demo&#xff1a;是官方为一些单片机移植FreeRTOS的例程 &#xff08;2&#xff09;License&#xff1a;许可信息 &#xff08;3&#xff09;Sourc…

《中国品牌网》揭秘格行品牌崛起之路:如何从混乱市场中杀出重围,领跑未来?

在随身WiFi行业乱象丛生的背景下&#xff0c;格行品牌凭借其独特的经营理念和长期主义的精神&#xff0c;逐渐崭露头角&#xff0c;成为行业的领跑者。近日&#xff0c;《中国品牌网》记者专访了格行品牌的创始人刘永先先生&#xff0c;就他的经营理念、市场策略以及未来展望进…

AIGC | 为机器学习工作站安装NVIDIA 4070 Ti Super显卡驱动

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 话接上篇《AIGC | Ubuntu24.04桌面版安装后必要配置》文章&#xff0c;作为作者进行机器学习的基础篇&#xff08;筑基期&#xff09;&#xff0c;后续将主要介绍机器学习环境之如何…

6-google::protobuf命名空间下常用的C++ API----repeated_field.h

#include <google/protobuf/repeated_field.h> namespace google::protobuf 所生成的协议消息类使用RepeatedField和RepeatedPtrField来操作重复字段。 这些类与STL的vector非常相似&#xff0c;但包含了许多优化&#xff0c;这些优化被发现特别适用于协议缓冲区的情况。…

【优化论】基本概念与细节

优化论&#xff08;Optimization Theory&#xff09;是数学和计算机科学中一个重要的分支&#xff0c;旨在寻找给定问题的最优解。这个领域的应用非常广泛&#xff0c;从经济学、工程学到机器学习、金融等各个领域都有其踪迹。我们可以通过一系列直观的比喻来理解优化论的基本概…

Python + 在线 + 文生音,音转文(中文文本转为英文语音,语音转为中文文本)

开源模型 平台&#xff1a;https://huggingface.co/ars-语言转文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 ) hf: https://huggingface.co/openai/whisper-large-v3 github: https://github.com/openai/wh…

kettle中调用restful接口时的SSL信任证书问题

1、找第三方获取SSL证书&#xff0c;&#xff08;本案例为自签名证书&#xff09; C:\Program Files\Java\jdk1.8.0_241\jre\lib\security>keytool -import -alias aliyun-maven -keystore cacerts -file E:\entSoftware\aliyun-maven.cer 输入密钥库口令: …………一堆证…

ubuntu系统盘扩容

目录 1 介绍 2 步骤 2.1 关闭虚拟机 2.2 编辑虚拟机设置 2.3 设置扩展大小 2.4 打开虚拟机 2.5 找到磁盘管理 2.6 扩展 1 介绍 本部分主要记述怎么给ubuntu系统盘扩展存储容量&#xff0c;整个过程相对简单&#xff0c;扩容方式轻松、容易。 2 步骤 2.1 关闭虚拟机 2…

前端面试题(CSS篇三)

一、简单介绍使用图片 base64 编码的优点和缺点。 base64是一种图片处理格式&#xff0c;通过特定的算法将图片编码为一长串字符串&#xff0c;在页面显示的时候&#xff0c;可以使用该字符串来代替图片的url属性。 使用base64的优点: 减少一个图片的http请求 使用base64的缺点…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展&#xff0c;电脑已成为我们日常生活和工作中不可或缺的设备。然而&#xff0c;数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后&#xff0c;许多人会陷入绝望&#xff0c;认为这些数据已无法挽回。但事实真的如此吗&am…

WAIC 2024:科技界的摇滚狂欢,你错过了什么?

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年7月5日&#xff0c;WAIC 2024举办的第二天。数据猿作为受邀媒体&#xff0c;在今天继续亲历这一场关于未来的盛会。在这片汇聚了全球顶尖科技力量的舞台上&#xff0c;见证了人工智能领域的最新成果&#xff0c;感受到了科…

大学生电子设计大赛超全资料分享

超全大学生电子设计大赛项目合集免费分享 电赛竞赛资料大全&#xff0c;新增竞赛空间电子设计资料。包含嵌入式硬件和软件开发的学习资料&#xff0c;包括PCB教程&#xff0c;单片机例程&#xff0c; 单片机课程设计毕业设计参考资料、项目设计方案&#xff0c;源码和开发文档…