Network 之十三 NC-SI 原理、拓扑结构、RBT 接口及仲裁、协议格式

news2024/12/23 13:11:48

  最近,正在学习 NC-SI 的使用方法,于是开始各种 Google 查找 NC-SI 的资料进行学习。最详细还是得直接看 NC-SI 规范文档 DSP0222,以下就是记录的一些感觉 NC-SI 规范中比较重要的点以及我的一些理解,以备后续查阅。

有任何疑问,请直接查看 NC-SI 规范文档 DSP0222

起源

  为了方便对服务器进行管理,在服务器上通常有个被称为 BMC(Baseboard Management Controller,基板管理控制器)的独立硬件模块。通过相应的传感器,BMC 接收各种系统参数数据,例如,温度、风扇转速、操作系统状态等。管理员则可以通过 BMC 查看服务器运行状态及控制服务器。
在这里插入图片描述

BMC 有自己的 IP 地址,可以通过特殊的 Web 界面访问。

带外管理

  带外(Out-of-band,OOB)是一个网络术语,指的是具有单独的通信通道,该通道不通过常规的数据流通道传输。带外管理就是使用单独的管理接口通道来管理和监控设备。在计算领域,带外管理的一种形式有时被称为无人值守管理(lights-out management,LOM)。
在这里插入图片描述
  带外管理可以使用物理上分离的独立硬件模块,它允许系统管理员通过远程控制来监视和管理服务器和其他网络连接设备,而不管计算机是否已打开电源或者操作系统是否已安装及正常运行。

带内管理

  带内( in-band)是相对于带外来说的,就是指使用常规数据通道。带内管理就是使用常规数据通道来管理和监控设备。我们常用的 VNC 或 SSH 就是基于带内连接(通常的网络通道)的带内管理方式。
在这里插入图片描述
  带内管理通常必须依赖安装在被管理的远程系统上的软件,并且仅在操作系统启动并启动网络后才能工作。而且,它通常不是一个独立的硬件模块,不允许独立于其他网络组件的当前状态来管理远程设备。

IPMI

  BMC 是智能平台管理接口 ( Intelligent Platform Management Interface,IPMI) 的一部分。IPMI 是自治计算机子系统的一组计算机接口规范,它提供独立于主机系统的 CPU、固件(BIOS 或 UEFI)和操作系统的管理和监视功能。IPMI 定义了一组接口,供系统管理员用于计算机系统的带外管理。

  1. IPMI 由英特尔牵头,于 1998 年 9 月 16 日首次发布。
  2. IPMI 的后继者是由 DMTF 制定的 Redfish

  IPMI 子系统由一个被称为 BMC 的主控制器和其他管理控制器组成。这些控制器分布在不同系统模块中,然后通过 SMBus 或 RS-232 串口或 IPMB 或者直接使用地址 + 数据线与 BMC 相连进行通信。

  最初,BMC 有一个独立的网口用来提供远程管理,后来,NIC 制造商开始使用专有的边带接口(通常基于 I2C / SMBus 接口)来提供一种机制,通过这种机制 BMC 可以与操作系统共享以太网端口。
在这里插入图片描述
  最初的边带接口通信速度慢,且使用专有协议。DMTF 开始创建一个行业标准边带接口,它的运行速度将比 SMBus 快得多,并减轻了 BMC 工程师的一些负担。最终,网络控制器边带接口(NC-SI)规范于 2009 年以 1.0.0 版本发布。此后,NC-SI 逐渐成为了 BMC 的标配接口。

DMTF(Distributed Management Task Force,分布式管理任务组)是一个非营利性行业标准组织,致力于创建 IT 基础设施的开放式可管理性标准。

NC-SI

  NC-SI 全称 Network Controller Sideband Interface(网络控制器边带接口)是一个由分布式管理任务组(DMTF)定义的电气接口和协议。通过 NC-SI,BMC 就可以与 CPU(操作系统)共享 NIC。
