FreeRTOS - 二值信号量

news2024/11/16 19:31:20

一.信号量定义

信号量(semaphore),多任务环境下使用的一种设施,负责协调多个任务,以保证任务能够正确,合理的使用公共资源。

二.二值信号量应用函数

函数原型

#include “FreeRTOS.h”

#include “semphr.h”

SemaphoreHandle_t xSemaphoreCreateBinary( void );

功能概述

创建二值信号量,并返回信号量句柄。

创建完成后,信号量状态为空。

参数

None

返回值

NULL:堆空间不足

Any other value :信号量句柄

注意事项

configSUPPORT_DYNAMIC_ALLOCATION必须置为1

函数原型

#include “FreeRTOS.h”

#include “semphr.h”

BaseType_t xSemaphoreGive( SemaphoreHandle_t ① xSemaphore );

功能概述

任务间释放信号量

参数

①:信号量句柄

返回值

pdPASS:信号量释放成功

pdFAIL: 此信号量,拥有者不是任务,任务需获取到信号量,才可以释放信号

注意事项

None

函数原型

#include “FreeRTOS.h”

#include “semphr.h”

BaseType_t xSemaphoreGiveFromISR( ①SemaphoreHandle_t xSemaphore,

②BaseType_t *pxHigherPriorityTaskWoken );

功能概述

中断,任务间释放信号量

参数

①:信号量句柄

②:表示在释放信号量成功后,是否进行上下文切换,保证高优先级任务立刻执行,FreeRTOS V7.3.0以后变为可选参数,直接设置为NULL

返回值

pdTRUE:信号量释放成功

errQUEUE_FULL:信号量已经可用

注意事项

None

函数原型

#include “FreeRTOS.h”

#include “semphr.h”

BaseType_t xSemaphoreTake( ①SemaphoreHandle_t xSemaphore,

②TickType_t xTicksToWait );

功能概述

任务间获取信号量

参数

①:信号量句柄

②:如果信号量不是立即可用,任务则进入阻塞状态,传入的等待多少个tick值,传入portMAX_DELAY任务将无限期等待中

返回值

pdPASS:信号量获取成功

pdFAIL:信号量获取失败

注意事项

只能在执行的任务中调用

函数原型

#include “FreeRTOS.h”

#include “semphr.h”

BaseType_t xSemaphoreTakeFromISR( ①SemaphoreHandle_t xSemaphore,

②signed BaseType_t *pxHigherPriorityTaskWoken );

功能概述

中断中获取信号量

参数

①:信号量句柄

②:表示在获取信号量成功后,是否进行上下文切换,保证高优先级任务立刻执行,FreeRTOS V7.3.0以后变为可选参数,直接设置为NULL

返回值

pdPASS:信号量获取成功

pdFAIL:信号量获取失败

注意事项

只能在中断中调用,没有阻塞功能

三.任务

3.1CubeMX生成二值信号量

在FreeRTOS中找到Times and Semaphore

在Binary Semaphores中添加

四.代码实现

  • gpio.c

中断回调函数在gpio中实现

extern osSemaphoreId CPUPrintfBinarySemHandle;
//按键检测回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
     if(Key1_Pin == GPIO_Pin)                                                 //判断按下的GPIO
     {
        if ( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET)              //按下按键,导通
         {
//            HAL_Delay(10);                                                  //软件去抖动  
            if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET)
            {
//               HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_RESET);
//               HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_SET);
                 /*建立标志位*/
                 keyStatus = Key_down;
                 printf("按键已按下/r/n");
                 xSemaphoreGiveFromISR(CPUPrintfBinarySemHandle,NULL);
            }
         }
         else
         {
            if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET)             // 高电平,未准备好      
            {   
//              HAL_Delay(10);                                               //软件去抖动  
                if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET)
                {                
           
//                    HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_SET);      //关闭红灯
//                    HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_RESET);  //开启绿灯
                    /*建立标志位*/
                    keyStatus = Key_up;
                    printf("按键已抬起/r/n");
                }
            }
         }
     }
}
  • FreeRTOS.c

void Key_Task(void const * argument)
{
  /* USER CODE BEGIN Key_Task */
    keyStatus = Key_reset;
  /* Infinite loop */
    for(;;)
    {
    if(xSemaphoreTake(CPUPrintfBinarySemHandle,portMAX_DELAY) == pdPASS)
    {
        //挂起LED任务
        memset(u8TaskListBuff,0,400);
        vTaskGetRunTimeStats((char*)u8TaskListBuff);
        printf("Name      Abs Time        Time\r\n");
        printf("******************************************************\r\n");
        printf("%s",u8TaskListBuff);
        printf("******************************************************\r\n");
        keyStatus = Key_reset;
    }
  }
  /* USER CODE END Key_Task */
}
  • vTaskGetRunTimeStats

vTaskGetRunTimeStats() 来协助分析操作系统当前 task CPU 占用状态,以帮助优化 task 优先级

函数原型为:

voidvTaskGetRunTimeStats( char *pcWriteBuffer )

CubeMX配置

等待信号量到,才开始执行任务。提高CPU占有利用率

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

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

相关文章

我国纯电动汽车行业开始从“政策导向”向“消费导向”转变 未来机遇挑战并存

