S32G3系列芯片如何从外置flash进行Boot启动?

news2024/9/22 18:24:40

《S32G3系列芯片——Boot详解》系列——S32G3系列芯片如何从外置flash进行Boot启动?

  • 一、概述
  • 二、基于QuadSPI的boot
    • 2.1 基于QuadSPI的boot方式概述
    • 2.2 IO配置
    • 2.3 时钟配置
    • 2.4 QuadSPI具体配置参数
    • 2.5 系统重置后BootROM对闪存的要求
    • 2.6 应用程序对闪存配置的影响
  • 三、基于μSDHC接口的boot
    • 3.1 启动配置概述
    • 3.2 μSDHC时钟配置
    • 3.3 μSDHC支持的数据传输速率
    • 3.4 μSDHC启动流程
  • 四、其他机制
    • 4.1 Fail-Safe(故障安全机制)
    • 4.2 Boot Target(启动目标)
    • 4.3 Boot Target Watchdog(启动目标看门狗)
    • 4.4 Standby Boot(待机启动)

学习更多Boot相关内容,获取HSE基于IVT安全启动方案?
>>>>>>>>> 返回专栏总目录 《S32G3系列芯片——Boot详解》<<<<<<<<<

Tip📌:
  鼠标悬停双虚线关键词/句,可获得更详细的描述;
  建议按照专栏文章目录顺序依次阅读以便了解相关背景知识。

一、概述

  BootROM支持从外置flash通过诸如QuadSPI接口或者基于μSDHC接口的SD/MMC/eMMC等设备接口执行Boot流程。具体从哪种外设flash启动由寄存器Boot_CFG1的bit位 [7:5] 的配置决定,如下表所示:

在这里插入图片描述

二、基于QuadSPI的boot

2.1 基于QuadSPI的boot方式概述

  QuadSPI是一种高速串行外设接口(四线串行外设接口),可以实现微控制器与闪存的高速通讯。在启动过程中,首先,BootROM利用QuadSPI接口从外部闪存启动。这个过程分为两个阶段:

  初始配置阶段: 在这个阶段,QuadSPI控制器被配置为低速模式(30MHz),以便识别连接的闪存类型。对于Quad闪存Octal闪存,它使用1位单数据速率(SDR)模式;对于HyperFlash,则使用8位模式。

Tip📌:
  QuadSPI控制器支持双数据速率(DDR)和单数据速率(SDR)两种高速操作模式。DDR模式在每个时钟周期内能够在上升沿和下降沿两次采样数据,而SDR只在每个时钟周期的一个边沿上采样,这样DDR能够提供更高的数据传输速率。

  最终配置阶段: 在读取了闪存的重配置数据之后,根据这些数据重新配置QuadSPI控制器,实现更优的性能。

  此外,QuadSPI控制器支持通过AHB(高级微控制器总线架构)接口或IP(外设接口)接口来读取数据。AHB接口是一种高性能的总线接口,用于高速数据传输。BootROM,则只支持通过AHB接口读取数据,而不支持通过IP接口。

  当然,BootROM在启动过程中不支持对QuadSPI闪存进行任何写操作。这意味着在启动时,BootROM只能读取闪存中的数据,用于加载和执行系统必需的代码,BootROM无法修改闪存内容。这是一种安全措施,确保启动过程中闪存的内容不会被篡改,保障系统的引导安全和可靠性。

  简单来说,BootROM利用QuadSPI接口从外部闪存启动时会先确定闪存类型,将QuadSPI控制器设置为低速模式,然后根据读取到的flash信息重新调整QuadSPI控制器的配置。

  BootROM在这个过程中使用了一系列配置参数,这些参数需要使用方提前通过RCON寄存器或者fuses设置。以下是一些关键的配置参数,以及它们如何通过RCON寄存器或fuses设置:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tip📌:
  BootROM载入应用程序镜像的时候会起一个500ms的定时器,用户需要确保提供的镜像大小合适,以便BootROM能够在这个时间内完成下载操作。
  在S32G3系列芯片中,BOOT_CFG1寄存器位于地址234h,它的位结构与RCON寄存器(重置控制寄存器)的31:0位有逐位对应关系。具体来说,这意味着BOOT_CFG1寄存器中的每一位都可以直接映射到RCON寄存器中的相应位。