在这里插入图片描述
  NC-SI 的目的是提供独立于网络控制器的带内活动的方法。同时,它提供一种健壮的过滤机制,允许 BMC 精确地指定它将接受的以太网流量类型。并且,NC-SI 支持高达 100Mbps 的全双工速度运行。

  简单对 NC-SI 规范文档做个说明,第五章主要是对 NC-SI 的概述;第六章主要是 MC 和 NC 的设计要求;第七章主要是多 NC-SI 封装的仲裁机制;第八章是 NC-SI 协议的格式;第九章规定了各种操作的应答时间;第十章是 RBT 电气规范。同时,注意区分以下名词:

  1. Management Controller(MC,管理控制器)通常就是 BMC
  2. Network Controller(NC,网络控制器)通常就是 NIC。
  3. Package在 NC-SI 中是封装的意思,用来代指一个芯片或芯片里的一个模块。这个名词对于理解规约非常重要!
  4. Packet:表示 Frame 中的一块结构化的数据
  5. Frame:代指以太网帧

数据包

  NC-SI 将数据包被分为了 Pass-through Packets 和 Control Packets。其中,Pass-through Packets 就是 IEEE 802.3 以太网帧;Control Packets 的数据域则由 NC-SI 进行了自定义。
在这里插入图片描述

  • Control Packets: 仅用于 MC 与 NC 之间,是 MC 用来配置 NC、RMII 接口以及 Pass-through 规则的数据包,MC 发送 Command,NIC 给出 Response。NC-SI 协议就是指的针对 Control Packets 的协议。
    在这里插入图片描述

  • Pass-through Packets: 用于 MC 与远程管理终端通信,就是我们常见的 TCP/IP 协议栈定义各种报文,例如 ARP、DHCP 等等。它由 NIC 根据 MC 下发的过滤配置(VLAN Tag filter、L2 address filters、 MAC address support、and limited frame filtering using L3 / L4 header),将数据包转发到公网以及将公网数据转发给 MC。
    在这里插入图片描述

    详见规范 6.5 Frame filtering for Pass-through mode 章节

  • Asynchronous Event Notification: 异步事件通知(AEN)报文使 NC 能够在网络控制器发生某些可能影响接口操作的状态变化时,主动向 MC 发送通知。MC 可以通过 AEN Enable 命令让 NC 开启或关闭该功能。

    AEN 没有应答,因此存在丢包的可能。

通信模型

  NC-SI 通信模型是经典的 Request-Response 一问一答网络模型,由 MC 发送 Command,然后 NIC 给出 Response。在规范的 6.3.1.2 章节有明确说明,NC 和 MC 都只需要实现单线程处理,MC 发送一个 Command 后,需要等待应答(或超时)后,才能发送下一个 Command,NC 处理完一个命令后才会出来下一个命令。

管理控制器必须尝试 NCSI 请求(相同 IID)至少 3 次,才能够报告网络控制器发生了错误。

  其中,异步事件通知(AEN)比较特殊,它是由 NC 主动向 MC 发送,并且 MC 不会给出 Response。当 NC 由于一些原因出现复位后,就可以利用 AEN 及时通知 MC,请求 MC 重新配置 NC。

拓扑结构

  NC-SI 规范定义了完整的拓扑结构,它主要包括一个管理控制器(Management Controller,MC),一个或多个(最多支持 4 个)网络控制器(Network Controller,NC)。一个 NC 可以有多个通道(可以理解为一个 NC 的对外有多个网口)。在协议的定义中,则最多可以支持 8 个 NC,每个 NC 最多支持 31 个通道。
在这里插入图片描述

NC-SI 接口

  NC-SI 规范定义的接口是基于 IEEE802.3 的 RMII 的,被称为 RBT(RMII Based Transport),定义于规范的第 10 章 10 RBT Electrical specification(支持的其他接口见独立规范 DSP0261)。与标准 RMII 不同,RBT 允许将多个网络控制器连接到单个BMC,而 RMII 最初是设计用于点对点互连的。