1、纯电动汽车概念及其优缺点情况 新能源汽车以能源供给方式主要可以分为纯电动汽车、混合动力汽车以及燃料电池汽车。其中,纯电动汽车则是指完全由可充电电池(如铅酸电池、镍镉电池、镍氢电池或锂离子电池)提供动力源,用电机驱动…

华纳云:Pycharm无法正常安装第三方库怎么解决?

这篇文章主要介绍“Pycharm无法正常安装第三方库怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Pycharm无法正常安装第三方库怎么解决”文章能帮助大家解决问题。 1.首先检查自…

MongoDB常用语句(CURD)

文章目录 一、数据库操作二、集合操作三、文档操作3.1 插入文档3.2 查询文档3.3 更新文档3.4 删除文档 四、安全认证4.1 创建管理员账号4.2 创建应用数据库用户4.3 启动和连接 (校验方式) 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一…

【达摩院OpenVI】视频目标渐进式Transformer跟踪器ProContEXT

论文&代码 论文链接:[arxiv]代码&应用: 开源代码:[github code]开源应用:[modelscope] 背景介绍 视频目标跟踪(Video Object Tracking, VOT)任务以一段视频和第一帧中待跟踪目标的位置信息&…

为什么使用了索引,查询还是慢?

🏆今日学习目标: 🍀为什么使用了索引,查询还是慢? ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&…

一、适配各大数据库之前言

一、适配各大数据库之前言 简介 本系列主要记录基于【用户权限服务】(一个SpringBoot服务的名称,不重要,只要是web项目都可以,为了方便描述,以下就简称 “用户中心”),适配各大数据库的过程,其中包括SQL Server、Oracle、PostgreSql、达梦、金仓、MYSQL等等,其次还记…

Docker容器---docker-compose

docker容器---compose容器集群的快速编排 一、Docker-compose简介二、yml文件格式及编写注意事项1、yml文件格式2、yml文件格式注意事项 三、编写docker-compose( nginxtomcat 实例)1、dockerfile撰写 nginx 镜像2、dockerfile撰写 tomcat 镜像3、将所需…

基于html+css的图片展示32

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

java 7大设计原则

一、设计模式七大原则 设计模式的目的 代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)可靠…

关于今年五一调休。。

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作JdbcTemplate实现批量增删改操作

Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作/JdbcTemplate实现批量增删改操作 一、JdbcTemplate概述 什么是 JdbcTemplate? JdbcTemplate是Spring 框架对 JDBC 进行的封装,使用它可以更方便实现对数据库的操作。 二…

Redis序列化设置以及jetcache连接Redis序列化的设置

1、问题 问题:我在使用jetchche进行连接redis的时候,存入redis的value一直使用的是redis默认的序列化方式,是使用的jdk序列化。当我使用jetcache向redis存入一个对象 存入redis的结果: 这是使用jdk序列化的结果。 但是我记得使用redis的时候…

密码学期末复习(按考点整理,超详细!!!)

复习目录) 题型第一章密码算法的安全性分类密码分析的难易程度凯撒密码加密原理古典密码中仿射变换的解密变换 第二章流密码的组成和特点流密码的基本思想 第三章分组密码的CBC工作模式,以及该模式的加密示意图AES中字节求逆雪崩效应分组密码的安全设计原…

让HR眼前一亮:30个APP项目软件测试经验,点燃你的简历

在求职过程中,我们都希望自己的简历能够吸引面试官的眼球,从而获得更多的面试机会。作为一名软件测试人员,丰富的实战经验是让自己脱颖而出的关键之一。 在我多年从事APP项目软件测试的工作中,我积累了大量的实践经验&#xff0c…

Java 之 String、StringBuffer与StringBuilder 区别

String String 是被 final 修饰的类,不能被继承;String实现了 Serializable 和Comparable接口,表示String支持序列化和可以比较大小;String底层是通过char类型的数据实现的,并且被final修饰,所以字符串的值…

大数据5--spark

1.Spark 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 Spark 是什么 Spark 最早源于一篇论文 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing, 该论文是由加州大学柏克莱…

vue3中其他的变化

1.全局API的转移 Vue 2.x 有许多全局 API 和配置。 - 例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count">Clicked {{ count }} times.</button> …

微信小程序+wx.connectSocket客服问答

项目需求&#xff0c;记录一下&#xff1a; 1.要求websocket实时返回会话结果 我项目这边是后端一次返回一个字&#xff0c;–finish–结束&#xff0c;所以实现方法是每获取到数据时就setData一次&#xff0c;直到获取到的数据为finish&#xff0c;停止setData 后端返回结果…

Banana Pi BPI-Centi-S3 使用MicroPython编程显示JPG图片

BPI-Centi-S3是我们新推出的一款板载1.9英寸彩屏的小尺寸ESP32-S3开发板&#xff01; BPI-Centi-S3 banana-pi wiki BPI-Centi-S3 bpi-steam wiki 1 关键特性 ESP32-S3&#xff0c;Xtensa 32 bit LX72M PSRAM , 8M FLASH2.4G WIFI &#xff0c;Bluetooth 5 &#xff0c;Blue…

Windows下安装使用Kafka(使用Kafka内置的ZooKeeper)

Windows下安装使用Kafka(使用Kafka内置的ZooKeeper) Kafka2.8版本才开始自带了Zookeeper&#xff0c;所以注意下版本 kafka官网&#xff1a;https://kafka.apache.org kafka配置快速入门&#xff1a;https://kafka.apache.org/quickstart kafka下载页面&#xff1a;https:/…