sysfs接口与用户空间库libgpiod

sysfs接口是Linux内核提供的一种让用户空间程序访问和控制内核对象(包括设备、驱动等)信息的机制,它基于虚拟文件系统,将内核对象信息以文件系统的形式表现出来,用户或程序员可以通过读写这些文件来获取或修改内核对象的属性。对于GPIO(通用输入/输出)操作,早期Linux内核版本提供了基于/sys/class/gpio路径的sysfs接口,用户可以通过读写该目录下的虚拟文件来控制GPIO的方向(输入或输出)、值(高电平或低电平)以及中断触发方式等。

然而,从Linux 4.8版本开始,该GPIO sysfs接口已被标为过时(deprecated),并会在未来的版本中被移除,取而代之的是由chardev接口和用户空间库libgpiod组成的新方式。

尽管sysfs接口在一些情况下仍在使用,但由于其底层实现对用户不透明,易用性较差,且在未来可能被移除,因此通常推荐新项目使用更加现代和稳定的接口如libgpiod库来操作GPIO。

1. sysfs接口:

sysfs是一种在Linux内核中提供文件系统接口的方式,它可以用于控制和监视GPIO引脚。使用sysfs接口可以通过读写特定的文件来操作GPIO引脚。

首先,确保内核配置中已启用sysfs GPIO支持:

CONFIG_GPIO_SYSFS=y

然后,可以通过以下代码示例来控制GPIO引脚的输入输出状态:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>#define GPIO_IN  "/sys/class/gpio/gpioXX/value"
#define GPIO_OUT "/sys/class/gpio/gpioXX/value"int main()
{int fd;char value;// 导出GPIO引脚fd = open("/sys/class/gpio/export", O_WRONLY);write(fd, "XX", 2);  // XX是引脚编号close(fd);// 设置GPIO引脚的方向fd = open("/sys/class/gpio/gpioXX/direction", O_WRONLY);write(fd, "out", 3); // 或者写"in"表示输入close(fd);// 设置GPIO引脚的值fd = open(GPIO_OUT, O_WRONLY);write(fd, "1", 1);close(fd);// 读取GPIO引脚的值fd = open(GPIO_IN, O_RDONLY);read(fd, &value, 1);close(fd);printf("GPIO value: %c\n", value);// 清除GPIO引脚fd = open("/sys/class/gpio/unexport", O_WRONLY);write(fd, "XX", 2);close(fd);return 0;
}

将代码中的XX替换为相应的GPIO引脚编号,即可进行控制。使用sysfs接口的好处是简单易用,但是对于高频率的操作可能会有性能问题。

2. libgpiod库:

libgpiod是一个用户空间用于控制GPIO的库,它提供了灵活的API来直接操作GPIO引脚,而无需依赖sysfs接口。

首先,确保已安装libgpiod库及其头文件。然后使用以下代码示例来控制GPIO引脚:

#include <stdio.h>
#include <gpiod.h>int main()
{struct gpiod_chip *chip;struct gpiod_line *line;int val;// 打开GPIO设备chip = gpiod_chip_open_by_number(0);  // 0是设备编号,根据实际情况修改// 获取GPIO引脚line = gpiod_chip_get_line(chip, X);  // 替换X为引脚编号// 设置GPIO引脚的方向gpiod_line_request_output(line, "gpio-example", GPIOD_LINE_ACTIVE_STATE_HIGH);// 设置GPIO引脚的值gpiod_line_set_value(line, 1);  // 设置为高电平// 读取GPIO引脚的值val = gpiod_line_get_value(line);printf("GPIO value: %d\n", val);// 关闭GPIO设备gpiod_line_release(line);gpiod_chip_close(chip);return 0;
}

将代码中的X替换为相应的GPIO引脚编号,然后使用libgpiod提供的函数来控制GPIO引脚的方向和值。使用libgpiod库的好处是它提供了更灵活和高效的GPIO操作方式,适用于对性能要求较高的应用。

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

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

相关文章

React之diff原理

一、是什么 跟Vue一致&#xff0c;React通过引入Virtual DOM的概念&#xff0c;极大地避免无效的Dom操作&#xff0c;使我们的页面的构建效率提到了极大的提升 而diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处 传统diff算法通过循环递归对节点进行依…

嵌入式中的MCU、ARM、DSP、FPGA

目录 “角色扮演” MCU ARM 特点 DSP 特点 FPGA 特点 应用 “角色扮演” MCU&#xff08;Microcontroller Unit&#xff09;、ARM&#xff08;Advanced RISC Machine&#xff09;、DSP&#xff08;Digital Signal Processor&#xff09;和FPGA&#xff08;Field-Progr…

Python解读市场趋势:LSTM 和 GRU 在预测 Google 股价方面的探索

我将向您展示如何使用 LSTM 和 GRU 预测股票价格。 导入库 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import matplotlib.dates as mdates import plotly.express as pxfrom keras.preprocessing.sequence import Timese…

