嵌入式Linux 设备树 GPIO详解 示例分析 三星 NXP RK

news2024/12/27 13:09:17

GPIO设备树用于在Linux内核中定义与GPIO相关的硬件资源,它使操作系统可以识别、配置和使用GPIO引脚。设备树中通常会指定GPIO控制器的基地址、GPIO引脚的中断配置、时钟和其他相关信息。

目录

RK相关案例代码

NXP相关案例代码

三星相关案例代码

在设备树中,GPI0控制器需要以下属性:

  1. gpio-controller 表示该节点是GPIO控制器。
  2. #gpio-cells 指定该控制器使用的cell数量。
  3. data-gpios 属性用于指定具体的GPIO引脚,如 <&gpio1 12 0>,表示选择GPIO1的第12个引脚,并设定特定的标志。

如下就是案例代码:

gpio0: gpio@fdd60e00 {
    compatible = "rockchip,gpio-bank";   // GPIO 控制器的兼容性字符串
    reg = <0xfdd66000 0x1000>;           // GPIO 控制器寄存器的基地址和大小
    interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; // GPIO中断配置,GIC_SPI代表中断类型
    clocks = <&pclk_gpio>, <&spnucru_dbclk_gpio9>; // 时钟源
    gpio-controller;                     // 声明这是一个GPIO控制器
    #gpio-cells = <2>;                   // 每个GPIO需要两个参数:第一个是GPIO编号,第二个是GPIO配置
    interrupt-controller;                // 该控制器是中断控制器
    #interrupt-cells = <2>;              // 每个中断需要两个参数:第一个是中断编号,第二个是中断配置
    pinctrl-names = "default";           // 引脚控制名称,通常为"default"
    pinctrl-0 = <&pinctrl_gpio0>;        // 引脚控制节点,指定哪些引脚属于该控制器
};

pinctrl_gpio0: pinctrl@fdd60e00 {
    compatible = "rockchip,pinctrl";
    reg = <0xfdd60e00 0x1000>;          // 引脚控制器的寄存器地址
    pins = "gpio0", "gpio1", "gpio2";   // GPIO引脚
    function = "gpio";                  // 引脚的功能模式
    bias-pull-up;                       // 上拉电阻配置
};

RK相关案例代码

如下为BSP工程师提供的相关代码:

gpio0: qpio@fdd60e00 {
    compatible = "rockchip,gpio-bank";
    reg = <0xfdd66000 0x1000>;
    interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;
    gpio-controller;
    #gpio-cells = <2>;
    gpios = <&pinctrl0032>;
    interrupt-controller;
    #interrupt-cells = <2>;
};
  • gpio0: qpio@fdd60e00

    • gpio0 是设备树节点的名称,用来表示该节点是 GPIO 控制器的配置。
    • qpio@fdd60e00 是该节点的设备地址(基地址),@ 后面是设备的物理地址或映射地址。这里表示的是 GPIO 控制器的寄存器区域,位于地址 0xfdd60e00
  • compatible = "rockchip,gpio-bank";

    • 这表示该硬件平台使用的是 Rockchip 的 GPIO 控制器,并且该节点与 Rockchip 的 gpio-bank 驱动兼容。这个字段帮助内核匹配适合的驱动程序。
  • reg = <0xfdd66000 0x1000>;

    • reg 定义了设备的寄存器基地址和大小,表示 GPIO 控制器的寄存器映射。
    • 0xfdd66000 是 GPIO 控制器寄存器的基地址,0x1000 是寄存器区块的大小,意味着这个区域的大小是 4KB。
  • interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了中断相关信息,指示设备如何通过中断进行通知。
    • GIC_SPI 33 表示这是一个来自 GIC (通用中断控制器) 的 SPI 类型中断,编号为 33。
    • IRQ_TYPE_LEVEL_HIGH 表示该中断是一个高电平触发的中断。
  • clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;

    • clocks 定义了该设备所需的时钟源,<&pclk_gpio_g><&spnucru_dbclk_gpio9> 是设备树中时钟节点的引用。具体的时钟节点需要在设备树的其他地方定义。
    • &pclk_gpio_g&spnucru_dbclk_gpio9 表示用于该 GPIO 控制器的时钟资源,它们通常会在其他设备树节点中定义。
  • gpio-controller;

    • 这个标识符声明该节点为一个 GPIO 控制器。它告诉内核该设备是用来控制 GPIO 引脚的。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 引脚配置所需要的参数个数。这里 2 表示每个 GPIO 配置有两个单元:第一个是 GPIO 编号,第二个是引脚的配置(例如方向或电平)。
  • gpios = <&pinctrl0032>;

    • gpios 引用引脚控制器(pinctrl)的节点,<&pinctrl0032> 表示该 GPIO 控制器与 pinctrl0032 节点关联。
    • pinctrl 节点通常包含有关引脚的设置和配置(如电平、功能、方向等)。
  • interrupt-controller;

    • 该标识符表明该 GPIO 控制器节点不仅是 GPIO 控制器,还管理中断。即该控制器处理 GPIO 相关的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了中断配置所需的单元数。这里 2 表示每个中断配置需要两个参数:第一个是中断编号,第二个是中断配置(如触发方式)。

