FreeRTOS 3

news2024/11/16 1:00:40

一,信号量

有时候任务之间传递的只是一个标致,让进程之间同步,会对一个共享资源的互斥性访问,这时候就可以用信号量互斥量

1,二值信号量

2,计数信号量

3,互斥量

3.1,差别

4,递归互斥量

        递归互斥量(Recursive Mutex)是一种特殊的互斥量,可以用于需要递归调用的函数中。
一个任务在获得了互斥量之后就不能再获得互斥量,而一个任务获得递归互斥量之后,可以再次获得此递归互斥量,当然每次获取必须与一次释放配对使用。


        递归互斥量同样不能在ISR函数中使用

二,相关的函数定义

在semphr.h中

创立和删除

发送和接收

三,Demo:

1,二值信号量

        定时器中断进行周期为500ms的ADC采集,在ISR里将转化结果写入缓存变量,并且释放信号量,任务中总是尝试获取信号量,获取到之后读取ADC的值,在OLED上显示。

//任务
void AppTask_Oled_Display(void *argument)
{
  /* USER CODE BEGIN AppTask_Oled_Display */
	KEYS KeyValue;


	/* Infinite loop */
	for (;;) {
        //获取信号量
		if(xSemaphoreTake(BinSem_AdcReadyHandle, portMAX_DELAY) == pdTRUE)
		{
			OLED_Printf(0, 1, 6, "ADC_Value=");
			OLED_ShowDecNum(60, 1, ADC_Value, 5, 6);
			OLED_Printf(0, 2, 6, "Voltage=");
			OLED_ShowDecNum(60, 2, ADC_Value/4095*3300, 5, 6);

		}



		if(xQueueReceive(Queue_KeysHandle, &KeyValue, pdMS_TO_TICKS(50)) != pdTRUE){continue;}
		if(KeyValue == KEY0){
			OLED_Printf(90, 0, 6, "Key=0");
		}else if(KeyValue == KEY1){
			OLED_Printf(90, 0, 6, "Key=1");
		}else if(KeyValue == KEY2){
			OLED_Printf(90, 0, 6, "Key=2");
		}else if(KeyValue == KEY3){
			OLED_Printf(90, 0, 6, "Key=3");
		}
		vTaskDelay(pdMS_TO_TICKS(100));

	}
  /* USER CODE END AppTask_Oled_Display */
}

//ISR
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	if(hadc ->Instance == ADC1){
		ADC_Value = HAL_ADC_GetValue(hadc);

		BaseType_t highTaskWoken = pdFALSE;
		if(BinSem_AdcReadyHandle != NULL){
            //获取信号量,ADC采集完成给一个信号量
			xSemaphoreGiveFromISR(BinSem_AdcReadyHandle, &highTaskWoken);
			portYIELD_FROM_ISR(highTaskWoken);
		}
	}
}
/* USER CODE END Application */


2,计数信号量

void AppTask_Keys(void *argument)
{
  /* USER CODE BEGIN AppTask_Keys */
	OLED_Printf(0, 1, "Toral_tables=", uxSemaphoreGetCount(Sem_TablesHandle), 6);
	GPIO_PinState KeyState = GPIO_PIN_SET;

	/* Infinite loop */
	for (;;) {

		KeyState = HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin);
		if(KeyState == GPIO_PIN_RESET){

            //桌子减少一个
			if(xSemaphoreTake(Sem_TablesHandle, pdMS_TO_TICKS(100)) == pdTRUE){
				OLED_ShowString(0, 3, "Check_In_OK", 6);
			}else{
				OLED_ShowString(0, 3, "Check_In_Fa", 6);
			}
			vTaskDelay(pdMS_TO_TICKS(300));
		}
		OLED_Printf(0, 2, "Avail_tables=", uxSemaphoreGetCount(Sem_TablesHandle),6);
		vTaskDelay(pdMS_TO_TICKS(10));
	}


  /* USER CODE END AppTask_Keys */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc){
	BaseType_t highTaskWoken = pdFALSE;

	if(Sem_TablesHandle != NULL){
		xSemaphoreGiveFromISR(Sem_TablesHandle, &highTaskWoken);//空桌子加一
		portYIELD_FROM_ISR(highTaskWoken);
	}


}

3,互斥量

优先级反转

优先级继承

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

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

相关文章

Orangepi 5 Pro(香橙派5pro)部署yolov5

前言 香橙派内置了6T算力的NPU,想着可以跑一下yolov5,看看香橙派的速度如何。 在开始部署之前,需要具备一定的linux技能——vim、linux常见指令、conda等等。如果没有这些技能的话,做下去会有一定的难度,可以先看几遍了…

19.实现一个算法实现删除链表中倒数第 n 个结点

19. Remove Nth Node From End of List 题目 Given the head of a linked list, remove the nth node from the end of the list and return its head. Follow up: Could you do this in one pass? Example 1: Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]Example…

蚂蚁AL1 15.6T 创新科技的新典范

● 哈希率:算力达到15.6T(相当于15600G),即每秒能够进行15.6万亿次哈希计算,在同类产品中算力较为出色,能提高WA掘效率。 ● 功耗:功耗为3510W,虽然数值看似不低,但结合其…

PythonStudio 控件使用常用方式(二十七)TActionList

PythonStudio是一个极强的开发Python的IDE工具,官网地址是:https://glsite.com/ ,在官网可以下载最新版的PythonStudio,同时,在使用PythonStudio时,它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析