在这里插入图片描述
  通常,对于单个物理网络控制器封装(芯片或模块)存在单个逻辑 NC-SI 封装。然而,NC-SI 规范允许单个物理芯片或模块容纳多个 NC-SI 逻辑封装。根据通道和 NC-SI 封装的多少,NC-SI 规范将 NC 分为了单控制器和集成控制器。其中,单控制器是指只支持单个 NC-SI 通道的控制器,集成控制器是指能提供多个 NC-SI 通道的控制器。
在这里插入图片描述
  多个 NC-SI 逻辑封装可以理解为 NC-SI 接口上有多个缓冲区(上图的 bus buffers),但对外的 NC-SI 接口还是一个。 NC-SI 协议的命令中有相应的字段来指定通信使用哪个 NC-SI 封装和通道。多个 NC-SI 封装和多个通道的对应关系由厂家来决定,NC-SI 规范并没有规定。

  多个网络控制器封装(包括一个 NC 中的多个逻辑封装)能够同时接收来自管理控制器发出的在 NC-SI 的 TXD[1:0] 线上传输的流量,而不必为总线仲裁。但是,由于多个网络控制器封装共享 NC-SI 的 RXD[1:0] 线,不能同时进行返回数据,因此,必须有仲裁机制来允许连接到接口的多个网络控制器共享 RXD 线路,从而向管理控制器发送数据包。

  通过仲裁机制,保证在任何给定时间只有一个 NC 封装可以将数据传输到 RXD 总线上。规范的第 7 章 7 Arbitration in configurations with multiple Network Controller packages 专门介绍了两种仲裁方法。并且要求 NC 封装支持接收 MC 下发的命令配置仲裁方式。

目前,NC-SI 仅支持一个 MC,也就不存在仲裁等问题,因此,对于 MC 侧,NC-SI 规范并没有详细描述

基于硬件的仲裁

  为了防止两个或多个 NC-SI 封装同时传输,NC-SI 规范设计了一种基于硬件的仲裁方案,在任何给定的时间只允许一个 NC 封装驱动共享接口的 RX 线。当允许控制器通过 NC-SI 接口进行传输时,该方案采用一种在 NC 封装之间传递消息(运算码)的机制进行协调。
在这里插入图片描述
  基于硬件的仲裁需要网络控制器上两个额外的引脚(ARB_IN 和 ARB_OUT)。一个 NC 的 ARB_OUT 引脚连接到下一个 NC 的 ARB_IN 引脚,形成一个环配置。硬件仲裁的时序要求被设计为最多容纳四个网络控制器。

  如果实现包含一个单一的 NC,ARB_OUT 引脚可能连接到同一个 NC 上的 ARB_IN 引脚,或者可能保持断开连接,在这种情况下,应该使用 Select Package 命令禁用硬件仲裁。规范可选地支持使用 Get Capabilities 命令报告硬件仲裁实现状态和硬件仲裁状态。

基于硬件的仲裁是可选的,因此,先不看了(看了没看懂)!规范中有详细的介绍。

基于命令的仲裁

  NC 可以不支持硬件仲裁,但是,必须要支持通过 Select PackageDeselect Package 这两个命令来控制哪一个 NC 封装可以在 RXD 线路上传输。因为只允许一个 NC 包在 RXD 线路上传输,所以在任何给定的时间,MC 应该只有一个包处于选定状态。

注意,这里的 Package 是指的 NC 中的 NC-SI 封装

NC-SI 协议

  NC-SI 是一个遵循 IEEE 802.3 标准以太网帧格式的以太网接口,因此,其数据帧就是标准的 IEEE 802.3 以太网帧,定义于规范的 8 Packet definitions。NC-SI 将数据包被分为了 Pass-through Packets 和 Control Packets。其中,Pass-through Packets 就是 IEEE 802.3 以太网帧;NC-SI 协议就是针对 Control Packets 的。