如下为开发人员所编写的设备树代码:

15x66: edl_ft5306@38 {
    status = "disabled";
    compatible = "edl,edl-ft5306";
    reg = <0x38>;
    touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;
    interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;
    reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;
    touchscreen-size-x = <8>;
    touchscreen-size-y = <1280>;
    touch-type = <1>;
};
  • 15x66: edl_ft5306@38

    • 15x66 是设备树节点的标签,通常是设备的名称或标识符,这里假设是硬件设备的标识。设备树标签用于内核和其他设备访问。
    • edl_ft5306@38 表示该设备是 edl-ft5306 触摸屏控制器,@38 是设备的地址,指示触摸屏控制器的地址为 0x38
  • status = "disabled";

    • status 设置为 "disabled",这意味着该设备当前是禁用的。若要启用设备,需要将其改为 "enabled"
  • compatible = "edl,edl-ft5306";

    • compatible 指定设备的兼容性标识符。内核通过该字段来匹配合适的驱动程序来支持此设备。这里 edl,edl-ft5306 是触摸屏控制器的标识符,意味着该设备使用 edl-ft5306 驱动。
  • reg = <0x38>;

    • reg 表示设备的寄存器地址,<0x38> 表示设备的地址为 0x38。这通常是设备的I2C或SPI地址。
  • touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;

    • touchscreen-gpio 配置触摸屏的 GPIO 引脚。<&gpio0 RK_PB3 GPIO_ACTIVE_LOW> 表示该 GPIO 控制器 (gpio0) 的引脚 RK_PB3 被用于触摸屏操作,并且设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了设备的中断信息,指定触摸屏的中断由 gpio0 控制器的 RK_PB6 引脚提供,并且触发类型为 IRQ_TYPE_LEVEL_HIGH,即高电平触发中断。
  • reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了用于复位触摸屏的 GPIO 引脚。与触摸屏 GPIO 引脚相同,复位引脚 RK_PB6 设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • touchscreen-size-x = <8>;

    • touchscreen-size-x 配置了触摸屏的 X 轴分辨率。在这里设置为 8,可能表示触摸屏横向的某些特定参数,通常是像素数或配置值(但通常触摸屏的分辨率应为更高的值,可能需要确认是否符合实际需求)。
  • touchscreen-size-y = <1280>;

    • touchscreen-size-y 配置了触摸屏的 Y 轴分辨率,设置为 1280,通常表示触摸屏纵向的像素数。
  • touch-type = <1>;

    • touch-type 设置为 1,这可能表示触摸屏的类型,例如:1 可能代表电容式触摸屏,其他值可能代表其他类型(如电阻式触摸屏)。具体值需根据硬件规格确认。

NXP相关案例代码

如下为BSP工程师的代码:

gpio1: gpiog8209ce00f {
    compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";
    reg = <0xe209c000 0x4000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
};
  • gpio1: gpiog8209ce00f

    • gpio1 是该设备节点的名称,表示这是一个名为 gpio1 的 GPIO 控制器节点。
    • gpiog8209ce00f 是设备的标签,通常表示硬件资源的描述或地址。这个标签不一定是常规的设备命名,具体可能依据硬件平台的实现来命名。您可能需要根据实际硬件进行调整。
  • compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";

    • compatible 字段指示该设备与哪些驱动程序兼容。在此,设备支持 Freescale (现 NXP) 的 imx6ul-gpioimx3s-gpio 驱动。这两个平台都使用类似的 GPIO 控制器,因此该字段包括两个兼容性标识符。
  • reg = <0xe209c000 0x4000>;

    • reg 表示设备的寄存器基地址及大小。这里基地址为 0xe209c000,寄存器大小为 0x4000,即 16KB。该设备的 GPIO 控制器寄存器区域映射到这个内存地址范围。
  • interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了与该 GPIO 控制器相关的中断。这里有两个中断,分别由 GIC (通用中断控制器) 的 SPI (共享外部中断) 66 和 67 触发。
    • IRQ_TYPE_LEVEL_HIGH 表示这些中断是高电平触发的。
  • gpio-controller;

    • 该节点表示一个 GPIO 控制器,表明这是一个控制 GPIO 引脚的硬件设备。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 配置所需要的单元数。这里的值 2 表示每个 GPIO 配置需要两个参数:一个是 GPIO 编号,另一个是该 GPIO 的配置(如方向或电平)。
  • interrupt-controller;

    • 该节点声明自己也是一个中断控制器。意味着该 GPIO 控制器不仅控制 GPIO 引脚,还负责管理这些引脚的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了与中断相关的参数个数。这里的值 2 表示每个中断配置需要两个参数:一个是中断号,另一个是中断配置(例如触发类型)。

