FreeRTOS之二值信号量(实践)

信号量相当于一个标志,实现对资源多少的管理。 比如停车场空位的数量。

这里使用的是二值信号量,其队列长度为1,只有空或满两种状态。

1、步骤:

1.1、创建信号量

1.2、释放信号量

1.3、获取信号量

注:若想深入还需花大功夫,目前目标争取会用

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "semphr.h" //添加信号量相关头文件
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO         1
//堆栈大小
#define START_STK_SIZE        128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;

//task1优先级
#define TASK1_TASK_PRIO      	2
//task1堆栈大小
#define TASK1_STK_SIZE        128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t  Task1Task_Handler;

//task2优先级
#define TASK2_TASK_PRIO      	3
//task2堆栈大小
#define TASK2_STK_SIZE        128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t  Task2Task_Handler;

QueueHandle_t semphore_handle;//信号量句柄

int main(void)
{
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
		delay_init();
		uart_init(9600);
		LED_Init();
		LED0=0;	
	
		semphore_handle=xSemaphoreCreateBinary();//创建二值信号量
	    if(semphore_handle != NULL)
		{
		   printf("二值信号量创建成功!!\r\n");
		}
	
		xTaskCreate((TaskFunction_t )  start_task,     //指向任务函数的指针,必须为第一个
								(char *   			) "start_task",   //任务名字
								(uint16_t 			) START_STK_SIZE, //任务堆栈大小,字为单位
								(void *         	) NULL, 		  //传递给任务函数的参数
								(UBaseType_t    	) START_TASK_PRIO,//任务优先级,数值大,则优先级大
								(TaskHandle_t * 	) &StartTask_Handler);//任务句柄(控制块)									
		vTaskStartScheduler();//开启任务调度							
}

//开始任务
//返回值为pdPASS则创建任务成功
 void start_task(void * pvParameters)
{
	    taskENTER_CRITICAL();//进入临界区,创建任务完成后,才开始执行优先级任务
        //创建Task1
		xTaskCreate((TaskFunction_t ) task1_task,
								(char *   			) "task1_task",
								(uint16_t 			) TASK1_STK_SIZE,
								(void *         	) NULL,
								(UBaseType_t    	) TASK1_TASK_PRIO,
								(TaskHandle_t * 	) &Task1Task_Handler);
        //创建Task2
		xTaskCreate((TaskFunction_t ) task2_task,
								(char *   			) "task2_task",
								(uint16_t 			) TASK2_STK_SIZE,
								(void *         	) NULL,
								(UBaseType_t    	) TASK2_TASK_PRIO,
								(TaskHandle_t * 	) &Task2Task_Handler);
								
		vTaskDelete(StartTask_Handler);//删除开始任务,删除自身用NULL
		taskEXIT_CRITICAL();//退出临界区
}


//任务一,获取二值信号量
void task1_task(void * pvParameters)
{    
	uint8_t key=1;
	BaseType_t err;	
	while(1)
	{
		if(key==1)
		{
		    if(semphore_handle != NULL)
			{
			    err = xSemaphoreGive(semphore_handle);
				printf("二值信号量释放成功!!\r\n");
			}else{
				printf("二值信号量释放失败!!\r\n");
			}
		  
		}
		vTaskDelay(10);
	}
}

//任务二,释放二值信号量
void task2_task(void * pvParameters)
{   
	uint32_t i=0;
	while(1)
	{
	    xSemaphoreTake(semphore_handle,1000);//获取信号量并死等
		printf("获取信号量释放成功!!:%d\r\n",++i);
	}
}


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++11特新:弱引用智能指针

弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手,它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比,这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是,DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目:ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务:稀疏重建;拓展:Image to 3D、文本到3D 作者:Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su ,来自UC San Dieg…

Redis 6 性能大揭秘:如何优化缓存命中率?

Redis 6的性能优化,特别是关于如何优化缓存命中率。 这篇文章会包含10个代码示例,帮助深入理解和应用相关的技巧 1、 监控缓存命中率 在优化之前,首先要了解当前的缓存命中率。Redis提供了INFO命令来查看性能指标,包括命中率。…

51单片机模数转换ADC原理与代码一

