Linux系统GPIO应用编程

news/2024/9/17 13:39:09/

目录

  • 应用层如何操控GPIO
  • GPIO 应用编程之输出
  • GPIO 应用编程之输入
  • GPIO 应用编程之中断
  • 在开发板上测试
    • GPIO 输出测试
    • GPIO 输入测试
    • GPIO 中断测试

本章介绍应用层如何控制GPIO,譬如控制GPIO 输出高电平、或输出低电平。

应用层如何操控GPIO

与LED 设备一样,GPIO 同样也是通过sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示:

在这里插入图片描述

可以看到该目录下包含两个文件export、unexport 以及5 个gpiochipX(X 等于0、32、64、96、128)命名的文件夹。

⚫ gpiochipX:当前SoC 所包含的GPIO 控制器,我们知道I.MX6UL/I.MX6ULL 一共包含了5 个GPIO控制器,分别为GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,在这里分别对应gpiochip0、gpiochip32、gpiochip64、gpiochip96、gpiochip128 这5 个文件夹,每一个gpiochipX 文件夹用来管理一组GPIO。随便进入到其中某个目录下,可以看到这些目录下包含了如下文件:

在这里插入图片描述

在这个目录我们主要关注的是base、label、ngpio 这三个属性文件,这三个属性文件均是只读、不可写。
base:与gpiochipX 中的X 相同,表示该控制器所管理的这组GPIO 引脚中最小的编号。每一个GPIO引脚都会有一个对应的编号,Linux 下通过这个编号来操控对应的GPIO 引脚。

在这里插入图片描述

label:该组GPIO 对应的标签,也就是名字。

在这里插入图片描述

ngpio:该控制器所管理的GPIO 引脚的数量(所以引脚编号范围是:base ~ base+ngpio-1)。

在这里插入图片描述

对于给定的一个GPIO 引脚,如何计算它在sysfs 中对应的编号呢?其实非常简单,譬如给定一个GPIO引脚为GPIO4_IO16,那它对应的编号是多少呢?首先我们要确定GPIO4 对应于gpiochip96,该组GPIO 引脚的最小编号是96(对应于GPIO4_IO0),所以GPIO4_IO16 对应的编号自然是96 + 16 = 112;同理
GPIO3_IO20 对应的编号是64 + 20 = 84。

⚫ export:用于将指定编号的GPIO 引脚导出。在使用GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。注意export 文件是只写文件,不能读取,将一个指定的编号写入到export 文件中即可将对应的GPIO 引脚导出,譬如:

echo 0 > export # 导出编号为0 的GPIO 引脚(对于I.MX6UL/I.MX6ULL 来说,也就是
GPIO1_IO0)

在这里插入图片描述

导出成功之后会发现在/sys/class/gpio 目录下生成了一个名为gpio0 的文件夹(gpioX,X 表示对应的编号),如图16.1.7 所示。这个文件夹就是导出来的GPIO 引脚对应的文件夹,用于管理、控制该GPIO 引脚,稍后再给大家介绍。

在这里插入图片描述
⚫ unexport:将导出的GPIO 引脚删除。当使用完GPIO 引脚之后,我们需要将导出的引脚删除,同样该文件也是只写文件、不可读,譬如:

echo 0 > unexport # 删除导出的编号为0 的GPIO 引脚

删除成功之后,之前生成的gpio0 文件夹就会消失!

以上就给大家介绍了/sys/class/gpio 目录下的所有文件和文件夹,控制GPIO 引脚主要是通过export 导出之后所生成的gpioX(X 表示对应的编号)文件夹,在该文件夹目录下存在一些属性文件可用于控制GPIO引脚的输入、输出以及输出的电平状态等。

Tips:需要注意的是,并不是所有GPIO 引脚都可以成功导出,如果对应的GPIO 已经在内核中被使用了,那便无法成功导出,打印如下信息:
在这里插入图片描述

那也就是意味着该引脚已经被内核使用了,譬如某个驱动使用了该引脚,那么将无法导出成功!