在这里插入图片描述

  1. NC-SI 规定,除非另有指定,否则 Control Packets 中多字节数字首先传输最高有效位,字节内的位则先传输最高有效位。
  2. Control Packets 不能包含 802.1Q VLAN 标记
  3. Control Packets 的 EtherType 为 0x88F8

Ethernet frame header

  以太网帧头就是标准的 IEEE 802.3 以太网帧格式。对于 NC-SI,取值都是确定的,规范中进行了规定:

  1. Destination Address (DA): 无论是 MC 还是 NC,这个字段必须填写为 FF:FF:FF:FF:FF:FF 的广播地址。如果收到不是该值的帧,由 NC 或 MC 自行决定如何处理该帧(丢弃、正常响应、错误响应)。
  2. Source Address (SA): 这个字段的内容可以设置为任何值。NC 生成的 NC-SI 控制报文中的该字段应使用 FF:FF:FF:FF:FF:FF
  3. Ethertype: 对于 NC-SI 控制报文,该字段应设置为 IEEE分 配给 NC-SI 的固定值 0x88F8。该值可以使 NC-SI 控制报文在整个报文流中与其他报文区分开来。

Frame Check Sequence

  帧末尾的帧检测序列(FCS),用于检测帧的损坏情况。任何 FCS 无效的帧将被丢弃。

Control packet header

  Control Packets(Command、Response、AEN)包含一个公共的被称为头 Control packet header,包含用于识别、验证和处理报文的数据。Control packet header 共 16 个字节,采用大端字节顺序。

Management Controller ID

  1 字节的 MC ID 用于标识发出 Control Packets 的 MC,目前,MC 应该将该字段设置为 0x00 。在任何给定的时间,只支持一个 MC 通过NC-SI 访问 NC。NC 发送的 Response 中的 MC ID 必须与 MC 下发的相同。

对于 AEN 报文,该字段是 AEN Enable 命令设置的参数。

Header revision

  这个 1 字节字段标识发送方使用的控制包报头的版本。目前,报头修订是 0x01。

Instance ID (IID)

  IID 用来唯一标识一次通信过程(发送方和接收方需要一致),类似于帧序号,取值是 0x01 ~ 0xFF。网络控制器可以使用它来区分重试的命令和新的命令实例。管理控制器可以使用此值来匹配接收到的应答与先前发送的命令。

由于 AEN 没有应答,所以 AEN 的 IID 固定是 0x00。

  在实际通信中,MC 每次发送一个命令,都会增加 IID 的值,如果是重发上一个命令,则 IID 不变,NC 接收到后,直接返回收到的 IID,MC 接收应答后判断 IID 与自己下发的一致,方可确认应答有效。

由于 NS-SI 是 Request-Response 一问一答模型,因此,最多只需要缓存上一次命令即可

Control packet type

  这个 1 字节的字段包含是个标识符,用于识别特定的命令和应答。其中,最高 BIT 位 置 1 表示应答,为 0 表示命令。这允许128 个唯一的应答类型和 128 个唯一的命令类型之间的一一对应。

由于 AEN 没有应答,该字段固定是 0xFF。

Channel ID

  这个 1 字节的字段包含网络控制器通道标识符。网络控制器中的每个通道都应该被物理分配一个网络控制器通道 ID,管理控制器会在命令中设置这个值来指定该命令要用于的 NC-SI 封装和内部通道 ID。

比特位名称描述
[7…5]Package ID封装 ID 其实就是用来唯一代表一个 NC 封装,主要用于一个 NC 多个 NC-SI 封装的情况(取值从 0 依次增加) 。
网络控制器应至少允许系统集成商配置该字段的最低有效位两位(最高有效位为 0),当然也可以实现允许有所有 3 位可配置。
[4…0]Internal Channel ID网络控制器内部通道的 id,从 0 开始编号,针对网络控制器支持的每个直通通道依次递增,管理控制器使用 NC-SI 命令访问该通道。
内部通道 ID 值为 0x1F 适用于整个包。

  Channel ID 由 NC 进行定义,可以支持可配置,也可以不可配置,如果可配置,需要存储为非易失性数据,防止掉电丢失。同时,必须保证唯一性,不能出现多个 ID 对应同一个通道的情况。

