【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 配置篇 -- 初识GPIO --(六)

请添加图片描述

  • 💌 所属专栏:【BES2500x系列】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

  • 前言
  • 1 基本概念
      • 1.1 GPIO基础
  • 2 GPIO在RTOS中的管理
      • 2.1 初始化
      • 2.2 任务调度
      • 2.3 互斥锁
      • 2.4 原子操作
      • 2.5 中断服务例程(ISR)
      • 2.6 优先级继承
  • 3 初始化
      • 3.1 初始化GPIO
  • 4 GPIO中断处理
  • 5 结合RTOS
  • 总结


前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【BES2500x系列】专栏的第6篇文章;
  今天开始学习BES2500x系列的一天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【BES2500x系列】, 此专栏是我是夜阑的狗对BES2500x系列开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


<<【系列文章索引】>>

1 基本概念

  在嵌入式系统设计中,通用输入输出(GPIO)接口是连接微控制器与外部世界的桥梁,扮演着至关重要的角色。GPIO是嵌入式系统中最常用的外设之一,用于与外部世界进行数字信号交互。从简单的LED控制到复杂的传感器数据采集,GPIO的应用无处不在。然而,在实时操作系统(RTOS)环境下,对GPIO的高效、安全管理变得尤为重要,尤其是在多任务并发执行的场景下。本文将深入探讨RTOS中GPIO的管理策略,以及如何确保其操作的实时性和一致性。

请添加图片描述

1.1 GPIO基础

  GPIO,即 General Purpose Input/Output,是微控制器上可编程的引脚,能够配置为输入或输出模式,用于数字信号的接收和发送。每个GPIO引脚都具有独立的配置寄存器,用于设定其功能,如输入/输出方向、上下拉电阻、中断触发方式等。

2 GPIO在RTOS中的管理

2.1 初始化

  在RTOS启动时,GPIO引脚需要初始化,包括设置方向(输入或输出)、初始状态、中断配置(如果需要)等。

2.2 任务调度

  RTOS的任务调度机制确保了在任何给定时刻只有一个任务正在执行。但是,当任务切换时,对GPIO的访问可能会受到干扰,特别是在硬实时系统中。

2.3 互斥锁

    当多个任务需要访问相同的GPIO资源时,可以使用互斥锁(mutexes)来确保一次只有一个任务可以访问。这避免了数据竞争和不一致的状态。

2.4 原子操作

  对于简单的GPIO操作,如读取状态或更改输出,可以使用原子操作来确保操作不会被中断。这通常涉及到禁用全局中断或使用特殊的原子指令。

2.5 中断服务例程(ISR)

  GPIO中断可以触发中断服务例程(ISR),这些ISR需要快速响应,以处理紧急事件。在ISR中,通常会更新共享变量,然后可能发送信号给等待的RTOS任务。为了保证ISR的效率,应尽量减少ISR中的复杂逻辑,将非实时部分的工作推迟到任务级处理。

2.6 优先级继承

  在RTOS中,优先级继承是一种机制,允许低优先级任务暂时提升其优先级,以避免被高优先级任务抢占,直到完成关键操作。这对于处理GPIO中断特别有用,确保了中断处理的及时性和完整性。

3 初始化

3.1 初始化GPIO

  在RTX中,初始化GPIO的步骤与非RTOS环境类似,但需要确保中断服务例程的正确配置。以下是一个基本流程:

  • 代码
#include "hal_gpio.h"

void init_gpio(int pin, GPIO_Mode mode, GPIO_Pull pull, GPIO_Speed speed)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    // 配置GPIO参数
    GPIO_InitStruct.Pin = pin;
    GPIO_InitStruct.Mode = mode;
    GPIO_InitStruct.Pull = pull;
    GPIO_InitStruct.Speed = speed;

    // 初始化GPIO
    HAL_GPIO_Init(pin, &GPIO_InitStruct);
}
  • 参数/函数讲解
序号参数/函数说明
1HAL_GPIO_InitGPIO初始化接口

4 GPIO中断处理

  在RTX中,我们需要注册中断服务例程,并在需要时启用或禁用中断。gpio_bank[bank]->GPIO_INTEN_CLR 语句用于清除 GPIO 中断。

  • 代码