gpioX
将指定的编号写入到export 文件中,可以导出指定编号的GPIO 引脚,导出成功之后会在/sys/class/gpio目录下生成对应的gpioX(X 表示GPIO 的编号)文件夹,以前面所生成的gpio0 为例,进入到gpio0 目录,该目录下的文件如下所示:
在这里插入图片描述
我们主要关心的文件是active_low、direction、edge 以及value 这四个属性文件,接下来分别介绍这四个属性文件的作用:

⚫ direction:配置GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看GPIO 当前是输入还是输出模式,写表示将GPIO 配置为输入或输出模式;读取或写入操作可取的值为"out"(输出模式)和"in"(输入模式),如下所示:
在这里插入图片描述
⚫ value:在GPIO 配置为输出模式下,向value 文件写入"0"控制GPIO 引脚输出低电平,写入"1"则控制GPIO 引脚输出高电平。在输入模式下,读取value 文件获取GPIO 引脚当前的输入电平状态。譬如:

# 获取GPIO 引脚的输入电平状态
echo "in" > direction
cat value# 控制GPIO 引脚输出高电平
echo "out" > direction
echo "1" > value

⚫ active_low:这个属性文件用于控制极性,可读可写,默认情况下为0,譬如:

# active_low 等于0
echo "0" > active_low
echo "out" > direction
echo "1" > value 	#输出高
echo "0" > value 	#输出低# active_low 等于1
$ echo "1" > active_low
$ echo "out" > direction
$ echo "1" > value 	#输出低
$ echo "0" > value 	#输出高

由此看出,active_low 的作用已经非常明显了,对于输入模式来说也同样适用。
⚫ edge:控制中断的触发模式,该文件可读可写。在配置GPIO 引脚的中断触发模式之前,需将其设置为输入模式:
非中断引脚:echo “none” > edge
上升沿触发:echo “rising” > edge
下降沿触发:echo “falling” > edge
边沿触发:echo “both” > edge

当引脚被配置为中断后可以使用poll()函数监听引脚的电平状态变化,在后面的示例中将向大家介绍。

GPIO 应用编程之输出

上一小节已经向大家介绍了如何通过sysfs 方式控制开发板上的GPIO 引脚,本小节我们编写一个简单地测试程序,控制开发板上的某一个GPIO 输出高、低不同的电平状态,其示例代码如下所示:

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_out.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");close(fd);return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{/* 校验传参 */if (3 != argc) {fprintf(stderr, "usage: %s <gpio> <value>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int fd;int len;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");close(fd);exit(-1);}close(fd);  //关闭文件}/* 配置为输出模式 */if (gpio_config("direction", "out"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 控制GPIO输出高低电平 */if (gpio_config("value", argv[2]))exit(-1);/* 退出程序 */exit(0);
}

执行程序时需要传入两个参数,argv[1]指定GPIO 的编号、argv[2]指定输出电平状态(0 表示低电平、1 表示高电平)。

上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,也就是判断相应的gpioX目录是否存在,如果不存在则表示未导出,则通过"/sys/class/gpio/export"文件将其导出;导出之后先配置了GPIO 引脚为输出模式,也就是向direction 文件中写入"out";接着再配置极性,通过向active_low 文件中写入"0"(不用配置也可以);最后再控制GPIO 引脚输出相应的电平状态,通过对value 属性文件写入"1"或"0"来使其输出高电平或低电平。

使用交叉编译工具编译应用程序,如下所示:

在这里插入图片描述

GPIO 应用编程之输入

本小节我们编写一个读取GPIO 电平状态的测试程序,其示例代码如下所示:
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_in.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");close(fd);return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{char file_path[100];char val;int fd;/* 校验传参 */if (2 != argc) {fprintf(stderr, "usage: %s <gpio>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int len;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");close(fd);exit(-1);}close(fd);  //关闭文件}/* 配置为输入模式 */if (gpio_config("direction", "in"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 配置为非中断方式 */if (gpio_config("edge", "none"))exit(-1);/* 读取GPIO电平状态 */sprintf(file_path, "%s/%s", gpio_path, "value");if (0 > (fd = open(file_path, O_RDONLY))) {perror("open error");exit(-1);}if (0 > read(fd, &val, 1)) {perror("read error");close(fd);exit(-1);}printf("value: %c\n", val);/* 退出程序 */close(fd);exit(0);
}