2.2 IO配置

  BootROM允许用户通过IO配置覆写来修改默认的IOMUX配置,通过设置BOOT_CFG3[9]这个配置位来启用覆写。如果这个位被设置,BootROM将根据BOOT_CFG3中的fuses的值应用新的IOMUX配置。这意味着,用户可以预先设定fuses值,以覆盖BootROM固件中默认的IOMUX设置,从而允许硬件在启动时使用用户指定的IOMUX配置。

Tip📌:
  IOMUX是指某些微控制器或处理器芯片上的引脚可以被配置成不同的功能。例如,一个引脚可以用作GPIO(通用输入输出),也可以用作特定功能的接口,如SPI时钟线。

  QuadSPI IOMUX引脚的配置如下表所示:

在这里插入图片描述

  这个特性对于QuadSPI的PORT A和PORT B都是适用的,这提供了进一步的灵活性。例如,如果一个系统设计要求不同于BootROM默认提供的QuadSPI接口配置,开发者可以通过设置相应的fuses值来实现所需的配置。

  总之,该特性使得在系统启动时,通过BootROM,能够对QuadSPI IOMUX配置进行定制化的修改,从而适应特定的系统需求或优化性能。通过修改BOOT_CFG3fuses的值,并确保BOOT_CFG3[9]被启用,开发者可以在硬件层面上调整和优化系统的启动配置。

2.3 时钟配置

  QuadSPI的时钟来源与MC_CGM_0(模块时钟生成模块0)中的CLK_MUX_12(时钟复用选择器12)有关。这个选择器可以从内部参考时钟(IRC)或外设相位锁定环(PERIPH_PLL)的分频器DFS1选择QSPI_CLK时钟源。如下图所示:

在这里插入图片描述

  具体的过程可以分为初始配置阶段和最终配置阶段:

  1. 初始配置阶段:

    • BootROM在启动时为QuadSPI操作配置时钟。
    • BootROM尝试通过PLL(PERIPH_PLL)和它的分频器DFS1来生成一个频率为30 MHz的QSPI_1X_CLK。
    • 如果PLL和DFS能够成功锁定在30 MHz,那么时钟源就会切换至PLL。
    • 如果PLL-DFS没能成功锁定,QuadSPI的时钟就会来自于FIRC(快速内部参考时钟),导致QSPI_1X_CLK的频率为FIRC的一半。
  2. 最终配置阶段:

    • 在系统启动过程结束时,QuadSPI读操作的时钟需求是根据用户提供的QuadSPI重新配置数据来确定的。
    • 如果BootROM无法生成这些数据中指定的所需时钟,它会跳过用户提供的配置。
    • 在这种失败的情况下,BootROM会继续使用默认配置进行读操作,并且QuadSPI的时钟将继续来自于FIRC。

  这个过程确保了,即使在自定义的时钟配置失败时,BootROM也能够回退到一个默认的、已知稳定的配置,允许系统继续执行读取操作。这是一种健壮的设计选择,可以在启动过程中遇到意外时钟配置问题时提供稳定性和可靠性。

2.4 QuadSPI具体配置参数

  QuadSPI配置参数需要放置到外置flash的0x200h位置,具体配置项如下所示:

在这里插入图片描述
在这里插入图片描述

  以上提到在初始配置阶段之后,为了获得更好的性能,可能需要使用默认设置重新配置flash。为了支持这一需求,BootROM提供了一种机制,允许通过一系列特定的命令(CMDs)来操作和配置外部闪存。这些命令及其关联数据被编码成12字节的格式(包括要写入闪存配置寄存器的数据、状态寄存器地址等重要配置信息),这12字节可以划分为三个配置字,其组成结构如下所示:

配置字1(Byte0~Byte3):指令配置
在这里插入图片描述

配置字2(Byte7~Byte4):外置flash配置寄存器/状态寄存器的地址

在这里插入图片描述

配置字3(Byte11~Byte8):需要发送到flash的具体数据
  小端模式存储的4字节数据。

  每个命令及其相关数据都通过上述结构进行编码,并且每个命令占用12字节,最终一条条指令构成指令数组。BootROM会解析数组,直到遇到CMD字段值为0的项。CMD字段为0表示命令列表的结束。通过连续的命令序列,按顺序对闪存进行配置,直到所有必要的设置完成。