如下为开发工程师的代码编写:

edt_ft5x05838: edt-ft5x058@38 {
    compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_scefault>;
    interrupt-parent = <&gpio1>;
    interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;
    reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
    irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
    status = "disabled";
};
  • edt_ft5x05838: edt-ft5x058@38

    • edt_ft5x05838 是该设备节点的标签,它表示一个触摸屏控制器。
    • edt-ft5x058@38 表示该设备的名称和地址,@38 表示设备的地址为 0x38,该地址通常是 I2C 或 SPI 总线上的地址。
  • compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";

    • compatible 字段表示该设备兼容的驱动程序。这里列出了三个兼容的驱动程序(edt-ft5366, edt-ft5xB6, 和 edt-ft5406),它们代表了不同型号的触摸屏。
  • pinctrl-names = "default";

    • pinctrl-names 用来指定该设备使用的引脚控制配置的名称。"default" 表示使用默认的引脚控制配置。
  • pinctrl-0 = <&pinctrl_scefault>;

    • pinctrl-0 指定设备的引脚控制配置。&pinctrl_scefault 应该是指向一个引脚控制配置的引用,这个引用在设备树的其他地方定义。根据您的设备,它可能是某个预定义的引脚配置(例如触摸屏数据线的配置)。
  • interrupt-parent = <&gpio1>;

    • interrupt-parent 字段指定该设备中断的父控制器,这里是 gpio1,即通过 GPIO 控制器 1 触发中断。
  • interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了设备的中断信息。<9 0 IRQ_TYPE_LEVEL_HIGH> 表示设备的中断由 gpio1 控制器的 GPIO 引脚 9 提供,且触发方式为 IRQ_TYPE_LEVEL_HIGH,即高电平触发。
  • reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了设备的复位引脚。这里设置了复位引脚为 gpio5 控制器的 GPIO 引脚 0,并且设置为 GPIO_ACTIVE_LOW,表示低电平有效。
  • irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;

    • irq-gpios 配置了设备的中断 GPIO 引脚。这里设置为 gpio1 控制器的 GPIO 引脚 9,且设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • status = "disabled";

    • status = "disabled" 表示该设备当前被禁用。如果希望启用该设备,应将其更改为 enabled

三星相关案例代码

如下为BSP工程师相关代码:

gpio_c: gpioc {
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
};
  • gpio_c: gpioc

    • gpio_c 是该设备节点的标签,用于标识 GPIO 控制器。
    • gpioc 是设备的节点名称,表示这是一个 GPIO 控制器设备。
  • gpio-controller;

    • gpio-controller 表示这是一个 GPIO 控制器,负责管理 GPIO 引脚的输入输出。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 配置所需要的单元数。这里的 2 表示每个 GPIO 配置需要两个参数:
      1. 一个是 GPIO 引脚编号。
      2. 另一个是该 GPIO 的配置(例如方向、激活电平等)。
  • interrupt-controller;

    • interrupt-controller 表示该节点同时也充当中断控制器的角色,管理 GPIO 引脚的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了每个中断配置所需要的单元数。这里的 2 表示每个中断配置需要两个参数:
      1. 一个是中断号。
      2. 另一个是中断配置(例如触发方式)。

如下为开发工程师编写的代码;