执行程序时需要传入一个参数,argv[1]指定要读取电平状态的GPIO 对应的编号。
上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,若未导出,则通过
“/sys/class/gpio/export"文件将其导出;导出之后先配置了GPIO 引脚为输入模式,也就是向direction 文件中写入"in”;接着再配置极性、设置GPIO 引脚为非中断模式(向edge 属性文件中写入"none")。
最后打开value 属性文件,读取GPIO 的电平状态并将其打印出来。
使用交叉编译工具编译应用程序,如下所示:
在这里插入图片描述

GPIO 应用编程之中断

在应用层可以将GPIO 配置为中断触发模式,譬如将GPIO 配置为上升沿触发、下降沿触发或者边沿触发,本小节我们来编写一个测试程序,将GPIO 配置为边沿触发模式并监测中断触发状态。其示例代码如下所示:
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_intr.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{struct pollfd pfd;char file_path[100];int ret;char val;/* 校验传参 */if (2 != argc) {fprintf(stderr, "usage: %s <gpio>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int len;int fd;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");exit(-1);}close(fd);  //关闭文件}/* 配置为输入模式 */if (gpio_config("direction", "in"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 配置中断触发方式: 上升沿和下降沿 */if (gpio_config("edge", "both"))exit(-1);/* 打开value属性文件 */sprintf(file_path, "%s/%s", gpio_path, "value");if (0 > (pfd.fd = open(file_path, O_RDONLY))) {perror("open error");exit(-1);}/* 调用poll */pfd.events = POLLPRI; //只关心高优先级数据可读(中断)read(pfd.fd, &val, 1);//先读取一次清除状态for ( ; ; ) {ret = poll(&pfd, 1, -1);    //调用pollif (0 > ret) {perror("poll error");exit(-1);}else if (0 == ret) {fprintf(stderr, "poll timeout.\n");continue;}/* 校验高优先级数据是否可读 */if(pfd.revents & POLLPRI) {if (0 > lseek(pfd.fd, 0, SEEK_SET)) {//将读位置移动到头部perror("lseek error");exit(-1);}if (0 > read(pfd.fd, &val, 1)) {perror("read error");exit(-1);}printf("GPIO中断触发<value=%c>\n", val);}}/* 退出程序 */exit(0);
}

执行程序时需要传入一个参数,argv[1]指定要读取电平状态的GPIO 对应的编号。
上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,若未导出,则通过
"/sys/class/gpio/export"文件将其导出。
对GPIO 进行配置:配置为输入模式、配置极性、将触发方式配置为边沿触发。
打开value 属性文件,获取到文件描述符,接着使用poll()函数对value 的文件描述符进行监视,这里为什么要使用poll()监视、而不是直接对文件描述符进行读取操作?这里简单的描述一下。
13.2.3 小节给大家详细介绍了poll()函数,这里不再重述!poll()函数可以监视一个或多个文件描述符上的I/O 状态变化,譬如POLLIN、POLLOUT、POLLERR、POLLPRI 等,其中POLLIN 和POLLOUT 表示普通优先级数据可读、可写,而POLLPRI 表示有高优先级数据可读取,中断就是一种高优先级事件,当中断触发时表示有高优先级数据可被读取。当然,除此之外还可使用13.4 小节所介绍的异步I/O 方式来监视
GPIO 中断触发。
使用交叉编译工具编译应用程序,如下所示:
在这里插入图片描述

在开发板上测试

前面我们编写了3 个测试程序,并编译得到了对应的可执行文件,本小节一个一个进行测试。在测试之前,选择一个测试引脚,这里笔者以板子上的GPIO1_IO01 引脚为例,该引脚在底板上已经引出,如下所示:
在这里插入图片描述
Mini 开发板可以通过背面丝印标注的名称或原理图进行确认。

GPIO 输出测试

将示例代码16.2.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序控制开发板上的GPIO1_IO01 引脚输出高或低电平:

./testApp 1 1 		#控制GPIO1_IO01 输出高电平
./testApp 1 0 		#控制GPIO1_IO01 输出低电平

在这里插入图片描述
执行相应的命令后,可以使用万用表或者连接一个LED 小灯进行检验,以验证实验结果!

