当前位置: 首页 > news >正文

Linux驱动开发—设备树分析:GPIO,中断,时钟信息,CPU信息

书接上回:Linux驱动开发—设备树基本概念,语法详解-CSDN博客

文章目录

    • 使用设备树描述中断
    • 使用设备树描述CPU节点
      • CPU 节点
      • 缓存节点
      • 总结
    • 使用设备树描述时钟
      • 总结
    • 使用设备树描述GPIO
      • 示例设备树节点
      • 逐行解析
      • GPIO 单元

使用设备树描述中断

在NXP 官方中截取部分设备树源码分析为例。

gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio\0fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <0x02>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <0x02>;linux,phandle = <0xea>;phandle = <0xea>;
};

分析中断信息,主要关注以下几种字段;

interrupts: 定义与此GPIO控制器相关的中断属性。

  • 0x00: 中断类型。
  • 0x8a: 中断号。
  • 0x04: 中断触发类型,通常表示上升沿触发。

interrupt-controller: 表示这是一个中断控制器节点。interrupt-controller 属性是一个布尔属性,用于标识该节点是一个中断控制器。它不需要赋值,只要在节点中声明即可。操作系统在解析设备树时,会识别该节点为一个中断控制器,从而应用相应的处理逻辑。

#interrupt-cells: 定义中断描述的单元数量,这里为2。在设备树中,每个中断源都需要一个描述,用于向操作系统传达如何配置和处理该中断源。

中断也可能是多级引用—中断控制器的级联,如下源码所示

	interrupt-controller@51a00000 {compatible = "arm,gic-v3";reg = <0x00 0x51a00000 0x00 0x10000 0x00 0x51b00000 0x00 0xc0000 0x00 0x52000000 0x00 0x2000 0x00 0x52010000 0x00 0x1000 0x00 0x52020000 0x00 0x20000>;#interrupt-cells = <0x03>;interrupt-controller;interrupts = <0x01 0x09 0x3f04>;interrupt-parent = <0x01>;linux,phandle = <0x01>;phandle = <0x01>;};mu@5d1c0000 {compatible = "fsl,imx8-mu";reg = <0x00 0x5d1c0000 0x00 0x10000>;interrupts = <0x00 0xb1 0x04>;interrupt-parent = <0x01>;fsl,scu_ap_mu_id = <0x00>;status = "okay";};

interrupt-parent: 指向父中断控制器的引用,值为0x01

interrupts: 定义与此消息单元相关的中断属性。

  • 0x00: 中断类型。
  • 0xb1: 中断号。
  • 0x04: 中断触发类型(通常表示上升沿触发)。

interrupt-controller: 表示这是一个中断控制器节点。

#interrupt-cells: 定义中断描述的单元数量,这里为3。表示每个中断描述需要三个单元。

  • 第一个单元:中断类型或源。
  • 第二个单元:中断号。
  • 第三个单元:中断触发类型或标志。

使用设备树描述CPU节点

每个CPU节点包含了描述该CPU核心的属性,例如兼容性、寄存器地址、时钟频率等。以NXP IMX8QM为例

	cpus {#address-cells = <0x02>;#size-cells = <0x00>;idle-states {entry-method = "psci";cpu-sleep {compatible = "arm,idle-state";arm,psci-suspend-param = <0x00>;entry-latency-us = <0x2bc>;exit-latency-us = <0xfa>;min-residency-us = <0x3e8>;};cluster-sleep {compatible = "arm,idle-state";arm,psci-suspend-param = <0x1000000>;entry-latency-us = <0x3e8>;exit-latency-us = <0x2bc>;min-residency-us = <0xa8c>;wakeup-latency-us = <0x5dc>;};};cpu@0 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x00>;enable-method = "psci";next-level-cache = <0x02>;operating-points = <0x124f80 0x00 0x10d880 0x00 0xdbba0 0x00 0x927c0 0x00>;clocks = <0x03 0x01>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x6e>;phandle = <0x6e>;};cpu@1 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x01>;enable-method = "psci";next-level-cache = <0x02>;};cpu@2 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x02>;enable-method = "psci";next-level-cache = <0x02>;};cpu@3 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x03>;enable-method = "psci";next-level-cache = <0x02>;};l2-cache0 {compatible = "cache";linux,phandle = <0x02>;phandle = <0x02>;};cpu@100 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x100>;enable-method = "psci";next-level-cache = <0x04>;operating-points = <0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00>;clocks = <0x03 0x03>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x05>;phandle = <0x05>;};cpu@101 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x101>;enable-method = "psci";next-level-cache = <0x04>;linux,phandle = <0x06>;phandle = <0x06>;};l2-cache1 {compatible = "cache";linux,phandle = <0x04>;phandle = <0x04>;};};

CPU 节点

cpus节点里面包含物理CPU布局,也就是CPU的布局全部在此节点下描述

注:有些设备树中描述大小核CPU,必须要用cpu-map,使用Cluster描述同一类型CPU,但是NXP中没有使用这种命名命名方式,但是也将大小核心分开描述了

第一个簇 (Cluster) 的 CPU 节点

cpu@0cpu@3: 定义四个 Cortex-A53 CPU核心。

  • device_type: 设备类型为cpu
  • compatible: 兼容属性,标识为 arm,cortex-a53
  • reg: CPU的地址单元,分别为 0x00 0x00, 0x00 0x01, 0x00 0x02, 0x00 0x03
  • enable-method: 启用方法为 psci
  • next-level-cache: 下一层缓存的引用,值为 0x02
  • operating-points: 操作点,包含频率和电压对。
  • clocks: 时钟源。
  • clock-latency: 时钟延迟,值为 0xee6c
  • #cooling-cells: 冷却单元的数量,值为 0x02
  • linux,phandlephandle: 句柄,用于唯一标识该节点。

第二个簇 (Cluster) 的 CPU 节点

	cpu@100 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x100>;enable-method = "psci";next-level-cache = <0x04>;operating-points = <0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00>;clocks = <0x03 0x03>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x05>;phandle = <0x05>;};cpu@101 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x101>;enable-method = "psci";next-level-cache = <0x04>;linux,phandle = <0x06>;phandle = <0x06>;};