// 假设bank和pin_offset对应于GPIO的特定引脚
void gpio_isr_handler(uint32_t bank, uint32_t pin_offset)
{
    // 处理中断逻辑
}

// 注册中断服务例程
void init_gpio_isr(int pin)
{
    NVIC_InitTypeDef NVIC_InitStruct;
    
    // 配置NVIC
    NVIC_InitStruct.NVIC_IRQChannel = GPIO_IRQn; // 请根据实际中断通道设置
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    // 使能中断
    gpio_bank[bank]->GPIO_INTEN_SET = (0x1 << pin_offset);
}

// 清除中断
void clear_gpio_isr(int pin)
{
    gpio_bank[bank]->GPIO_INTEN_CLR = (0x1 << pin_offset);
}

  gpio_bank[bank]->GPIO_INTEN_CLR = (0x1 << pin_offset) 这行代码的作用是清除GPIO的中断使能位。这里的 bank 和 pin_offset 根据硬件平台和GPIO库的具体实现来确定,0x1 << pin_offset 生成一个掩码,用于清除对应引脚的中断标志。

  • 参数/函数讲解
序号参数/函数说明
1NVIC_Init配置中断服务

5 结合RTOS

  在RTOS环境中,我们通常会在中断服务例程中设置一个标志,然后在任务中处理这个标志。这样可以避免在中断服务例程中执行耗时的操作,保证RTOS的实时性。

  • 代码
SemaphoreHandle_t gpio_evt_semaphore = NULL;

// 创建信号量
gpio_evt_semaphore = xSemaphoreCreateBinary();

// 中断服务例程
void gpio_isr_handler(uint32_t bank, uint32_t pin_offset)
{
    // 设置事件标志
    xSemaphoreGiveFromISR(gpio_evt_semaphore, NULL);
}

// 任务处理中断
void gpio_task(void *pvParameters)
{
    for (;;) {
        if (xSemaphoreTake(gpio_evt_semaphore, portMAX_DELAY)) {
            // 处理GPIO事件
        }
    }
}

  在 RTX 环境下,初始化 GPIO 并使用中断服务例程需要考虑RTOS的特性。gpio_bank[bank]->GPIO_INTEN_CLR 语句是清除GPIO中断的关键步骤,确保中断服务例程不会被不必要的中断触发。通过结合RTOS的任务和中断服务例程,我们可以有效地管理 GPIO 事件,同时保持系统的实时性和稳定性。

  • 参数/函数讲解
序号参数/函数说明
1xSemaphoreGiveFromISR设置事件标志
2xSemaphoreTake处理GPIO事件

<<【系列文章索引】>>

请添加图片描述


总结

  感谢观看,这里就是 配置篇 – 初识GPIO 的讲解,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】

  • 🥇 【恒玄BES】

  • 🌼 【鸿蒙系统】

  • 💎 【蓝牙协议栈】

  • 🎃 【死机分析】

  • 👑 【Python脚本笔记】

  • 🚝 【Java Web项目构建过程】

  • 💛 【微信小程序开发教程】

  • 【JavaScript随手笔记】

  • 🤩 【大数据学习笔记(华为云)】

  • 🦄 【程序错误解决方法(建议收藏)】

  • 🔐 【Git 学习笔记】

  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

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

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

相关文章

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

pytorch 是如何调用 cusolver API 的调用

0&#xff0c;环境 ubuntu 22.04 pytorch 2.3.1 x86 RTX 3080 cuda 12.2 1, 示例代码 以potrs为例&#xff1b; hello_cholesk.py """ hello_cholesky.py step1, Cholesky decompose; step2, inverse A; step3, Cholesky again; python3 hello_cholesky.py -…

Hi3861 OpenHarmony嵌入式应用入门--华为 IoTDA 设备接入

华为云物联网平台&#xff08;IoT 设备接入云服务&#xff09;提供海量设备的接入和管理能力&#xff0c;可以将自己的 IoT 设备 联接到华为云&#xff0c;支撑设备数据采集上云和云端下发命令给设备进行远程控制&#xff0c;配合华为云物联网平台的服 务实现设备与设备之间的控…

【区块链农场】:农场游戏+游戏

