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@0
到 cpu@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,phandle
和phandle
: 句柄,用于唯一标识该节点。
第二个簇 (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@100
和 cpu@101
: 定义两个 Cortex-A72 CPU核心。
device_type
: 设备类型为cpu
。compatible
: 兼容属性,标识为arm,cortex-a72
和arm,armv8
。reg
: CPU的地址单元,分别为0x00 0x100
和0x00 0x101
。enable-method
: 启用方法为psci
。next-level-cache
: 下一层缓存的引用,值为0x04
。operating-points
: 操作点,包含频率和电压对。clocks
: 时钟源。clock-latency
: 时钟延迟,值为0xee6c
。#cooling-cells
: 冷却单元的数量,值为0x02
。linux,phandle
和phandle
: 句柄,用于唯一标识该节点。
缓存节点
l2-cache0 {compatible = "cache";linux,phandle = <0x02>;phandle = <0x02>;};l2-cache1 {compatible = "cache";linux,phandle = <0x04>;phandle = <0x04>;};
l2-cache0
和 l2-cache1
: 定义两个二级缓存(L2缓存)。
compatible
: 兼容属性,标识为cache
。linux,phandle
和phandle
: 句柄,用于唯一标识该节点。
总结
这段设备树描述了一个含有两个簇(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"
: 两个时钟源的名称分别是apb
和rtram
。
下一个例子:
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
是时钟控制器的引用(即时钟控制器节点)。0x1d3
和0x2f6
是时钟控制器中不同的时钟索引。
这表示该 I2C 控制器需要两个时钟源,分别位于时钟控制器 0x03
的 0x1d3
和 0x2f6
索引处。
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>;
};
逐行解析
-
节点名称和地址
gpio@5d0a0000 {
gpio@5d0a0000
:表示 GPIO 控制器节点,其地址为0x5d0a0000
。
-
兼容性
compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";
compatible
属性表示设备兼容的驱动,优先级从左到右。
-
寄存器地址
reg = <0x00 0x5d0a0000 0x00 0x10000>;
reg
属性定义设备的寄存器地址范围。这里表示起始地址0x5d0a0000
,大小为0x10000
字节。
-
中断
interrupts = <0x00 0x8a 0x04>;
interrupts
属性定义设备使用的中断。0x00
表示中断类型,0x8a
是中断号,0x04
是中断触发方式。
-
GPIO 控制器标志
gpio-controller; #gpio-cells = <2>;
gpio-controller
属性表示这是一个 GPIO 控制器。#gpio-cells
属性定义每个 GPIO 描述的单元数,这里为2
。
-
电源域
power-domains = <0x10e>;
power-domains
属性指定该设备所属的电源域。
-
中断控制器标志
interrupt-controller; #interrupt-cells = <2>;
interrupt-controller
属性表示这是一个中断控制器。#interrupt-cells
属性定义每个中断描述的单元数,这里为2
。
-
phandle
linux,phandle = <0xea>; phandle = <0xea>;
linux,phandle
和phandle
属性是节点的唯一标识符,用于引用该节点。
GPIO 单元
在设备树中,#gpio-cells
属性用于定义 GPIO 控制器节点中的 GPIO 单元(cells)的数量和结构。这些单元描述了 GPIO 控制器的每个 GPIO 引脚的特性和配置。在具体应用中,GPIO 单元通常用于描述某个设备连接到的特定 GPIO 引脚及其配置方式。
常见的单元包括:
- GPIO 引脚编号:GPIO 控制器中引脚的编号。
- 标志(flags):通常表示 GPIO 的输入/输出方向、上拉/下拉配置等。
在这个例子中,#gpio-cells = <2>;
表示每个 GPIO 引脚用两个单元来描述。
具体使用示例**—万年不变的点一个LED灯**
假设有一个LED灯连接到某个 GPIO 引脚,可以这么描述这个LED灯
led {compatible = "led_dev";gpios = <&gpio1 5 0>;
};
这里,gpios
属性定义了一个连接到 GPIO 控制器的 GPIO 引脚,使用了三个参数:
- GPIO 控制器的 phandle:
&gpio1
是一个指向 GPIO 控制器节点的引用。指定哪个 GPIO 控制器负责管理该引脚。 - GPIO 引脚编号:
5
表示 GPIO 控制器中的第 5 号引脚。 - 标志(flags):
0
表示无特殊标志(通常用于表示 GPIO 引脚的配置,如输入/输出方向等)。标志的具体定义依赖于平台和 GPIO 控制器的实现。
相关文章:

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

Java全栈解密:从JVM内存管理到Spring框架,揭秘垃圾回收、类加载机制与Web开发精髓的全方位旅程
JVM内存划分 在JVM中,每个线程有自己的虚拟机栈,而整个JVM实例共享一些内存区域。JVM的内存划分主要包括四个部分:程序计数器、虚拟机栈、堆区和方法区(元数据区)。 程序计数器:程序计数器用于存储当前线程…...

【探索Linux】P.46(高级IO —— 五种IO模型简介 | IO重要概念)
阅读导航 引言一、五种IO模型1. 阻塞IO(1)定义(2)特点 2. 非阻塞IO(1)定义(2)特点 3. IO多路复用(1)定义(2)特点 4. 信号驱动IO&#…...

【MongoDB 】MongoDB 介绍及应用,设计到4个案例
MongoDB 介绍概述 基础概念 MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。 对于经常读写的数据他会存入内存,如此…...

AI浪潮下的程序员生存指南:如何在智能时代锻造不可替代的核心竞争力
人工智能时代,程序员如何保持核心竞争力? 随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心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天内的时间禁用不允许选择,可以从101天选起 比如,2024年8月9号开始,100天内禁止选择,第101天之后的日期可以选,效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…...

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

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

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 提示工程
一、什么是提示工程(Prompt Engineering) 1.提示工程,也叫“指令工程” (1)Prompt 就是我们给大模型发送的指令,或者说是在聊天对话框中发送的内容。 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…...

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

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

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

第十一章 数据仓库和商务智能 10分
11.1.0语境关系图 11.1 Q 建立数据仓库,有哪些步骤?如何建设?【6 个步骤非常重要!必须知道】 1. 理解需求(P)(目的明确,ETL) (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏
数据结构是计算机科学中的一个重要分支,它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点: 基本概念 数据(Data)。数据元素(Data Element):数据项(Data Item)&…...

11.3 用Python处理常见文件
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

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

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

Java和kotlin 反射机制
Java 反射机制详解 Java 反射机制是一种强大的工具,使得程序可以在运行时动态地获取类的信息,并且可以在运行时操作类的成员变量、方法和构造函数等。以下是 Java 反射的详细讲解,包括其原理、使用场景、优缺点以及如何使用反射。 1. 反射的…...

Linux Shell编程--数组
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除! 一、简介 Shell 脚本中的数组允许你存储多个值,并可以通过索引访问它们。Shell 中的数组是一维的。 二、声明数组 在Shell…...

sheng的学习笔记-AI-k近邻学习(kNN)
AI目录:sheng的学习笔记-AI目录-CSDN博客 什么是k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,是一种基本的分类与回归方法。 分类问题:对新的样本,根据其 k 个…...

ShardingSphere之ShardingProxy集群部署
文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置,就是关于集群部署的 mode: # typ…...

同态加密和SEAL库的介绍(六)BGV 方案
前面介绍 BFV 和 CKKS 加密方案,这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念,这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密(RLWE)问题的加…...

uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案
背景 我需要在微信小程序中,用canvas绘制一个圆形钟表,在ui设计图中,有一部分阴影,这里我节选一下: 即深色发黑的部分 canvas通用阴影绘制 由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光,…...

W34KN3SS靶机
信息收集: 靶机地址:https://www.vulnhub.com/entry/w34kn3ss-1,270/# (1)ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:E8:66:AB (2)端口扫描 nmap -p- -A 192.168.254.145 (3&…...
8.9套题
A. 猴猴吃苹果 题意:给定根节点k,求访问点的顺序,使得每次从上一个点到当前点的权值最大。访问过的点权值为0。权值一样时,输出最小编号 思路:由于是双向边,先求根节点到每一个节点的距离值。在第一轮中&…...

Python 爬取网页水务数据并实现智慧水务前端可视化
提示:本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…...

百度智能云发布3款轻量级+2款场景大模型
文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景,ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”,推理场景…...