cpu@100cpu@101: 定义两个 Cortex-A72 CPU核心。

  • device_type: 设备类型为cpu
  • compatible: 兼容属性,标识为 arm,cortex-a72arm,armv8
  • reg: CPU的地址单元,分别为 0x00 0x1000x00 0x101
  • enable-method: 启用方法为 psci
  • next-level-cache: 下一层缓存的引用,值为 0x04
  • operating-points: 操作点,包含频率和电压对。
  • clocks: 时钟源。
  • clock-latency: 时钟延迟,值为 0xee6c
  • #cooling-cells: 冷却单元的数量,值为 0x02
  • linux,phandlephandle: 句柄,用于唯一标识该节点。

缓存节点

	l2-cache0 {compatible = "cache";linux,phandle = <0x02>;phandle = <0x02>;};l2-cache1 {compatible = "cache";linux,phandle = <0x04>;phandle = <0x04>;};

l2-cache0l2-cache1: 定义两个二级缓存(L2缓存)。

  • compatible: 兼容属性,标识为 cache
  • linux,phandlephandle: 句柄,用于唯一标识该节点。

总结

这段设备树描述了一个含有两个簇(Cluster)的多核系统,其中第一个簇包含四个Cortex-A53 CPU核心,第二个簇包含两个Cortex-A72 CPU核心。每个CPU节点包含兼容性、寄存器地址、启用方法、时钟、操作点等属性。还定义了两个二级缓存节点,并描述了系统的空闲状态。这样,操作系统可以根据设备树信息正确地初始化和管理各个CPU核心及其相关硬件。

使用设备树描述时钟

例如下方NXP源码