Tip📌:
  操作限制:这种配置方式仅用于写入闪存的配置寄存器,并不适用于在闪存数组中执行操作(比如读取或写入数据)。
  此外,所有的闪存配置操作都必须通过上述结构的命令在1-bit SPI模式下执行。这意味着在执行这些配置命令时,通信是通过标准的单线SPI接口进行的,而不是使用可能支持的更高速的多线接口模式。

  总之,这一机制允许系统在启动时或在需要时对闪存进行精细的配置,以确保最佳的性能和兼容性。通过提供一种灵活但结构化的方式来传递配置命令,系统能够以一种可靠和一致的方式调整闪存的行为,从而满足特定的应用需求或性能目标。

2.5 系统重置后BootROM对闪存的要求

  每次系统重置后,BootROM要求连接的闪存需要处于一种配置模式,使得闪存能够响应SPI读取命令。这意味着在重置发生时,闪存必须已经准备好接受来自BootROM的命令,特别是要能够快速响应读操作。

2.6 应用程序对闪存配置的影响

  为了确保系统的正常启动和操作,BootROM需要能够在每次设备重置后通过SPI(串行外设接口)命令读取连接的flash。

  • 如果应用程序更改了闪存的配置,使得闪存需要重置才能切换回默认的SPI模式,那么在设备重置时,应用程序必须确保闪存被重置。也就是说,应用程序需要采取措施,确保在重置发生时,闪存能够恢复到可以正常工作的状态。

  • 如果应用程序更改了闪存的配置,使得即使在重置后,闪存也不会自动恢复到SPI模式,那么应用程序必须采取以下两种策略之一:

    1. 确保进入SPI模式:在每次重置之前,应用程序必须确保闪存进入SPI模式。这可能意味着在每次重置前发送特定的命令或配置步骤,以确保闪存能够在重置后迅速响应。
    2. 使用不需要模式变更的命令:应用程序可以选择使用那些不依赖于SPI模式的命令(CMDs)。这样,即使闪存不在SPI模式下,应用程序仍然能够与其交互。

  总之,这些要求确保了无论设备如何重置或闪存如何被配置,BootROM总是能够正常地通过SPI命令与闪存通信,这对于确保设备能够稳定启动和运行是至关重要的。开发者需要在设计他们的应用程序和系统时考虑到这些要求,以确保兼容性和可靠性。

基于以上内容,给出基于QuadSPI的boot流程如下图所示:

在这里插入图片描述

三、基于μSDHC接口的boot

3.1 启动配置概述

  BootROM能够从SD、MMC、eMMC卡启动,支持不同的数据传输速率模式。这种多样性的支持使得BootROM可以根据实际的硬件配置和需求,从多种存储介质上启动。BOOT_CFG1[7:5] 是控制通过μSDHC接口从SD卡启动的配置位。SDHC控制器的配置是通过eFuseRCON GPIO引脚提供的。

  BootROM允许覆盖一些默认的μSDHC IOMUX配置设置。IOMUX(输入/输出复用)配置决定了物理引脚如何映射到设备的不同功能上。通过所谓的“pad override scheme”,可以基于BOOT_CFG3[9]的fuse值来应用自定义的IOMUX配置。如下表所示:

在这里插入图片描述

  综上说明了BootROM如何通过灵活的配置选项支持从SDHC接口启动,以及如何通过eFuse和GPIO引脚提供的信息对SDHC控制器进行初始配置。此外,还介绍了如何通过覆盖默认的IOMUX配置来进一步定制启动过程。

3.2 μSDHC时钟配置

  SDHC_CLK是μSDHC接口的工作时钟,它来源于CGM_0(时钟管理单元0)中的时钟多路复用器14。对于SDHC_CLK,有两种可能的时钟源:FIRC(快速内部参考时钟)和PERIPHERAL_PLL_DFS3(外设相位锁定环的直接频率合成器3)。如下图所示:

在这里插入图片描述

Tip📌:
  FIRC通常是一个固定频率的内部振荡器,提供稳定但可能不是非常精确的时钟信号;而PERIPHERAL_PLL_DFS3是一个通过PLL(相位锁定环)生成的时钟信号,可以提供更高精度和可配置的输出频率。

——BootROM的时钟切换策略

  启动时,BootROM首先尝试锁定外设相位锁定环的直接频率合成器(即PERIPHERAL_PLL_DFS3)。如果成功,BootROM将SDHC_CLK从默认的FIRC时钟源切换到PLL时钟源。这意味着系统在启动初期可能会使用FIRC作为时钟源,但一旦PLL稳定并锁定,系统会转而使用由PLL提供的时钟信号,因为这通常会提供更优的性能和稳定性。

  综上阐明了μSDHC接口的时钟配置过程,包括时钟源的选择以及BootROM如何优先考虑使用PLL时钟源以提高系统性能和稳定性。