GPIO 输入测试

将示例代码16.3.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序以读取GPIO1_IO01 引脚此时的电平状态,是高电平还是低电平?
首先通过杜邦线将GPIO1_IO01 引脚连接到板子上的3.3V 电源引脚上,接着执行命令读取GPIO 电平状态:
在这里插入图片描述
打印出的value 等于1,表示读取到GPIO 的电平确实是高电平;接着将GPIO1_IO01 引脚连接到板子上的GND 引脚上,执行命令:
在这里插入图片描述
打印出的value 等于0,表示读取到GPIO 的电平确实是低电平;测试结果与实际相符合!

GPIO 中断测试

将示例代码16.4.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序可以监测GPIO 的中断触发。
执行应用程序监测GPIO1_IO01 引脚的中断触发情况,如下所示:

./testApp 1 	# 监测GPIO1_IO01 引脚中断触发

在这里插入图片描述
当执行命令之后,我们可以使用杜邦线将GPIO1_IO01 引脚连接到GND 或3.3V 电源引脚上,来回切换,使得GPIO1_IO01 引脚的电平状态发生由高到低或由低到高的状态变化,以验证GPIO 中断的边沿触发情况;当发生中断时,终端将会打印相应的信息,如上图所示。

Tips:测试完成后按Ctrl+C 退出程序!


http://www.ppmy.cn/news/30028.html

相关文章

Git标签与版本发布

1. 什么是git标签 标签&#xff0c;就类似我们阅读时的书签&#xff0c;可以很轻易找到自己阅读到了哪里。 对于git来说&#xff0c;在使用git对项目进行版本管理的时候&#xff0c;当我们的项目开发到一定的阶段&#xff0c;需要发布一个版本。这时&#xff0c;我们就可以对…

《C++ Primer Plus》第18章:探讨 C++ 新标准(9)

编程练习 下面是一个简短程序的一部分&#xff1a; int main() {using namespace std;// list of double deduced from list contentsauto q average_list ({15.4, 10.7, 9.0});cout << q << endl;// list of int deduced from list contentscout << averag…

SQL中字符串截取函数 SUBSTRING

1、left&#xff08;name,4&#xff09;截取左边的4个字符 列&#xff1a; SELECT LEFT(201809,4) 年 结果&#xff1a;2018 2、right&#xff08;name,2&#xff09;截取右边的2个字符 SELECT RIGHT(201809,2) 月份 结果&#xff1a;09 3、SUBSTRING(name,5,3) 截取nam…

初识数据结构——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰进入一个全新的内容的学习&#xff0c;就是算法和数据结构啦&#xff0c;话不多说&#xff0c;让我们进入数据结构的世界吧 什么是数据结构&#xff1f; 什么是算法&#xff1f; 数据结构和算法的重要性 如何学好数据结构和算…

【python中的列表和元组】

文章目录前言一、列表及其使用1.列表的特点2. 列表的使用方法二、元组及其特点1.元组的类型是tuple1.元组的查找操作2. 计算元组某个元素出现的次数3.统计元组内元素的个数总结前言 本文着重介绍python中的列表和元组以及列表和元组之间的区别 一、列表及其使用 1.列表的特点…

重构·改善既有代码的设计.01

前言近期在看Martin Fowler著作的《重构.改善既有代码的设计》这本书&#xff0c;这是一本经典著作。书本封面誉为软件开发的不朽经典。书中从一个简单的案例揭示了重构的过程以及最佳实践。同时给出了重构原则&#xff0c;何时重构&#xff0c;以及重构的手法。用来改善既有代…