prg@560c0000 {compatible = "fsl,imx8qm-prg";reg = <0x00 0x560c0000 0x00 0x10000>;clocks = <0x03 0x144 0x03 0x13b>;clock-names = "apb\0rtram";power-domains = <0x0f>;status = "okay";linux,phandle = <0x79>;phandle = <0x79>;};

时钟属性

clocks = <0x03 0x141 0x03 0x138>;
clock-names = "apb\0rtram";

clocks: 指定设备所需的时钟源。

  • <0x03 0x141>: 时钟控制器(索引为 0x03)中的时钟索引 0x141
  • <0x03 0x138>: 时钟控制器(索引为 0x03)中的时钟索引 0x138

clock-names: 为时钟源命名。

  • "apb\0rtram": 两个时钟源的名称分别是 apbrtram

下一个例子:

i2c@56226000 节点描述了一个 I2C 控制器的硬件信息,重点关注时钟相关的属性

i2c@56226000 {compatible = "fsl,imx8qm-lpi2c";reg = <0x00 0x56226000 0x00 0x1000>;interrupts = <0x08 0x04>;interrupt-parent = <0x8a>;clocks = <0x03 0x1d3 0x03 0x2f6>;clock-names = "per\0ipg";assigned-clocks = <0x03 0x1d3>;assigned-clock-rates = <0x16e3600>;power-domains = <0x8b>;status = "okay";#address-cells = <0x01>;#size-cells = <0x00>;pinctrl-names = "default";pinctrl-0 = <0x8c>;clock-frequency = <0x186a0>;};

时钟属性解析

clocks = <0x03 0x1d3 0x03 0x2f6>;
clock-names = "per\0ipg";
assigned-clocks = <0x03 0x1d3>;
assigned-clock-rates = <0x16e3600>;

clocks 属性指定了该 I2C 控制器所依赖的时钟源。

<0x03 0x1d3><0x03 0x2f6>

  • 0x03 是时钟控制器的引用(即时钟控制器节点)。
  • 0x1d30x2f6 是时钟控制器中不同的时钟索引。

这表示该 I2C 控制器需要两个时钟源,分别位于时钟控制器 0x030x1d30x2f6 索引处。

assigned-clocks 属性指定要配置的时钟源。在这个例子中,是 <0x03 0x1d3>(即 per 时钟)。

assigned-clock-rates 属性定义了该时钟的频率,这里是 0x16e3600,即 24MHz

总结

在驱动开发过程中,不需要过多关注如何在设备树中编写时钟信息,而是更应该关注如何在驱动代码中获取和解析这些时钟信息。时钟信息的具体内容和配置通常由硬件工程师或系统工程师来编写和验证。驱动开发者通过设备树提供的接口和 Linux 内核的时钟管理 API 来操作时钟,而不需要深入了解时钟的硬件实现细节。这种分工可以提高开发效率和代码的可维护性。

使用设备树描述GPIO

使用设备树描述一个 GPIO 控制器时,需要定义该控制器的基本属性,如兼容性、寄存器地址、中断、GPIO 单元的数量等。以NXP源码为例

gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <2>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <2>;linux,phandle = <0xea>;phandle = <0xea>;
};

使用设备树描述一个 GPIO 控制器时,需要定义该控制器的基本属性,如兼容性、寄存器地址、中断、GPIO 单元的数量等。以下是一个描述 GPIO 控制器的示例:

示例设备树节点

gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <2>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <2>;linux,phandle = <0xea>;phandle = <0xea>;
};