3.3 μSDHC支持的数据传输速率

  在从SD卡启动时,仅支持3.3V的高速(High Speed)和默认速度(Default Speed)数据传输模式。BootROM不支持切换到1.8V供电的SDR(单数据速率)模式。SDR模式通常能提供更高的数据传输速率,但因为在启动时不支持1.8V电压,这些模式在系统启动阶段不可用。在卡识别模式下,时钟频率保持在400KHz以下。这是SD卡初始化和识别过程中的标准做法,以确保与各种SD卡的兼容性。

在这里插入图片描述

Tip📌:
  一旦BootROM完成启动并将控制权交给应用程序,应用程序可以切换到SDR(单数据速率)模式。SDR模式通常可以提供更高的数据传输速率,适合数据读写要求较高的应用。

——BOOT_CFG1寄存器在此处的作用

  • BOOT_CFG1[19]:这个位控制使用SD卡时的速度模式选择。具体来说,应用程序可以通过配置这个位来选择“默认速度”(Default Speed)或“高速”(High Speed)模式。这两个模式适用于SD卡,影响其数据传输速率。默认速度通常为25MHz,而高速模式可以达到50MHz。

  • BOOT_CFG1[22:19]:这组位控制在通过μSDHC接口使用MMC(多媒体卡)或eMMC(嵌入式多媒体卡)时的速度模式选择。通过设置这些位,应用程序可以选择适合其性能需求的速度模式,进一步提高数据传输效率。

在这里插入图片描述

  在启动阶段,由于不支持1.8V的电压,系统只能使用3.3V的高速和默认速度模式。然而,在应用程序获得控制权后,可以根据具体需求选择更高效的传输模式(如SDR模式),以满足更高数据速率的要求。这种灵活的配置能力允许开发者根据应用的性能需求进行优化。总结来说,BootROM在启动时提供了一些基本的接口配置,而一旦控制权转移到应用程序,开发者可以利用BOOT_CFG1寄存器进行更细致的配置,从而选择适合其应用的速度模式,提高系统性能。

3.4 μSDHC启动流程

  1. 启动环节

在这里插入图片描述

  1. 电压校验环节

在这里插入图片描述

  1. 芯片初始化环节

在这里插入图片描述

  1. 数据读取环节

在这里插入图片描述

  1. 使用MMC作为boot设备时的设备初始化环节

在这里插入图片描述

  1. 使用MMC作为boot设备时的电压校验环节

在这里插入图片描述

四、其他机制

4.1 Fail-Safe(故障安全机制)

  在BootROM执行过程中可能发生各种错误,例如程序错误、闪存故障、PCB故障、硬件模块超时、认证失败等。当出现错误时,BootROM会执行功能重置。如果由于持续的错误条件导致多次重置(≥ 8次),BootROM将无法将控制权传递给应用程序。这时,BootROM进入Serial Boot模式(推荐阅读《S32G3系列芯片Serial Boot功能详解!》),允许通过支持的串行接口下载应用程序代码。这种机制被称为故障安全(Fail-Safe)

  应用程序应在启动时检查重置来源和重置次数,并保存这些信息以供后续参考。若不清除这些重置信息,持续的应用程序故障可能导致BootROM误认为是自身错误,从而进入故障安全模式。

4.2 Boot Target(启动目标)

  启动目标是负责执行应用程序代码的核心。你可以选择在Cortex-M7_0Cortex-A53_0核心上启动应用程序。对于安全应用(使能secure boot),启动目标必须是Cortex-M7_0。启动目标的设置需要在IVT启动配置字(BSW)中提供设置。如果设置无效,将触发功能重置。

4.3 Boot Target Watchdog(启动目标看门狗)

  启动目标看门狗(SWT_0)是负责监控运行在启动目标上的应用程序代码的看门狗。可以通过在IVT启动配置字(BSW)中设置字段来启用看门狗。

  当BOOT_SEQ = 0时,看门狗在启用启动目标之前由BootROM启用。如果BOOT_SEQ = 1,HSE_H固件将配置看门狗。一旦看门狗启用,客户应用程序必须及时“喂狗”,否则将导致功能重置。