ft5x06: ft5x66838 {
    compatible = "cdt,edt-ft5406";
    reg = <0x30>;
    pinctrl-names = "default";
    pinctrl-0 = <&tsc2007 0>;

    interrupt-parent = <&gpio_c>;
    interrupts = <26 IRQ_TYPE_EDGE_FALLING>;

    #ifdef CONFIG_RGB1024X690
    pinctrl-0 = <&gt911>;
    interrupt-parent = <&gpio_b>;
    interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
    #endif

    #ifdef CONFIG_LVDS_1024X768
    pinctrl-0 = <&gt911>;
    interrupt-parent = <&gpio_b>;
    interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
    #endif

    reset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;
};
  • ft5x06: ft5x66838

    • ft5x06 是设备节点的标签。
    • ft5x66838 是设备的名称,表示该设备是 ft5x66838 型号的触摸屏控制器。
  • compatible = "cdt,edt-ft5406";

    • compatible 字段指示设备与哪些驱动程序兼容。这里指示设备支持 edt-ft5406 驱动。
  • reg = <0x30>;

    • reg 字段定义了设备的地址。此处 0x30 是设备的 I2C 地址。
  • pinctrl-names = "default";

    • pinctrl-names 字段指定设备的引脚控制名称,这里使用了 default
  • pinctrl-0 = <&tsc2007 0>;

    • pinctrl-0 配置了该设备的引脚控制。这里的 <&tsc2007 0> 是指向一个引脚控制配置的引用,这个引用可能在设备树的其他地方定义。
  • interrupt-parent = <&gpio_c>;

    • interrupt-parent 指定了中断的父控制器,这里为 gpio_c,即通过 GPIO 控制器 C 来管理中断。
  • interrupts = <26 IRQ_TYPE_EDGE_FALLING>;

    • interrupts 配置了设备的中断信息。26 是中断号,IRQ_TYPE_EDGE_FALLING 表示该中断是边缘触发,且是下降沿触发。
  • #ifdef CONFIG_RGB1024X690#endif

    • 这是条件编译指令,表示只有在配置中启用了 RGB1024X690 时,才会启用该部分的设备树配置。
    • 该部分配置了触摸屏的引脚控制和中断,且中断号为 29,触发方式是下降沿。
  • #ifdef CONFIG_LVDS_1024X768#endif

    • 同样是条件编译指令,表示只有在配置中启用了 LVDS_1024X768 时,才会启用该部分的设备树配置。
    • 该部分与 RGB1024X690 配置类似,设置了相同的引脚控制和中断。
  • reset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了设备的复位引脚。这里使用 gpio_e 控制器的 GPIO 36 引脚,并且该引脚是低电平有效。

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

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

相关文章

【日记】不想随礼欸(926 字)

正文 今天忙了一天。感觉从早上就开始在救火。客户经理迎接检查&#xff0c;要补资料&#xff0c;找我们问这样要那样&#xff0c;我自己的事情几乎完全开展不了。虽说也没什么大事就是了。 晚上行长还让我重装系统…… 难绷。看来这个爹味新行长懂得还挺多。 中午趁着不多的休…

Spring 源码学习(七)——注解后处理器

通过之前对注解式配置的解析&#xff08;Spring 源码学习&#xff08;三&#xff09;—— 注解式配置解析_spring源码学习-CSDN博客&#xff09;可以发现其使用 AnnotationConfigUtils 类的 registerAnnotationConfigProcessors 静态方法对象注解后处理器对象进行注册&#xff…

如何避免缓存击穿?超融合常驻缓存和多存储池方案对比

作者&#xff1a;SmartX 解决方案专家 钟锦锌 很多运维人员都知道&#xff0c;混合存储介质配置可能会带来“缓存击穿”的问题&#xff0c;尤其是大数据分析、数据仓库等需要频繁访问“冷数据”的应用场景&#xff0c;缓存击穿可能会更频繁地出现&#xff0c;影响业务运行。除…

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…

【CKA】Kubernetes(k8s)认证之CKA考题讲解

CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全&#xff0c;要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名&#xff1a; al…

导入kotlin

android studio 导入kotlin项目 android studio kotlin教程 或者直接拿一个kt文件进来&#xff0c;在顶部会显示一个config&#xff0c;然后设置version&#xff0c;点击OK就可以了自动导了

《CSS 知识点》大屏卡片布局思路:弹性布局 flex-grow

思路 大屏左右两侧高宽一致&#xff0c;内部卡片可按比例设置&#xff01; 使用弹性布局和属性 flex-grow 设置比例&#xff1b;间隔使用 margin-bottom 设置&#xff0c;最后一个卡片不设置&#xff1b; 效果如图 代码说明 CSS代码 26 - 30&#xff0c;左右两侧设置弹性布…

责任链模式的理解和实践