逐行解析

  1. 节点名称和地址

    gpio@5d0a0000 {
    
    • gpio@5d0a0000:表示 GPIO 控制器节点,其地址为 0x5d0a0000
  2. 兼容性

    compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";
    
    • compatible 属性表示设备兼容的驱动,优先级从左到右。
  3. 寄存器地址

    reg = <0x00 0x5d0a0000 0x00 0x10000>;
    
    • reg 属性定义设备的寄存器地址范围。这里表示起始地址 0x5d0a0000,大小为 0x10000 字节。
  4. 中断

    interrupts = <0x00 0x8a 0x04>;
    
    • interrupts 属性定义设备使用的中断。0x00 表示中断类型,0x8a 是中断号,0x04 是中断触发方式。
  5. GPIO 控制器标志

    gpio-controller;
    #gpio-cells = <2>;
    
    • gpio-controller 属性表示这是一个 GPIO 控制器。
    • #gpio-cells 属性定义每个 GPIO 描述的单元数,这里为 2
  6. 电源域

    power-domains = <0x10e>;
    
    • power-domains 属性指定该设备所属的电源域。
  7. 中断控制器标志

    interrupt-controller;
    #interrupt-cells = <2>;
    
    • interrupt-controller 属性表示这是一个中断控制器。
    • #interrupt-cells 属性定义每个中断描述的单元数,这里为 2
  8. phandle

    linux,phandle = <0xea>;
    phandle = <0xea>;
    
    • linux,phandlephandle 属性是节点的唯一标识符,用于引用该节点。

GPIO 单元

在设备树中,#gpio-cells 属性用于定义 GPIO 控制器节点中的 GPIO 单元(cells)的数量和结构。这些单元描述了 GPIO 控制器的每个 GPIO 引脚的特性和配置。在具体应用中,GPIO 单元通常用于描述某个设备连接到的特定 GPIO 引脚及其配置方式。

常见的单元包括:

  1. GPIO 引脚编号:GPIO 控制器中引脚的编号。
  2. 标志(flags):通常表示 GPIO 的输入/输出方向、上拉/下拉配置等。

在这个例子中,#gpio-cells = <2>; 表示每个 GPIO 引脚用两个单元来描述。

具体使用示例**—万年不变的点一个LED灯**

假设有一个LED灯连接到某个 GPIO 引脚,可以这么描述这个LED灯

led {compatible = "led_dev";gpios = <&gpio1 5 0>;
};

这里,gpios 属性定义了一个连接到 GPIO 控制器的 GPIO 引脚,使用了三个参数:

  1. GPIO 控制器的 phandle&gpio1 是一个指向 GPIO 控制器节点的引用。指定哪个 GPIO 控制器负责管理该引脚。
  2. GPIO 引脚编号5 表示 GPIO 控制器中的第 5 号引脚。
  3. 标志(flags)0 表示无特殊标志(通常用于表示 GPIO 引脚的配置,如输入/输出方向等)。标志的具体定义依赖于平台和 GPIO 控制器的实现。

相关文章:

Linux驱动开发—设备树分析:GPIO,中断,时钟信息,CPU信息

书接上回&#xff1a;Linux驱动开发—设备树基本概念&#xff0c;语法详解-CSDN博客 文章目录 使用设备树描述中断使用设备树描述CPU节点CPU 节点缓存节点总结 使用设备树描述时钟总结 使用设备树描述GPIO示例设备树节点逐行解析GPIO 单元 使用设备树描述中断 在NXP 官方中截…...

Java全栈解密:从JVM内存管理到Spring框架,揭秘垃圾回收、类加载机制与Web开发精髓的全方位旅程

JVM内存划分 在JVM中&#xff0c;每个线程有自己的虚拟机栈&#xff0c;而整个JVM实例共享一些内存区域。JVM的内存划分主要包括四个部分&#xff1a;程序计数器、虚拟机栈、堆区和方法区&#xff08;元数据区&#xff09;。 程序计数器&#xff1a;程序计数器用于存储当前线程…...

【探索Linux】P.46(高级IO —— 五种IO模型简介 | IO重要概念)

阅读导航 引言一、五种IO模型1. 阻塞IO&#xff08;1&#xff09;定义&#xff08;2&#xff09;特点 2. 非阻塞IO&#xff08;1&#xff09;定义&#xff08;2&#xff09;特点 3. IO多路复用&#xff08;1&#xff09;定义&#xff08;2&#xff09;特点 4. 信号驱动IO&#…...

【MongoDB 】MongoDB 介绍及应用,设计到4个案例

MongoDB 介绍概述 基础概念 MongoDB 是非关系型数据库&#xff0c;也就是nosql&#xff0c;存储json数据格式会非常灵活&#xff0c;要比数据库mysql/MariaDB更好&#xff0c;同时也能为mysql/MariaDB分摊一部分的流量压力。 对于经常读写的数据他会存入内存&#xff0c;如此…...

AI浪潮下的程序员生存指南:如何在智能时代锻造不可替代的核心竞争力

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工…...

Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]