Payload length

  这个 12 位的字段以字节为单位指示了 NC-SI 报头之后的命令或应答帧中任何有效载荷数据(Control packet payload)的长度。该值不包括 NC-SI 报头的长度、校验和值或任何可能存在的填充。

Reserved

  这些字段是为将来使用保留的,应该被置为 0,MC 和 NC 都不应该使用或判断该字段的值。

Control packet payload

  NC-SI 数据包负载可以包含零个或多个定义的数据值,这取决于数据包是命令数据包还是应答数据包或其他特定的类型。Control packet type 取值不同,下面的结构会进一步格式化。
在这里插入图片描述
  例如,对于 Response 报文,前 4 个字节固定为 2 字节 Response Code 和 2 字节 Reason Code。 有些 Response Code 和 Reason Code 有特定的组合。
在这里插入图片描述

数据

  NC-SI 数据包负载总是按照大端字节顺序格式化。如果有效负载存在且是 32 位对齐的,则应该插入 1 到 3 个值为 0x00 的填充字节,将数据对齐到 32 位(校验和字段的偏移必须在 32 位边界)。

2’s Complement checksum compensation

  计算的范围是从 Control packet header 到 Control packet payload(含对齐字节) 。这个校验和就是一个以 32 位表示的所有字节累加和的补码值。注意,计算过程是以 16 位无符号数来累加的,因此,需要每两个字节拼成一个 16 位无符号。

uint32_t ncsi_calculate_checksum(uint8_t *data, uint32_t len)
{
    uint32_t checksum = 0;

    for (int i = 0; i < len; i += 2)
    {
        checksum += (((uint32_t)data[i] << 8) | data[i + 1]);
    }

    return (~checksum + 1);
}

  校验方在收到之后,同样将 Control packet header 到 Control packet payload(含对齐字节)的字节以 16 位无符号数来累加形成一个 32 位的累加和(注意不是补码),然后在加上收到的校验和,如果没有错误,那么就应该正好为 0。

  • 1’s Complement:即反码,常用在 IP、TCP 的 checksum 校验和中
  • 2’s Complement:即补码

Ethernet packet pad

  IEEE 802.3 规定,从 DA 到 FCS,所有以太网帧的长度至少为 64 字节。大多数 NC-SI 控制报文的长度小于以太网帧负载的 46 字节的最小长度,因此,需要填充以符合 IEEE 802.3。

AEN 帧结构

  AEN 报文应该遵循控制报文的一般报文格式,但是,其 IID 字段设置为 0,控制包类型字段的值应该是 0xFF,通道 ID 字段中填写自己的 ID,以表明自己是通知源。注意,管理控制器不会发送响应报文来确认 AEN 报文。
在这里插入图片描述

工作流

  规范的第六章 6 Operational behaviors 包含了对 MC 和 NC 实现 NC-SI 的一些工作流程。例如,MC 和 NC 有哪些状态,各种状态下该干啥,如何处理异常情况(丢包、校验)等等。

NC 工作流

  下图描述了网络控制器是否以及何时准备好处理 NC-SI 命令报文,何时允许通过 NC-SI 接口传输透传报文,以及何时进入期望管理控制器配置的状态,以及各状态之间的转换逻辑。
在这里插入图片描述

MC 工作流

  当 NC-SI 接口第一次上电时,管理控制器需要发现并配置 NC-SI 设备(即 NC),以便可以在后续进行透传数据。该任务包括设置 MAC 地址、配置二层过滤、设置通道启用等参数。