我的酒坊是一款非常受玩家欢迎的经营手游,游戏中你需要合理经营一家酒厂,将其做大做强。通过制定合理的战略,例如新建厂房,并采用传统工艺制作,针对不同的人群研制多重口味。

配置sublime的中的C++编译器(.sublime-build),实现C++20在sublime中的使用,小白教程

一&#xff0c;前期准备 首先我们需要准备一下 C 环境&#xff0c;当然如果你觉得你当前的C环境配置好了&#xff0c;并且C的版本也能完成您日常的使用需求&#xff0c;您可以使用下面两条命令对C的版本进行查询 g -vg --version通过返回的版本简单的判断是否能解决您的需求&…

[Godot3.3.3] - 过渡动画

过渡动画 ScreenTransitionAnimation 项目结构 添加场景&#xff0c;根节点为 CanvasLayer2D 并重命名为 ScreenTransition: 添加子节点 ColorRect 和 AnimationPlayer&#xff0c;在 ColorRect 中将颜色(Color)设置为黑色&#xff1a; 找到 Material&#xff0c;新建 Shader…

【Element-UI 表格表头、内容合并单元格】

一、实现效果&#xff1a; &#x1f970; 表头合并行、合并列 &#x1f970; &#x1f970; 表格内容行、合并列 &#x1f970; thead和tbody分别有单独的合并方法 二、关键代码&#xff1a; <el-table size"mini" class"table-th-F4F6FB" align&qu…

初识c++(类与对象——上)

一、类的定义 1、类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省 略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或 者成员函…

【C++初阶】类和对象(上)

【C初阶】类和对象&#xff08;上&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 面向过程和面向对象初步认识 2. 类的引入 3. 类的定义 4. 类的访问限定符及封…

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10&#xff08;x64&#xff09;&#xff0c;Python 3.8&#xff08;x64&#xff09;&#xff0c;PyCharm Community Edition 2020.3.2&#xff08;x64&#xff09; 三、实验内容 现有列表hight…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示&#xff1a;如何做混合场景的脚本&#xff1f; 用211的业务比例 ①启动数据库服务 数据库服务&#xff1a;包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

python作业二

# 二进制转化为十进制 num input("num:")def binaryToDecimal(binaryString):he 0length len(binaryString)for i in range(length):he int(binaryString[i]) * 2 ** (length - i - 1)return heprint(binaryToDecimal(num))代码运行如下&#xff1a; import math…

基于YOLOV8的数粒机-农业应用辣椒种子计数计重双标质量解决方案

一:辣椒种子行业背景调查 中国辣椒年产量稳居世界第一,食辣人口超5亿。中国辣椒全球闻名,小辣椒长成大产业,带动全球食品行业腾飞。 在中国,“辣”是不少地方餐桌上的一大特色。从四川的麻辣火锅到湖南的剁椒鱼头再到陕西的油泼辣子面,由南到北,总有食客对辣有着独一份偏…

【RHCE】系统服务综合实验

一、实验内容 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02…

牛顿力学和拉格朗日力学求解atwood machine问题对比

一个半径为 R R R、转动惯量为 I I I 的圆盘。绳子与圆盘无滑动&#xff0c;质量 m 2 m_2 m2​ 的物体在重力 g g g 作用下下坠&#xff0c;带动质量 m 1 m_1 m1​ 的物体上升。求 m 1 m_1 m1​和 m 2 m_2 m2​ 的加速度 a a a。 牛顿力学方法 对质量 m 1 m_1 m1​ 和 …

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…

【趣味数学】求阴影部分面积

题 解法1: 中位线法 既然是中点&#xff0c;就可以用起来&#xff0c;横着不行&#xff0c;竖着来&#xff0c;扩展做辅助线 E是中点S&#xff08;AED) 1/4 S(ABCD) 6 做图中辅助延长线&#xff0c;因为E中点&#xff0c;所以S&#xff08;MEB&#xff09;S(AED) 6 同理E也是…

css预编译器--sass

Sass Sass 提供了 变量&#xff08;variables&#xff09;、嵌套规则&#xff08;nested rules&#xff09;、 混合&#xff08;mixins&#xff09;、 函数&#xff08;functions&#xff09;&#xff0c;目前我使用最多的还是变量和嵌套规则&#xff0c;貌似目前css也支持嵌套…