4.4 Standby Boot(待机启动)

  从待机模式唤醒时,将触发BootROM执行。根据唤醒源,BootROM可能执行快速启动(Fast Boot)或完全启动(Full Boot)。也就是说,决定执行快速启动还是完全启动的依据是触发从待机状态唤醒的唤醒源。如果唤醒源被配置为执行完全启动,BootROM将执行完全启动操作。反之,如果唤醒源配置为执行快速启动,则BootROM将进行快速启动。

Tip📌:
  如果有多个唤醒源在唤醒状态中被触发,并且其中一个唤醒源被配置为进行完全启动,则BootROM将执行完全启动。

——快速启动

  启动所用的IVT采用与正常的IVT相同的格式,但位置固定在待机RAM的开头(24000000h)。快速启动仅支持DCD操作和应用程序启动,不支持自测或HSE_H固件。在快速启动时,BootROM只支持BOOT_SEQ = 0,这表示要执行非安全启动。如果BOOT_SEQ = 1,BootROM会发出重置信号。

  因此,在进入待机模式之前,应用程序应做好以下准备:

  • 在待机RAM的地址(24000000h)写入IVT。
  • 根据需要写入DCD。
  • 将应用程序代码存储在待机RAM中,以确保其在待机模式期间保持有效。

Tip📌:
1.在快速启动过程中,BootROM不支持从QuadSPI或SD/MMC/eMMC卡获取数据。
2.所有IVT中的指针必须指向待机RAM中的地址。BootROM在快速启动时不会对boot、DCD或应用程序进行任何认证。

——完全启动

  当BootROM接收到要求进行完全启动的请求时,它将执行正常的启动操作,就像任何重置后的启动过程一样。

  基于以上内容,从Standby模式下被唤醒后的boot流程如下所示:

在这里插入图片描述

>>>>>>>>> 返回专栏总目录 《S32G3系列芯片——Boot详解》<<<<<<<<<

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

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

相关文章

审稿超慢的顶刊,年年投稿量爆涨?年发文量1800+,国人投稿占优!

点击关注&#xff1a;关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; &#x1f525; &#x1f525; &#x1f525; &#x1f525; ELSEVIER旗下1区TOP刊 今天小编给大家介绍的是一本计算机人工智能领域的期刊《Engineering Applications of…

腾讯云AI代码助手:智能AI代码助手 ,新一代的高效代码开发辅助工具

前言 近些年是一个科技大爆发的时代&#xff0c;自从大模型发布以来越来越多的科技产品出现。例如去年的智能编码助手自出现以来&#xff0c;各大老牌大厂腾讯&#xff0c;百度 阿里也都紧随其后&#xff0c;智能编码助手的出现可以说大大的节省了我们写一些冗余代码的时间成本…

滑动窗口 | Java | (hot100) 力扣 3

力扣 3.无重复字符的最长子串 暴力法&#xff1a;双层for循环&#xff0c;i-j的字符查重 滑动窗口&#xff1a;因为这题被分在这个类别里&#xff0c;那么已知要用滑动窗口&#xff0c;思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点&#xff1a;特别容易…

达梦数据库的系统视图v$sql_stat

达梦数据库的系统视图v$sql_stat 达梦数据库的系统视图V$SQL_STAT用于记录当前正在执行的SQL语句的资源开销。这个视图需要启用监控功能&#xff08;即ENABLE_MONITOR1&#xff09;才开始监控。针 对 63~68 列 中 的 监 控 项 &#xff0c; 还 需 开 启 参 数 MONITOR_SQL_EXE…

通过这五个问题,带你深入了解中国式报表

一、什么是中国式报表&#xff1f; 中国式报表&#xff0c;顾名思义具有中国特色的报表&#xff0c;通常指的是中国企业/机构在财务和业务报告方面的特有风格和规范。 二、中国式报表有什么特点&#xff1f; 一句话就可以概括中国式报表&#xff1a;结构复杂、数据量大的一种…

计算机毕业设计选题推荐-高校大学生竞赛项目管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

8.13-LVS的nat模式+DR模式

LVS 一、nat模式 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01&qu…

【netty系列-07】Netty中组件初步了解和基本使用

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

Java语言程序设计基础篇_编程练习题*16.20(累计秒表)