51单片机模数转换ADC原理与代码一 1.概述 这篇文章是模数转换的入门文章,这篇文章主要介绍模数的概念、原理、核心指标、专业术语,以及一个模数转换的实例代码实现检测电位器的数值变化。 2.ADC介绍 2.1.ADC概念 ADC(Analog-to-Digital Converter)是…

TrustZone之安全启动与引导失败处理

一、引导和信任链 引导是任何TrustZone系统的关键部分。只有在引导流程中之前运行的所有软件组件都是可信的情况下,才能信任某个软件组件。这通常被称为信任链。下图显示了一个简化的信任链: 在我们的示例中,首先运行的代码是boot ROM。我们必须隐式信任boot ROM,因…

「完美世界」石昊调戏清漪,告白欲以身相许,渡劫神莲淬炼肉身

Hello,小伙伴们,我是拾荒君。 《完美世界》第142集已经更新。石昊在齐道临赠予的令牌庇护下,成功潜入仙池,借助着他的重瞳,他发现那神秘的渡劫神莲正位于这仙池之中。然而,渡劫神莲的位置上空雷云翻滚,宛如…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范,就是接口 3.监听器的作用是,监听某…

uniapp纯CSS实现圆形进度条组件

uniapp纯CSS实现圆形进度条组件。圆形进度条组件组合做一个步骤进度组件是非常常见。 纯 CSS 实现圆形进度条组件有以下几个好处: 轻量级:由于纯 CSS 实现,无需额外的 JavaScript 或图像资源,所以组件的文件大小相对较小&#xf…

HTML5文档

目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400,入参为JSON; 二、分析 1、Postman请求并没有请求到后台Api(由于语法错误,服务器无法理解请求); 2、入参出错范围:cookie、header、body、form-data、x-www-f…

3.[BUU]warmup_csaw_20161

1.checksec 检查文件类型 ELF-64-little ,无其他限权,直接用ida检查代码。 2.IDA进行反编译,进行代码审计 查看各个名称的内容: 了解基本攻击思路: 攻击思路:gets输入垃圾数据覆盖v5内容,再将s…

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取-完整代码

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取 本章节记录Xilinx ZYNQ PS端实现SD卡txt文件的数据读取。 踩坑记录,本章节主要内容参考原子哥 板子:xilinx zynq 7010 文章目录 FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取一、开发板引脚配置二、PS端导入F…

嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑

一、目的/概述 二、资料来源 三、逻辑和包含关系 四、Arm GNU Toolchain最常用的命令 嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑 一、目的/概述 对比高集成度的IDE(MDK、IAR等),Linux开发需要自己写Makefile等多种脚本。eclipse、Visual Studio等需要了解预处…

高德地图逆地理编码踩坑日志

本人是一枚Java小白,公司项目中用到根据经纬度反查该地址中文信息的场景,因为一开始调用的经纬度是能反查出区域编码的,以为towncode都是String返回结果,如下图: 没想到当没有名字任何一个城市区域的时候,…

在Linux安装卸载文件

目录 一、Linux系统应用程序 1.典型的应用程序的目录结构 2、常见的软件包封装类型 二、RPM软件包管理 1、RPM是什么? 2、rpm一般命名格式 3、RPM安装包从何而来?如何挂载? 4、挂载的注意事项: 5、目的:提供安装包 6、查…

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载(一对多查询案例) 1.什么是延迟加载? 开启延迟加载后,在真正使用数据的时候才发起级联查询,不用的时候不查询。 2.pojo User类: package com.wt.pojo;import java.io.Serializable; …

【华为鸿蒙系统学习】- HarmonyOS4.0之App项目开发|自学篇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

SpringBoot+vue实现评论区分页效果

当评论区含大量数据时&#xff0c;一次性查询速度很慢&#xff0c;所以使用分页&#xff0c;实现分页效果。 前端&#xff1a; <h3>评论</h3><div><div style"font-size:14px;padding:10px;" v-for"r in form.remark"><!-- …

【Matlab in VSCode】在VSCode中编辑MATLAB文件

【Matlab in VSCode】在VSCode中编辑MATLAB文件 1.安装插件 插件&#xff1a;在vscode拓展商店下载 MATLABMatlab in VSCode 其他&#xff1a;Windows环境MATLAB2019bpython3.7.9 2.插件配置 MATLAB插件下载后不用配置。 Matlab in VSCode需要进行相应的配置。 Windows…
最新文章