文章目录 Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术…...

vue 日期控件 100天内的时间禁用不允许选择

vue 日期控件 100天内的时间禁用不允许选择&#xff0c;可以从101天选起 比如&#xff0c;2024年8月9号开始&#xff0c;100天内禁止选择&#xff0c;第101天之后的日期可以选&#xff0c;效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…...

服务器HTTP响应头安全性优化与漏洞修复方案

在对服务器进行漏洞扫描后,通常会发现一些常见的安全漏洞,特别是涉及HTTP响应头的问题。以下是本次扫描过程中发现的漏洞问题以及对应的修复方案 1.X-Content-Type-Options 响应头缺失 描述: 缺失此响应头可能导致浏览器错误地解析资源类型,存在MIME类型混淆攻击的风险。 …...

4.定时器(TIMER)

理论 预分频寄存器(TIMx_PSC)&#xff1a;由于时钟源为&#xff1a;72MHz&#xff0c;T 1/f 1/72MHz&#xff0c;由于不好计算周期时间&#xff0c;则需要分频&#xff0c;若分72则T 1/1MHz 1us(1MHz 一百万秒) 计数方式&#xff1a;向上(递增到某个数触发中断)、向下(递…...

java springboot mqtt控制海康摄像头

GHHKControlService 接口 package org.gh.ghhk.service;public interface GHHKControlService {boolean monitorControl(String payload);}GHHKControlServiceImpl 实现类 ​ package org.gh.ghhk.service.impl;import com.alibaba.fastjson.JSONArray; import com.alibaba.…...

AI大模型02:Prompt Engineering 提示工程

一、什么是提示工程&#xff08;Prompt Engineering&#xff09; 1.提示工程&#xff0c;也叫“指令工程” &#xff08;1&#xff09;Prompt 就是我们给大模型发送的指令&#xff0c;或者说是在聊天对话框中发送的内容。 Prompt是AGI时代的编程语言。 Prompt是去控制大模型的…...

EasyExcel动态表头导出

1、封装方法 package com.skybird.iot.base.utils;import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.w…...

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…...

MySQL基础练习题27-上升的温度

目录 题目 准备数据 分析数据 总结 题目 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id 。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Weather (id int, recordDate date, temperature int);#…...

只出现一次的数字 II

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2]…...

第十一章 数据仓库和商务智能 10分

11.1.0语境关系图 11.1 Q 建立数据仓库&#xff0c;有哪些步骤&#xff1f;如何建设&#xff1f;【6 个步骤非常重要&#xff01;必须知道】 1. 理解需求&#xff08;P&#xff09;&#xff08;目的明确&#xff0c;ETL&#xff09; (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏

数据结构是计算机科学中的一个重要分支&#xff0c;它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点&#xff1a; 基本概念 数据&#xff08;Data&#xff09;。数据元素&#xff08;Data Element)&#xff1a;数据项&#xff08;Data Item&#xff09;&…...

11.3 用Python处理常见文件

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…...

驗證HTTP代理的有效性的方法和步驟-okeyproxy

如何驗證HTTP代理的有效性&#xff0c;確保它的性能和安全性&#xff0c;是非常必要的。本文將詳細介紹驗證HTTP代理有效性的方法和步驟。 HTTP代理作為一種仲介伺服器&#xff0c;它可以幫助用戶在訪問目標網站時隱藏真實IP地址&#xff0c;從而提高匿名性和安全性。通過HTTP…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...