在这里插入图片描述
  6.2.13 Startup sequence examples 描述了 MC 的工作流程,我这里只关于与不带硬件仲裁的流程 6.2.13.2 Typical non hardware arbitration specific startup sequence。至于带硬件仲裁的流程,自己查看 6.2.13.3 Hardware arbitration specific startup sequence

NS-SI 规范要求,MC 应定期向 NC 发出相关命令,以测试 NC 是否已输入初始状态。该测试应多久进行一次由 MC 决定。

  规范中给出的下面提供的流程是管理控制器启动 NC-SI 操作的一种方式的示例。这个流程假设管理控制器事先不知道有多少网络控制器连接到它的 NC-SI,或者这些控制器支持什么功能。如果管理控制器事先了解网络控制器的功能,例如网络控制器是否已经连接并启用了硬件仲裁,那么可以跳过一些步骤。

  1. Power up:需要等待一定的时间间隔, 确保 NC 已经初始化就绪。如果提前发送命令,需要自行处理 NC 不应答的问题。各种操作的时间要求,在规范的 9 Packet-based and op-code timing 有定义。
  2. Discover package
  3. Discover and get capabilities for each channel in the package
  4. Repeat steps 2 and 3 for remaining packages
  5. Initialize each channel in the package
  6. Enable hardware arbitration for the packages
  7. Start Pass-through packet and AEN operation on the channels

参考

  1. DSP0222
  2. https://en.wikipedia.org/wiki/Out-of-band_management

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

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

相关文章

OpenGL之模板测试

文章目录 模板测试模板函数物体轮廓源代码 模板测试 当片段着色器处理完一个片段之后&#xff0c;模板测试(Stencil Test)会开始执行&#xff0c;和深度测试一样&#xff0c;它也可能会丢弃片段。接下来&#xff0c;被保留的片段会进入深度测试&#xff0c;它可能会丢弃更多的片…

Git下:Git命令使用-详细解读

目录 一、Git 安装 二、Git 配置 三、Git 工作流程 四、Git 工作区、暂存区和版本库 五、常用 Git 命令清单 1. 创建仓库 2. 增加/删除文件 3. 代码提交 4. 分支管理 5. 标签 6. 查看历史提交 7. 远程仓库同步 8. 撤销操作 六、Git 常用命令速查表 七、Git 电子…

时序预测的深度学习算法全面盘点

1.概述 深度学习方法是一种利用神经网络模型进行高级模式识别和自动特征提取的机器学习方法&#xff0c;近年来在时序预测领域取得了很好的成果。常用的深度学习模型包括循环神经网络&#xff08;RNN&#xff09;、长短时记忆网络&#xff08;LSTM&#xff09;、门控循环单元&…

第五十一章 协助调查

眼前一个红彤彤的东西缓缓升起。 旭日东升&#xff1f;可现在才升未免太晚了些&#xff0c;升起的速度也未免太快了些&#xff0c;这红日么&#xff0c;也未免太小了些&#xff0c;而且&#xff0c;刚升起的朝阳&#xff0c;也未免显得太红太亮了些。 “是谁呀&#xff0c;水烧…

C语言数据存储 —— 浮点型篇

C语言数据存储 —— 浮点型篇 前言1. 一个常见问题2. 浮点数存储规则2.1 有效数字M一些特别的规定2.2 有效数字E一些特别的规定2.2.1 E如何存入内存2.2.2 E如何从内存中取出 3. 前面问题的解释。4. 结尾 前言 浮点数在内存中的存储方式对程序员来说非常重要。理解浮点数的存储…

数据结构:二叉树经典例题(单选题)-->你真的掌握二叉树了吗?(第一弹)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关二叉树的经典例题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

消防通道堵塞识别 opencv

消防通道堵塞识别系统通过opencvpython网络模型技术&#xff0c;消防通道堵塞识别对消防通道的状态进行实时监测&#xff0c;检测到消防通道被堵塞时&#xff0c;将自动发出警报提示相关人员及时采取措施。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个…