有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 目录 摘要.... 1 Abstract 2 1 引言.... 3 1.1 研究背景... 3 1.2 国内外研究现状... 4 1.3 研究目的... 5 1.4 研究意义... 7 2 关键技术理论介绍... 7 2.1 Python爬虫... 7 2.1 K-means…

消灭星星游戏程序设计【连载十一】——在线程中解决音效卡顿问题

消灭星星游戏程序设计【连载十一】——在线程中解决音效卡顿问题 大家每次都可以在页面中下载本节内容的实现代码,一步一步从简单开始,逐步完成游戏的各种功能,如果大家有任何问题也欢迎留言交流。 游戏整体效果展示: 1、本节要达…

宠物空气净化器哪款好?希喂、有哈宠物空气净化器测评

回想起几年前那个午后,我意外的在路边捡到了两只小猫咪,心中莫名有一份责任感出现,所以没有丝毫犹豫我就决定将它们带回家。捡回家以后,家里确实多了几分温馨,逐渐成为我的精神支柱。小猫的到来,让家的每一…

Mybatis工具类的封装

为什么要进行Mybatis工具类的封装? 每次我们执行数据库操作都需要做以下操作: //读取配置文件InputStream inputStream Resources.getResourceAsStream("mybatis-config.xml");//通过配置文件创建SqlSessionFactorySqlSessionFactory sqlSess…

模板[C++]

目录 1.🚀泛型编程🚀 2.🚀函数模板🚀 2.1 ✈️函数模板概念✈️ 2.2 ✈️函数模板格式✈️ 2.3✈️函数模板的原理✈️ 2.4 ✈️函数模板的实例化✈️ 2.5 ✈️模板参数的匹配原则✈️ 3.🚀类模板&#x1f680…

Ubuntu20.4 系统安装后无wifi图标

0. 问题排查 1.检查 BIOS 设置: 有时候,无线网卡可能在 BIOS 中被禁用。重启电脑,进入 BIOS 设置,确保无线网卡选项是启用的。 2.检查硬件开关: 检查您的笔记本电脑是否有物理开关或键盘快捷键来启用或禁用无线网卡。 3.在软件更新中切换…

Codeforces Round 495 (Div. 2) F. Sonya and Bitwise OR(线段树)

原题链接:F. Sonya and Bitwise OR 题目大意: 给出一个长度为 n n n 的数组 a a a,并给出 m m m 次询问以及一个数字 x x x。 每个询问形式如下给出: 1 1 1 i i i y y y :将 a i a_{i} ai​ 位置的值更改为 y…

将2,3,4,5,6,8分别填入算式“口口口X口口口“的“囗“中,怎么填使得算式结果最大。

一、解题思路 将数组元素进行全排列:对整个数组进行全排列,这样我们可以避免手动选择组合、排列剩余元素等步骤。 直接分割排列后的数组:在每一个全排列中,前3个元素和后3个元素自然形成了一个组合和一个剩余元素组合。 计算并…

Linux安装redis和使用redisDesktop连接

目录 Linux安装redis及启动 第一步:下载redis压缩包 第二步:下载gcc-c 第三步:解压redis文件 第四步:进入redis-4.0.0.0目录执行make命令 第五步:安装redis到redis目录 第五步:复制redis.conf配置文件…

电脑开机LOGO修改教程_BIOS启动图片替换方法

准备工具:刷BIOS神器和change logo,打包下载地址:https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器,点击备份BIOS,保存到桌面 二.打开change logo,1.点击load image,选…

11-sentinel利用nacos作持久化

本文介绍sentinel配置数据的持久化方法。由于sentinel官方并没有提供持久化功能,大家在测试过程中也能发现sentinel服务重启后,原来配置的数据就丢了,本文就是来处理这一问题的。 做好心理准备,我们要修改sentinel的源代码&#…

Python 批量修改 Word 文档中图片的大小并居中对齐

Python 批量修改 Word 文档中图片的大小并居中对齐 错过,再遇见可能就难了!此时,你是你,我是我,再遇见,可就真的你是你,我是我,没有一丝的牵连纠缠—— !!! 对于已经编辑好的文档一定…

图表:调用FluentUI中的折线图散点图和饼状图

文章目录 0.文章介绍1.源码位置2.效果图3.代码3.1 代码结构3.2 main.qml3.3 MyLineChart.qml 0.文章介绍 调用项目FluentUI中的散点图、折线图和饼状图组件,做定制化改进。 项目FluentUI源码位置:https://github.com/zhuzichu520/FluentUI 项目FluentUI…

物联网产业链图谱_产业链全景图_物联网行业市场分析

物联网(IoT, Internet of Things)是通信网和互联网的拓展应用与网络延伸,它利用感知技术与智能装置对物理世界进行感知识别,通过网络传输互联,进行计算、处理和知识挖掘,实现人与物、物与物信息交互和无缝链接,达到对物…

springboot生成、响应图片验证码

我们平时经常会碰见图片验证码,那么在springboot中我们该怎么实现呢 我们可以使用一款开源的验证码生成工具EasyCaptcha,其支持多种类型的验证码,例如gif、中文、算术等,并且简单易用,具体内容可参考其官方文档。 效果…

网站SSL证书该如何更新?

网站SSL证书的更新是一个确保网站安全性的重要步骤。以下是一个详细的更新流程: 一、检查证书有效期 首先,需要定期检查SSL证书的有效期。通常情况下,SSL证书的有效期为一年,到期前需要进行更新。可以通过以下方式检查证书有效期…