目录 题目&#xff1a;*16.20&#xff08;累计秒表&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;*16.20&#xff08;累计秒表&#xff09; 编写一个程序&#xff0c;模拟一个秒表&#xff0c;如图16-45a所示。当用户单击Start按钮时&#xff0c;按钮的标签变为Pa…

AHB协议解读

1.定义 AHB或者ASB系统总线在需要做大量数据传送的模块之间提供了高带宽的接口。同时&#xff0c;外围总线APB在AHB或者ASB和低带宽的外围设备之间提供了通信的桥梁。所以APB是AHB或者ASB的二级扩展总线 2.拓扑结构 2.1 Master: 可以是CPU、DMA控制器、外设控制器等。Maste…

国内外AI大语言模型推荐分享 除了Chatgpt 你会选择哪个模型?

当前AI技术飞速发展&#xff0c;Ai已经成为许多人日常工作和生活中不可或缺的工具&#xff0c;特别是以大语言模型为首的人工智能&#xff0c;它能够与我们进行自然语言对话&#xff0c;支持多种应用场景&#xff0c;如技术问答、代码生成、内容创作等&#xff0c;而且适用于各…

js入门经典学习小结

简介 js是解释型语言&#xff0c;虽然名字有java&#xff0c;但和java&#xff0c;c等编译型语言不同&#xff0c;它是解释型的&#xff0c;类似perl&#xff0c;py 历史 90年代最早js 1.0版本是网景navigator2引入的 然后欧洲计算机制造商协会&#xff08;ECMA&#xff09…

链上数字供应链高级研修班举办 隆道总裁吴树贵分享供应链数字化实践

8月8日-8月9日&#xff0c;链上数字产业研究院联合中国物流与采购联合会举办的“链上数字供应链高级研修班”在上海开班&#xff0c;隆道公司总裁吴树贵作为培训讲师出席&#xff0c;并系统地分享了供应链理论及数字化转型创新实践经验。 “链上数字供应链高级研修班”旨在贯彻…

TCP详解(一)报文详情/MSS/MTU

本文旨在介绍TCP的报文格式详情和传输层、链路层的字节数限制 1 TCP 协议的报文格式 TCP 报文段包括协议首部和数据两部分&#xff0c;协议首部的固定部分是 20 个字节&#xff0c;头部是固定部分&#xff0c;后面是选项部分。 1.1 端口号 16位源端口&#xff1a;发送方主机…

笔记:在WPF中如何控件级全局事件和应用程序级全局事件

一、目的&#xff1a;在WPF中如何控件级全局事件和应用程序级全局事件 二、实现 应用程序级全局事件 //注册应用程序级全局事件 EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click)); 如上代码既会注册全局Butt…

Linux--C语言之循环结构

文章目录 一、循环结构&#xff08;一&#xff09;循环的概念&#xff08;二&#xff09;循环的类型&#xff08;三&#xff09;循环的构成&#xff08;四&#xff09;当型循环的实现while死循环 &#xff08;五&#xff09;for...总结死循环 &#xff08;七&#xff09;循环实…

数据结构:链式二叉树(2)

目录 前言 一、节点个数 1.1 二叉树的节点个数 1.2 二叉树叶子节点个数 1.3 二叉树第k层节点个数 二、查找值为x的节点 三、判断二叉树是否为完全二叉树 前言 上一篇 链式二叉树&#xff08;1&#xff09;&#xff0c;主要是讲了了一些链式二叉树的实现基础以及链式二叉…

day28 代码随想录 | 贪心 买卖股票 跳跃游戏 K次取反

买卖股票的最佳时机 II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。返回 你能获得的 …

测绘工程项目管理系统,为测绘企业量身定制!测绘项目一体化管理

在日益复杂的测绘工程项目管理领域&#xff0c;高效、精准的信息化管理成为提升工作效率、降低运营成本的关键。企智汇软件&#xff0c;作为一款专为勘察、设计、监测、测绘等多元化工程项目量身打造的管理系统&#xff0c;正逐步成为行业内的佼佼者。 企智汇测绘管理系统深度…

Java FX 学习

声明&#xff1a;参考视频 一. Stage与Scene 舞台与场景&#xff1a;JavaFX应用程序将Ul容器定义为舞台&#xff08;Stage&#xff09;与场景&#xff08;Scene&#xff09;Stage类是顶级容器&#xff0c;它对应于窗体&#xff0c;其内容由Scene决定。Scene类是所有可视化内容…