linux-centOS7.9通过docker安装cwmp server:drumsergio/genieacs

一、安装环境 #查看centOS版本 [rootMiWiFi-R4CM-srv network-scripts]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #自动查找最新安装包并升级 [rootMiWiFi-R4CM-srv ~]# sudo yum upgrade 二、关闭firewalld、NetworkManager、selinux 关闭防火墙、…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…

在线选课的微信小程序(微信前端+网站后端)

目录 一、前言 二、微信小程序端&#xff08;老师、学生&#xff09; 1.学生用户前端小程序界面 2.老师前端小程序界面 三、后端&#xff08;管理员、老师、学生&#xff09; 3.老师后端 4.管理员后端 四、代码获取与调试 一、前言 这是一个在线选课的微信小程序&#…

PID控制算法: 3、Tuning Changes(参数调整)

改变控制参数积分项对输出结果的影响 可靠的控制系统应该有能力实时变更系统的参数 The Beginner’s PID acts a little crazy if you try to change the tunings while it’s running. Let’s see why. Here is the state of the beginner’s PID before and after the param…

STM32F4 点亮灯泡【顺序点亮、按键点亮】

一、顺序点亮灯泡 ①初始化 在user.c文件中&#xff0c;我们需要对LED进行初始化设置。 在函数LED_GPIO_Config中&#xff0c;可以修改代码如下&#xff1a; /*********************************************************************** LED初始化 备注 LED 接在GPC14引脚上…

【Springboot集成Neo4j完整版教程】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

基于Python+OpenCV图像识别的连连看辅助工具(深度学习+机器视觉)含全部工程源码及视频演示

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境 模块实现1. 获取句柄2. 图像划分3. 建立矩阵4. 矩阵求解 系统测试工程源代码下载其它资料下载 前言 本项目目标是利用pywin32来获取游戏图像信息&#xff0c;并利用OpenCV进行识别和处理&#xff…

2023学习日志

[牛客网习题练习] 此系列文章仅是对个人学习的记录如有错误望大家指正与谅解。 1.题目描述&#xff1a;输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出…

文本分析-使用Python做词频统计分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【JDK】二、环境变量从jdk17切换为jdk8后不生效的解决办法

环境变量从jdk17切换为jdk8后不生效的解决办法 一、问题描述二、环境变量为java17时的截图三、修改为java8时的截图四、解决办法1、原因分析 2、删除jdk17和jdk8默认的配置或者把默认的下移&#xff0c;统一使用自己的%JAVA_HOME%.3、同样我们把JAVA_HOME改成17 重启后&#xf…

面试题:mybatis中# 和 $ 的区别

面试题&#xff1a;mybatis中# 和 $ 的区别 一、主要区别如下&#xff1a; 1、#{}可以理解为预处理&#xff0c;而${}是直接替换。 #传入的参数在SQL中显示为字符串&#xff0c;会对自动传入的数据加上双引号。 $传入的参数在SQL中直接显示为传入的值 2、#{}试用于所有类型…

不要再封装各种Util工具类了,这个神级框架你值得拥有!

一、功能 二、安装 三、简单测试 今天给大家推荐一个非常好用的Java工具类库&#xff0c;企业级常用工具类&#xff0c;基本都有&#xff0c;能避免重复造轮子及节省大量的开发时间&#xff0c;非常不错&#xff0c;值得大家去了解使用。 Hutool 谐音 “糊涂”&#xff0c;…

STM32F4的连接初始化【ST-LINK、USB To TTL】

所需设备&#xff1a;STM32F4、杜邦线&#xff08;彩色小电线&#xff09; * 8 、USB 转 TTL 0.认识设备 ST-link USB 转TTL STM32F4主板 1.连线 ST-Link连线 一共需要四根线 序号从左至右&#xff0c;从上至下进行编号 1 - 3.3V 连接 1&#xff08;黄色&#xff09;2- GND …