责任链模式&#xff08;Chain of Responsibility&#xff09;是行为型设计模式之一&#xff0c;它通过将多个对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有对象处理它为止。这个模式的主要目的是将请求的发送者和接收者解耦&#xff0c;使请求沿着处理链传…

如何在 Ubuntu 上安装开源监控工具 Uptime Kuma

简介 Uptime Kuma&#xff08;或简称 Kuma&#xff09;是一个开源监控工具&#xff0c;用于监控 HTTP、HTTPS、DNS 等协议的服务。Uptime Kuma 提供多种功能&#xff0c;如多语言支持、多个状态页面、代理支持等。 接下来&#xff0c;我将一步一步教大家如何进行安装和部署&am…

go语言zero框架对接阿里云消息队列MQ的rabbit的配置与调用

在 Go 语言中对接阿里云消息队列&#xff08;MQ&#xff09;的 RabbitMQ 配置与调用&#xff0c;首先需要安装和配置相关的 Go 库&#xff0c;并了解如何通过 RabbitMQ 与阿里云消息队列进行交互。 ### 步骤一&#xff1a;安装 RabbitMQ Go 客户端库 阿里云的消息队列&#x…

AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘如何解决?

AttributeError: module cv2.dnn has no attribute DictValue如何解决&#xff1f; 出现场景出错原因解决方案 出现场景 当在代码中导入opencv的时候&#xff1a;import cv2&#xff0c;出现&#xff1a; 出错原因 查看大家出现的错误&#xff0c;发现是因为opencv版本问题…

京东e卡 h5st 4.96

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

《探索视频数字人:开启未来视界的钥匙》

一、引言 1.1视频数字人技术的崛起 在当今科技飞速发展的时代&#xff0c;视频数字人技术如一颗璀璨的新星&#xff0c;正逐渐成为各领域瞩目的焦点。它的出现&#xff0c;犹如一场科技风暴&#xff0c;彻底改变了传统的视频制作方式&#xff0c;为各个行业带来了前所未有的机…

畅阅读微信小程序+ssm

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

前缀和篇——繁星斗斗数字交织中,觅得效率明月辉光(3)

前言 本篇带来前缀和的最终部分&#xff0c;与之前相同&#xff0c;将结合难度进一步提升的题目进行详细分析讲解&#xff0c;以深化对该算法的理解运用。 一. 和可被k整除的子数组 1.1 题目链接&#xff1a;https://leetcode.cn/problems/subarray-sums-divisible-by-k/des…

【 C++ 入门基础】 —— 双壁传奇C语言和C++的爱恨情仇

C学习笔记&#xff1a; C 进阶之路__Zwy的博客-CSDN博客 各位于晏&#xff0c;亦菲们&#xff0c;请点赞关注&#xff01; 我的个人主页&#xff1a; _Zwy-CSDN博客 目录 1、从C语言到C的进化 1.1、历史渊源 1.2、语法层面的区别和联系 1.2.1、数据类型 1.2.2、函数定…

013路由协议-OSPF

OSPF具有更适用于规模较大的网络环境&#xff0c;收敛更快速、依据带宽来计算路径成本等。 计算方式&#xff1a; 100M/当前端口的带宽 如果小于1就按照1来计算 例如&#xff1a; 当前端口的带宽是1.54M 路径成本 100/1.54 65 当前端口的带宽是 1000M 路径成本 100/100 0.…

最新版Chrome谷歌加载ActiveX控件之金格iWebPDF2018控件

背景 金格iWebPDF2018控件是一款方便用户在线打开PDF文档的控件。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它不仅可以实现ActiveX控件在现代浏览器上使用&#xff0c;而且集成也…

没有在 SCM 配置或者插件中的 Git 存储库配置错误

问题&#xff1a; jenkins 配置新项目后首次运行报错如下&#xff0c;同时git代码分支无法选择。 已返回默认值 没有在 SCM 配置或者插件中的 Git 存储库配置错误 选项"使用仓库"设置为:"http://xxxx.git 请检查配置 原因&#xff1a; 配置pipeline 脚本时指…

AI时代的开发新纪元:云开发 Copilot

AI时代的开发新纪元&#xff1a;云开发 Copilot 目录 引言&#xff1a;AI时代的开发新纪元低代码与AI的完美融合云开发 Copilot的革命性意义云开发 Copilot 的核心特性解析 快速生成应用功能低代码与AI的深度结合 实战演练&#xff1a;云开发 Copilot 的应用案例 从需求到实现…