记低版本okhttp超时会导致死锁

一、问题起源 在处理一次生产环境cpu拉满问题时&#xff0c;把日志拉下来看发现很多http请求调用出错&#xff0c;项目使用的是okhttp 3.8.1版本。 二、问题描述 问题出在okhttp3.Dispatcher.finished(Dispatcher.java:201)代码如下&#xff1a; void finished(AsyncCall c…

PHP 危险函数2-代码执行语句

代码执行语句 eval() 不是函数&#xff0c;不能被动态调用&#xff0c;并且需要以 ;结束 直接输出&#xff0c;不执行 <?php$code"phpinfo();";echo $code;?>eval() 语句执行 <?php$code"phpinfo();";eval($code); // eval 不是函数&am…

vue3中常见的组合式API

一、toRef 和 toRefs 应用&#xff1a;要将响应式对象中的某个属性单独提供给外部使用时。 语法&#xff1a; toRef语法&#xff1a;const name toRef(person, name) toRefs语法&#xff1a;toRefs(person)&#xff0c;如果在return中直接写&#xff0c;需要用...(展开运算符…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码&#xff1a;https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

软件测试之【单元测试、系统测试、集成测试】

一、单元测试的概念 单元测试&#xff08;Unit Testing&#xff09;是对软件基本组成单元进行的测试&#xff0c;如函数&#xff08;function或procedure&#xff09;或一个类的方法&#xff08;method&#xff09;。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff…

Python:实现日历功能

背景 日常生活中&#xff0c;每天都要用到日历&#xff0c;日历成为我们生活中的必需品&#xff0c;那么如何制作日历呢&#xff0c;其实方法有很多&#xff0c;可以直接在excel中制作&#xff0c;也可以手画等等。 学习过编程的朋友&#xff0c;能否想到用Python编写一…

【Pytorch】Pytorch学习笔记02 - 单变量时间序列 LSTM

目录 说明简单神经网络LSTM原理Pytorch LSTM生成数据初始化前向传播方法训练模型自动化模型构建 总结参考文献 说明 这篇文章主要介绍如何使用PyTorch的API构建一个单变量时间序列 LSTM。文章首先介绍了LSTM&#xff0c;解释了它们在时间序列数据中的简单性和有效性。然后&…

Elasticsearch常见错误

一 read_only_allow_delete" : "true" 当我们在向某个索引添加一条数据的时候,可能(极少情况)会碰到下面的报错: {"error": { "root_cause": [ { "type": "cluster_block_exception", "r…

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管

一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台&#xff0c;整合环境相关的数据&#xff0c;对接已建业务系统&#xff0c;将环境相关数据进行统一管理&#xff0c;结合GIS技术进行监测、监控信息的展现和挖掘分析&#xff0c;实现业务数据的快速…

每日一练——快速合并2个有序数组

每日一练来喽~~~ 今天up主为大家分享一个&#xff0c;快速合并2个有序数组的法子&#xff0c;注意听哟&#xff01; 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数…

[Docker]二.Docker 镜像,仓库,容器介绍以及详解

一.Docker 镜像,容器,仓库的简单介绍 通俗来讲:镜像相当于VM虚拟机中的ios文件,容器相当于虚拟机系统,仓库相当于系统中的进程或者执行文件,容器是通过镜像创建的 1.镜像 Docker 镜像就是一个 Linux 的文件系统&#xff08; Root FileSystem &#xff09;&#xff0c;这个文…

万宾科技智能井盖传感器怎么使用?

时代在进步&#xff0c;科技在更新&#xff0c;人们身边的万事万物都在随着时代的脚步不断的前进。各种各样高科技技术在城市基础设施建设的过程中得到应用&#xff0c;很多智能产品不仅施工方便&#xff0c;而且可以向政府部门提供精准的数据&#xff0c;提高了相关管理人员的…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址&#xff1a;https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示&#xff1a; 2.php环境 解释&#xff1a;建议使用phpstudy进行安装&#xff0c;安装较为简单 链接&#xff1a;https://www.xp.cn/ 图示&#xff1a; 二、第…

leetcode系列(双语)002——GO两数相加

文章目录 两数相加 | Add Two Numbers示例个人解答官方解答扩展Algorithm 两数相加 | Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a sing…

yyds,Elasticsearch Template自动化管理新索引创建

一、什么是Elasticsearch Template&#xff1f; Elasticsearch Template是一种将预定义模板应用于新索引的功能。在索引创建时&#xff0c;它可以自动为新索引应用已定义的模板。Template功能可用于定义索引的映射、设置和别名等。它是一种自动化管理索引创建的方式&#xff0…

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)

这篇博客是之前文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;二&a…

SQL实现数据透视效果

一、透视 在SQL中实现类似Excel中数据透视表的效果&#xff0c;需要使用到PiVOT函数 SELECT <non-pivoted column>,[first pivoted column] AS <column name>,[second pivoted column] AS <column name>,... FROM(<SELECT query that produces the data…