【微信小程序】-- 案例 - 本地生活(二十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【springcloud 微服务】Spring Cloud Alibaba 整合Nacos实战

目录 一、前言 二、常用服务注册中心介绍 2.1 dubbo服务注册示意图 2.2 常用注册中心对比 三、nacos介绍 3.1 什么是nacos 3.2 nacos 特点 3.3 nacos生态链地图 四、nacos部署 4.1 下载安装包 4.2 修改脚本启动模式 4.3 启动nacos 服务 五、Spring Cloud Alibaba…

刷题记录:CF1285D Dr. Evil Underscores 区间异或使序列最大值最小

传送门:CF 题目描述: 有一个长度为 n(1≤n≤105)n\ (1\leq n\leq 10^5)n (1≤n≤105) 的整数序列 a1,⋯,an(0≤ai≤230−1)a_1,\cdots,a_n\ \ (0\leq a_i\leq 2^{30}-1)a1​,⋯,an​ (0≤ai​≤230−1)&#xff0c;你需要找到一个非负整数 XXX 使得 max⁡(ai⊕X)\max(a_i\op…

【python】JSON数据类型与Python数据类型之间的转化

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录JSON格式文件JSON格式序列化与反序列化作用JSON常用数据结构键值对的集合值的有序列表JSON数据类型与Python数据类型之间的转化JSON格式和python的区别读写json文件dump 把python 写到json文件load 把json写…

C语言刷题(4)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容又到了我们的复习啦&#xff0c;那么还是刷题噢&#xff0c;话不多说&#xff0c;让我们进入C语言的世界吧 BC55 简单计算器 BC56 线段图案 BC57 正方形图案 BC58 直角三角形图案 BC59 翻转直角三角形图案 BC60 带空格…

蚁群算法优化问题

%%%%%%%%%%%%蚁群算法解决 TSP 问题%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 m 50; %蚂蚁个数 Alpha 1; %信息素重要程度参数 Beta 5; %启发式因子重要程度参数 Rho 0.1; %信息素蒸发系数 G 20…

嵌入式学习笔记——STM32硬件基础知识

STM32开发硬件知识前言STM32最小系统电源电路晶振电路复位电路BOOT选择电路调试接口电路其他电路本文重点本文参考博客链接前言 上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程&#xff0c;这都是解决的电脑端的开发环境问题&#xff0c;还没有到实际的开…

【C++初阶】list的使用

大家好我是沐曦希&#x1f495; 文章目录一、前言二、构造三、迭代器四、增删查改1.头插头删2.尾插尾删3.查找和插入4.删除五、其他成员函数1.排序和去重2.splice和remove3.resize一、前言 list本质是带头双向循环链表&#xff0c;本文只对list的一些常用接口进行说明&#xf…

用逻辑回归制作评分卡

目录 一.评分卡 二.导库&#xff0c;获取数据 三.探索数据与数据预处理 1.去除重复值 2.填补缺失值 3.描述性统计处理异常值 4.为什么不统一量纲&#xff0c;也不标准化数据分布 5.样本不均衡问题 6.分训练集和测试集 三.分箱 1.分多少个箱子才合适 2.分箱要达成什么…

真香,Grafana开源Loki日志系统取代ELK?

一、Loki是什么&#xff1f; Loki是由Grafana Labs开源的一个水平可扩展、高可用性&#xff0c;多租户的日志聚合系统的日志聚合系统。它的设计初衷是为了解决在大规模分布式系统中&#xff0c;处理海量日志的问题。Loki采用了分布式的架构&#xff0c;并且与Prometheus、Graf…

51单片机入门————数码管显示

我们在马路上看到的红绿灯&#xff0c;就是由数码管来实现的&#xff0c;就是其中可能加入了一些延时和转换数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示电路原理图我们先讨论一个数码管数码管有共阳极和共阴极&#xff0c;我们现在使用的STC89C52是共阴…

Linux用户空间与内核空间通信(Netlink通信机制)

一&#xff0c;什么是Netlink通信机制 Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信&#xff0c;但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式&#xff0c;一般不用Netlink。除非需要…

Cadence Allegro 导出Bill of Material Report (Condensed)详解

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,Bill of Material Report (Condensed)作用3,Bill of Material Report (Condensed)示例4,Bill of Material Report (Condensed)导出方法4.1,方法14.2,方法2,

第十三届蓝桥杯

这里写目录标题一、刷题统计&#xff08;ceil函数返回的是等值于某最小整数的浮点值&#xff0c;不强制转换回int就wa&#xff0c;没错就连和int整数相加都wa二、修剪灌木&#xff08;主要应看清楚会调转方向三、统计子矩阵&#xff08;前缀和滑动窗口⭐&#xff09;四、[积木画…