【ARM Cache 与 MMU 系列文章 7.6 -- ARMv8 MMU 配置 寄存器使用介绍】


请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】
及【嵌入式开发学习必备专栏】


文章目录

    • MMU 转换控制寄存器 TCR_ELx
      • TCR_ELx 概览
      • TCR_ELx 寄存器字段详解
      • TCR 使用示例
        • Normal Memory
        • Cacheable
        • Shareability
    • MMU 内存属性寄存器 MAIR_ELx
      • MAIR_ELx 寄存器结构
      • 内存属性字段
        • Device Memory
        • Normal Memory
      • 使用实例
    • MMU 地址翻译表基址寄存器 TTBR0/1_ELx
      • 寄存器结构
      • TTBR0_ELx 编程示例
    • MMU 使能寄存 SCTLR_EL3

ARM MMU 的配置主要用到了下面4个寄存器

MMU 转换控制寄存器 TCR_ELx

在ARMv8/v架构中,TCR_ELx(Translation Control Register at Exception Level x)寄存器用于控制地址转换的操作。这些控制包括页表的大小、地址空间的大小、以及内存区域的可缓存性和共享性等方面。TCR_ELx寄存器对于配置和优化系统的内存管理至关重要。
在这里插入图片描述

  • bit[5:0]: 用于配置使用多少位地址宽度,比如,要使用40位的地址宽度,那么 T0SZ=64-40=24.
  • bits [9:8] Inner cacheability attribute for memory associated with translation table walks
    • 0b00 Normal memory, Inner Non-cacheable.
    • 0b01 Normal memory, Inner Write-Back Read-Allocate Write-Allocate Cacheable.
    • 0b10 Normal memory, Inner Write-Through Read-Allocate No Write-Allocate Cacheable.
    • 0b11 Normal memory, Inner Write-Back Read-Allocate No Write-Allocate Cacheable.
  • bits [11:10]:Outer cacheability attribute for memory associated with translation table walks:
    • 0b00 Normal memory, Outer Non-cacheable.
    • 0b01 Normal memory, Outer Write-Back Read-Allocate Write-Allocate Cacheable.
    • 0b10 Normal memory, Outer Write-Through Read-Allocate No Write-Allocate Cacheable.
    • 0b11 Normal memory, Outer Write-Back Read-Allocate No Write-Allocate Cacheable.
  • bits [13:12]:由于 translation table 经常被访问且只需要在cluster内部使用所以可以将其配置为 Inner Shareable,cache coherent 可以避免掉对cache的操作。
    • 0b00 Non-shareable.
    • 0b10 Outer Shareable.
    • 0b11 Inner Shareable.
  • bit[15:14]: 用于配置物理页颗粒(Granule size )的大小,比如要使用4K的页面,就需要将这两位配置为0即可;
    • 0b00 4KB.
    • 0b01 64KB.
    • 0b10 16KB.
  • bit[18:16]: 用于配置物理空间地址大小:
    • 0b000 32 bits, 4GB.
    • 0b001 36 bits, 64GB.
    • 0b010 40 bits, 1TB.
    • 0b011 42 bits, 4TB.
    • 0b100 44 bits, 16TB.
    • 0b101 48 bits, 256TB.
    • 0b110 52 bits, 4PB.

TCR_ELx 概览

TCR_ELx寄存器中包含多个字段,这些字段影响地址转换和内存访问的不同方面。以下是一些主要字段的简介:

  • T0SZT1SZ: 分别控制第0级和第1级的输入地址空间的大小。它们指定的是地址空间顶部未使用的位数,从而间接地定义了地址空间的大小。
  • TG0TG1: 分别设置第0级和第1级页表的粒度(页大小),比如4KB、16KB或64KB。
  • IPS: 设置物理地址位宽,例如32位、36位、40位等,影响可访问的物理内存范围。
  • SH0SH1: 定义第0级和第1级页表条目的Shareability属性,指示内存区域是否可以在多个处理器核心间共享。
  • ORGN0, ORGN1, IRGN0, IRGN1: 分别设置第0级和第1级页表的Outer和Inner缓存策略,包括Non-cacheable、Write-Back、Write-Through等。

TCR_ELx 寄存器字段详解

以下是TCR_ELx中一些关键字段的更详细说明:

  • T0SZT1SZ(Translation Size): 它们确定了两个不同的转换表(页表)覆盖的虚拟地址空间的大小。例如,如果T0SZ为25,则第0级的地址空间大小是[2^(64-25)]字节。
  • TG0TG1(Translation Granule): 这些值确定页表项所描述的页的大小。常见的页大小有4KB、16KB和64KB。页的大小影响页表的总体层级和每个页表项所能覆盖的内存大小。
  • IPS(Intermediate Physical Address Size): 这个字段指定系统使用的最大物理地址位数。较大的物理地址允许系统访问更多的物理内存。
  • SH0SH1(Shareability): 这些字段决定内存访问是否可以在多个处理器之间共享。共享性设置有助于在多核处理器系统中维护内存的一致性。
  • ORGN0, ORGN1, IRGN0, IRGN1(Outer and Inner Cacheability): 这些字段控制缓存策略,包括是否缓存以及使用何种缓存模式(如Write-Back或Write-Through)。

TCR 使用示例

假设需要为一个具有64KB页大小、使用48位虚拟地址和40位物理地址的系统配置TCR_EL1

TCR_EL1.T0SZ = 16     // 设置虚拟地址空间为48位(64 - 16)
TCR_EL1.TG0 = 2       // 设置第0级页表粒度为64KB
TCR_EL1.IPS = 2       // 设置物理地址大小为40位
TCR_EL1.SH0 = 3       // 设置第0级页表条目为内部共享
TCR_EL1.ORGN0 = 1     // 设置第0级页表条目的外部缓存策略为Write-Back
TCR_EL1.IRGN0 = 1     // 设置第0级页表条目的内部缓存策略为Write-Back

此配置示例中,我们配置了一套页表来覆盖48位的虚拟地址空间,使用64KB的页大小,并且页表条目使用内部共享和Write-Back缓存策略。

Normal Memory

"Normal Memory"是对比于"Device Memory"的一种内存类型。Normal Memory通常用于存储应用数据和代码,而Device Memory则用于映射到设备寄存器。Normal Memory允许缓存和重新排序访问,从而提高效率。

Cacheable

Cacheable属性指示内存访问可以被缓存。这种属性可以进一步细分为以下类型:

  • Write-Back (WB) Read-Allocate Write-Allocate Cacheable: 这是最常见的缓存类型,它在读操作时分配缓存行,在写操作时也分配缓存行。在写操作时,数据首先被写入到缓存中,然后在某个时刻异步地被写回到主存储器。这种方式可以减少访问主存储器的次数,提高性能。
  • Write-Through (WT) Cacheable: 在这种模式下,数据在写操作时同时写入缓存和主存储器。这确保了主存储器中的数据总是最新的,但可能会牺牲一些写操作的性能。
Shareability

Shareability属性定义了内存区域的共享级别。ARMv8定义了三种共享级别:

  • Non-Shareable: 这表示内存区域不被多个处理器核心共享。在单核心系统中,或者在不需要在核心之间共享该内存区域的情况下,可以使用此属性。
  • Outer Shareable: 这表示内存区域可以在一组处理器核心之间共享,这组核心共享同一个外部(Level 2 或更高级别)缓存。
  • Inner Shareable: 这表示内存区域可以在一组处理器核心之间共享,这组核心共享同一个内部(Level 1)缓存。这对于确保内部缓存中的数据一致性非常重要,特别是在多核处理器系统中。

MMU 内存属性寄存器 MAIR_ELx

在ARMv8架构中,MAIR_ELx寄存器(Memory Attribute Indirection Registers at Exception Level x)用于定义和配置内存属性表。这些寄存器允许软件定义多种内存属性类型,例如缓存策略和访问权限,这对于物理地址的属性定义至关重要。

在这里插入图片描述
MAIR_ELx寄存器支持多个异常级别,如MAIR_EL1MAIR_EL2MAIR_EL3,分别对应不同的异常级别使用。寄存器中的每个字段与转换表(Translation Table)中的属性字段相关联,这些属性字段用于描述如何访问对应的物理内存。

MAIR_ELx 寄存器结构

MAIR_ELx寄存器包含多个字段,每个字段8位,总共可以配置8种不同的内存属性。这意味着在转换表项(Translation Table Entry, TTE)中可以引用这8种配置中的任意一种来指定对应内存区域的访问特性。

字段格式如下

  • Attr0[7:0]
  • Attr1[15:8]
  • Attr2[23:16]
  • Attr3[31:24]
  • Attr4[39:32]
  • Attr5[47:40]
  • Attr6[55:48]
  • Attr7[63:56]

每一对Attrn字段定义了一种内存类型,包括其缓存策略和访问权限。每个Attrn字段内部分为两个子字段,高四位和低四位,分别代表不同的属性。

内存属性字段

Armv8-A和Armv9-A中有两种内存类型:普通内存(Normal Memory)和设备内存(Device Memory)。普通内存类似于RAM,Flash或者ROM这类的内存,代码只能放在普通内存中。设备内存类型用于描述外设。外设寄存器通常称为内存映射 I/O (MMIO)。

AttrMeaning
0b0000dd00Device memory. See encoding of ‘dd’ for the type of Device memory.
0b0000dd01If FEAT_XS is implemented: Device memory with the XS attribute set to 0.See encoding of ‘dd’ for the type of Device memory.
0b0000dd1xUNPREDICTABLE
0booooiiii, (oooo != 0000 and iiii != 0000)Normal memory. See encoding of ‘oooo’ and ‘iiii’ for the type of Normal Memory.
0b01000000If FEAT_XS is implemented: Normal Inner Non-cacheable, Outer Non-cacheable memory with the XS attribute set to 0.
0b10100000If FEAT_XS is implemented: Normal Inner Write-through Cacheable, Outer Write-through Cacheable, Read-Allocate, No-Write Allocate, Non-transient memory with the XS attribute set to 0.
0b11110000If FEAT_MTE2 is implemented: Tagged Normal Inner Write-Back, Outer Write-Back, Read-Allocate, Write-Allocate Non-transient memory. Otherwise, UNPREDICTABLE.
0bxxxx0000, (xxxx != 0000, xxxx != 0100, xxxx != 1010,xxxx != 1111UNPREDICTABLE
  • attr 的值为 0b0000dd01
    这表示设备内存,具体行为取决于dd位的编码,该设备内存的XS属性被设置为 0。

    • 如果支持FEAT_XS特性,则表示带有XS属性设置为0的设备内存。
    • 根据dd的编码,类型的设备内存不同,可能是nGnRnE、nGnRE、GRE或nGRE(这些是ARM定义的设备内存类型,分别对应于不同的访问和共享属性)。
    • 如果不支持FEAT_XS特性,则结果是不可预测的。

  • attr 的值为 0b01000000

    • 如果支持FEAT_XS特性,则表示内部(inner)非缓存、外部(outer)非缓存的正常内存,且XS属性被设置为0。
    • 这种配置通常用于需要绕过缓存直接访问内存的情况,确保数据的实时性。
    • 如果不支持FEAT_XS特性,则结果是不可预测的。

  • attr 的值为 0b10100000

    • 如果支持FEAT_XS特性,则表示内部(inner)和外部(outer)都设置为写通(write-through)缓存策略的正常内存。这种配置支持读取分配(read-allocate),但不支持写入分配(no-write allocate),且被视为非瞬态内存。
    • 这种配置有助于实现一定程度的缓存,同时保持一定的数据一致性,因为所有的写操作都会即时反映到主存中。
    • 如果不支持FEAT_XS特性,则结果是不可预测的。

  • attr 的值为 0b11110000
    • 如果支持FEAT_MTE2特性,则表示带有标签的正常内存,其中内部(inner)和外部(outer)都设置为写回(write-back)缓存策略。这种配置支持读取分配和写入分配(read-allocate, write-allocate),被视为非瞬态内存。
    • 这种配置提供了最高级别的缓存性能,适用于对性能敏感的应用场景。
    • 如果不支持FEAT_MTE2特性,则结果是不可预测的。

关于 FEAT_MTE2 及 FEAT_XS 介绍见:【ARM Cache 与 MMU 系列文章 7.6.1 – ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】

Device Memory

设备有四种子类型,具有不同的限制等级。下面的子类型限制比较宽松:

  • Device-GRE
  • Device-nGRE
  • Device-nGnRE
  • Device-nGnRnE: 这个子类型限制最为严格。

4种类型的编码如下表所示:
dd 编码原则

ddMeaning
0b00Device-nGnRnE memory
0b01Device-nGnRE memory
0b10Device-nGRE memory
0b11Device-GRE memory

Device后面的字母具有不同的含义:

  • 聚合(G,nG):访问可以聚合(G)或者不聚合(nG),聚合意味着可以对同一位置的多次访问合并为一次访问,或者将多次较小的访问合并为一次较大的访问。
  • 重排(R,nR):这指定对于同一外设可进行重排(R)或者不重排(nR)访问。当允许重排访问时,限制同普通内存一样。
  • 提前写应答(E,nE):这决定了何时被认为写完成。如果允许提前写应答,一旦其他观察者可见,在到达实际目的地之前,访问可以视为写完成。例如,一旦数据写到写缓冲区,其他PE就可以看到这些数据。当不允许提前写应答时,数据必须到达最终目的地。

有两个示例:

  • Device-GRE:允许聚合、重排和提前写应答访问;
  • Device-nGnRnE:不允许聚合、重排和提前写应答访问。

聚合允许对相似位置的内存访问合并到单个总线事务中,从而优化访问。提前写应答意味着当数据发送到缓冲区后,总线是否可以发送写完成确认标志。这样即使外设还未收到写动作,所有PE均已能观察到此次写入。

Normal Memory

‘oooo’ 编码原则:

‘oooo’Meaning
0b0000See encoding of Attr
0b00RW, RW not 0b00Normal memory, Outer Write-Through Transient
0b0100Normal memory, Outer Non-cacheable
0b01RW, RW not 0b00Normal memory, Outer Write-Back Transient
0b10RWNormal memory, Outer Write-Through Non-transient
0b11RWNormal memory, Outer Write-Back Non-transient

R = Outer Read-Allocate policy, W = Outer Write-Allocate policy.

‘iiii’ 编码原则:

‘iiii’Meaning
0b0000See encoding of Attr
0b00RW, RW not 0b00Normal memory, Inner Write-Through Transient
0b0100Normal memory, Inner Non-cacheable
0b01RW, RW not 0b00Normal memory, Inner Write-Back Transient
0b10RWNormal memory, Inner Write-Through Non-transient
0b11RWNormal memory, Inner Write-Back Non-transient

R = Inner Read-Allocate policy, W = Inner Write-Allocate policy.

在’oooo’ 和 ‘iiii’ 中 RW 含义如下:

R or WMeaning
0b0No Allocate
0b1Allocate
  • Read Allocate: 当缓存因读操作而缺失(即所需的数据不在缓存中)时,将从更低层次的存储(比如主存)加载数据到缓存中。这种策略意味着缓存会尝试在读操作时加载所需的数据块。

  • Write Allocate (也称为Write-Read Allocate): 当缓存因写操作而缺失时,缓存行首先被加载到缓存中,然后再执行写操作。这种策略用于优化那些后续可能对同一地址进行读操作的情形,因为数据已经被加载到缓存中了。

  • No Read Allocate: 当缓存因读操作而缺失时,数据直接从更低层次的存储读取,但不加载到缓存中。这意呼着缓存不会因为这样的读操作而更新。这种策略可能适用于那些一次性读取或不重复读取的数据,以避免缓存中有用数据的替换。

  • No Write Allocate: 当缓存因写操作而缺失时,修改直接写入到更低层次的存储,而不是首先加载缓存行然后执行写操作。这种策略减少了因为写操作引起的不必要的缓存行加载,特别是对于那些不再被读取的数据。

使用实例

配置MAIR_EL1为最常见的例子,下面是一个典型的配置过程:

  1. 配置非缓存访问(设备内存):
// Attr0设为0x00:设备内存,非缓存,非缓冲 
  1. 配置写回缓存(正常内存):
// Attr1设为0xFF:正常内存,Write-Back, Read & Write Allocate 

配置完成后,转换表项可以通过指定的属性索引(Attrn)来使用这些定义。

MMU 地址翻译表基址寄存器 TTBR0/1_ELx

TTBR0_EL3寄存器负责存储阶段1(Stage 1)地址翻译表(页表)的基地址。页表用于将虚拟地址映射到物理地址。这个寄存器包含了页表基地址(BADDR)的大部分位,但是实际使用的位数和页表的对齐要求取决于多个因素。

在这里插入图片描述
TTBR0_ELx(Translation Table Base Register 0 at Exception Level x)用于存储页表的物理基址,其中x可以是1、2或3,表示不同的异常级别。在多级页表结构中,这个寄存器指向页表的第一级。

寄存器结构

在ARMv8架构中,TTBR0_ELx拥有以下关键组成部分:

  • BADDR[47:x]: 这些位表示阶段1翻译表基地址的高位部分。x的具体值由TCR_EL3.T0SZ、翻译阶段和翻译粒度大小共同决定。这些位直接存储页表基地址的相应部分。

  • BADDR[x-1:0]: 这些位用于确保页表基地址的适当对齐。对于页表基地址来说,x是最小的地址位,要求页表根据表的大小进行对齐。最小允许的x值是6,这意味着最小的页表对齐是64字节(2^6)。

    x的值基于TCR_EL3.T0SZ的设置来计算。T0SZ指定了虚拟地址空间顶部未使用的位数,决定了地址空间的大小和页表的层级。根据T0SZ的值和选定的翻译粒度(如4KB、16KB或64KB),可以计算出页表的大小和对应的对齐要求。

    • 页表必须对齐到其自身的大小。例如,如果一个页表包含256个条目(对于4KB粒度的页表来说),它必须至少对齐到1KB(256条目 * 4字节/条目)的边界。

    • 如果页表包含少于8个条目,则必须对齐到64字节的边界,即使表的计算大小小于64字节。

    • 如果TCR_EL3.PS的值不是0b110,则BADDR[x-1:1]位被保留为0(RES0)。这有助于确保兼容不同的物理地址大小设置。

    • 如果处理器支持52位物理地址和内部物理地址(PA和IPAS),并且在启用这些扩展时,BADDR[51:48]位应设置为0b0000,以确保地址的高位不会被错误地使用。

  • CnP[0]: 用于控制页表条目的共享模式,特别是当实现了FEAT_TTCNP特性时。这个位提供了一种机制,允许处理器指示页表条目是否为内部可共享域中所有处理器元素(PE)的共同集合的一部分。具体地说,这与页表的私有性或共享性有关。

    • 0b0:当CNP位为0时,表明由TTBR0_EL3指向的转换表条目,对于当前的转换体制,可以与内部可共享域中其他PE的对应条目有所不同。也就是说,这些条目不需要在所有PE之间共享,允许存在差异。这种配置的共享性不受其他PE上TTBR0_EL3.CNP位值的影响。

    • 0b1:当CNP位为1时,表示所有设置了CnP位且在同一内部可共享域中的PE使用的,由TTBR0_EL3指向的转换表条目是相同的。这意味着,这些页表条目构成了一个公共集合,应该被域内所有配置为CnP=1的PE共用。这个设置有利于减少不同处理器之间的页表不一致性,从而提高系统的协同工作效率。

    • TLB缓存CnP位的值被允许缓存在TLB(Translation Lookaside Buffer)中,这有助于加速地址转换过程,因为处理器可以快速地从TLB获取转换结果,而不是每次都从页表中读取。

    • 如果在同一内部可共享域中,多个PE的TTBR0_EL3.CNP位都设置为1,但它们并不指向同一组转换表条目,那么使用TTBR0_EL3进行的转换结果是受限的不可预测的。换句话说,如果配置了CNP=1但未能确保共同集合的一致性,系统的行为将会变得无法预测,可能导致问题。

ARMv8支持使用两个TTBR寄存器(TTBR0_ELxTTBR1_ELx)来支持不同范围的地址空间,通常:

  • TTBR0_ELx用于较低范围的虚拟地址。
  • TTBR1_ELx用于较高范围的虚拟地址。
    这种分割允许操作系统将用户空间和内核空间的映射分开管理,提高了安全性和效率。

TTBR0_ELx 编程示例

配置TTBR0_EL1通常涉及到计算页表基址,然后将其加载到寄存器中。以下是设置TTBR0_EL1的一个示例代码片段:

    // 假设x0寄存器包含页表的物理基址msr TTBR0_EL1, x0  // 将x0寄存器的值写入TTBR0_EL1// 其中,必须确保基址符合对齐要求

MMU 使能寄存 SCTLR_EL3

SCTLR寄存器是系统顶层的寄存器,可以控制内存系统,其中包括Cache和MMU等。对于MMU 的使能是通过 系统控制寄存器 SCTLR bit[0] 来控制的,包括SCTLR_EL1、SCTLR_EL2和SCTLR_EL3,但并不是所有bit在EL1都可用。
在这里插入图片描述

这里简单介绍下 I,C以及M bit:

  • I 位,bit[12]:I-cache的enable,这是个全局的指令缓存使能位:
    • 0 表示I-Cache被禁止
    • 1 表示I-Cache被使能
  • C 位,bit[2]: 缓存使能位,针对数据缓存(data cache)和统一缓存(unified cache,L2 cache):
    • 0 表示Data-Cache和Unified Cache(L2 Cache)被禁止
    • 1 表示I-Cache被使能
  • M 位,bit[0] : MMU使能位

关于SCTLR 寄存器的其它域值含义见:【ARMv8 异常模型入门及渐进 2 – ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn … 详细介绍】

判断当前 MMU是否打开

func Arm_MmuEnabledEL1_OR_EL2_OR_EL3 x1
1: mrs     x0, sctlr_el1        // Get control register EL1b       4f
2: mrs     x0, sctlr_el2        // Get control register EL2b       4f
3: mrs     x0, sctlr_el3        // Get control register EL3
4: and     x0, x0, #CTRL_M_BITret
endfunc Arm_MmuEnabled

打开MMU 函数

func Arm_EnableMmuEL1_OR_EL2_OR_EL3 x1
1: mrs     x0, sctlr_el1       // Read System control register EL1b       4f
2: mrs     x0, sctlr_el2       // Read System control register EL2b       4f
3: mrs     x0, sctlr_el3       // Read System control register EL3
4: orr     x0, x0, #CTRL_M_BIT // Set MMU enable bitbic     x0, x0, #(0x1 << 19)    // WXN bit (writeable execute never)EL1_OR_EL2_OR_EL3 x1
1: tlbi    vmalle1dsb     nshisbmsr     sctlr_el1, x0       // Write backb       4f
2: tlbi    alle2dsb     nshisbmsr     sctlr_el2, x0       // Write backb       4f
3: tlbi    alle3dsb     nshisbmsr     sctlr_el3, x0       // Write back
4: isbret
endfunc Arm_EnableMmu

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小柴带你学AutoSar系列一、基础知识篇(5)makefile基础

Flechazohttps://www.zhihu.com/people/jiu_sheng 小柴带你学AutoSar总目录https://blog.csdn.net/qianshang52013/article/details/138140235?spm=1001.2014.3001.5501

请求 响应

在web的前后端分离开发过程中&#xff0c;前端发送请求给后端&#xff0c;后端接收请求&#xff0c;响应数据给前端 请求 前端发送数据进行请求 简单参数 原始方式 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 代码…

Triton学习笔记

b站链接&#xff1a;合集Triton 从入门到精通 文章目录 算法名词解释&#xff1a;scheduler 任务调度器model instance、inference和requestbatching 一、Triton Inference Server原理1. Overview of Trition2. Design Basics of Trition3. Auxiliary Features of Trition4. A…

ipynb转markdown的简单方法

在线转换 推荐在线转换&#xff0c;拖进去后下载就行&#xff0c;简单易操作。 Convert Jupyter notebook to GitHub-Flavored Markdown for free on AlldocsThe free text converter for all your documents.https://alldocs.app/convert-jupyter-notebook-to-markdown vsc…

电阻十大品牌供应商

选型时选择热门的电阻品牌&#xff0c;主要是产品丰富&#xff0c;需求基本都能满足。 所所有的电路中&#xff0c;基本没有不用电阻的&#xff0c;电阻的选型需要参考阻值、精度、封装、温度范围&#xff0c;贴片/插件等参数&#xff0c;优秀的供应商如下&#xff1a; 十大电…

嵌入式单片机产品微波炉拆解分享

在厨房电器中,微波炉可以说是最具技术含量的电器,它的工作原理不像其他电器那样一眼就能看个明白,于是拆解了一个微波炉,分析内部电路。 微波炉的结构 微波炉由箱体、磁控管、变压器、高压电容器、高压二极管、散热风扇、转盘装置及一系列控制保护开关组成,大多数微波炉还…

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…

深度学习复盘与论文复现C

文章目录 4、Distributed training4.1 GPU architecture 5、Recurrent neural network5.1 The basic structure of RNN5.2 Neural networks without hidden states5.3 Recurrent neural networks with hidden states5.4 summary 6、Language Model Dataset (lyrics from Jay Ch…

了解Java内存模型(Java Memory Model, JMM)

了解Java内存模型&#xff08;Java Memory Model, JMM&#xff09; Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java语言规范中规定的一组规则&#xff0c;定义了多线程程序中变量&#xff08;包括实例字段、静态字段和数组元素&#xff09;的访问方式。JM…

shell编程(二)——字符串与数组

本文为shell 编程的第二篇&#xff0c;介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’&#xff0c;也可以用双引号 “”&#xff0c;也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号&#xff08;使用转义符…

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib&#xff0c;lib调用DLL2 问题1&#xff1a;为什么在dll1中需要引入dll2的.lib文件 当你有一个工程&#xff08;dll1&#xff09;调用静态库&#xff08;lib&#xff09;&#xff0c;而静态库&#xff08;lib&#xff09;又调用另一个DLL&#xff08;dll2&#xf…

运维开发(DevOps):加速软件交付的关键方法

1. 什么是运维开发 运维开发&#xff08;DevOps&#xff09;是将软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Operations&#xff09;的流程整合在一起的实践方法。DevOps的目标是通过增强开发和运维团队之间的协作&#xff0c;提高软件产品的发布…

312. 戳气球

题目 有 n 个气球&#xff0c;编号为 0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…

TCP/IP协议介绍——三次握手四次挥手

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议&#xff0c;而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议…

Elastic Search 8.14:更快且更具成本效益的向量搜索,使用 retrievers 和重新排序提升相关性,RAG 和开发工具

作者&#xff1a;来自 Elastic Yaru Lin, Ranjana Devaji 我们致力于突破搜索开发的界限&#xff0c;并专注于为搜索构建者提供强大的工具。通过我们的最新更新&#xff0c;Elastic 对于处理以向量表示的大量数据的客户来说变得更加强大。这些增强功能保证了更快的速度、降低的…

SpringFramework总结

一.SpringFramework介绍 (一)Spring 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。 Spring 已经不再是一个单纯的应用框架&#xff0c;而是逐渐发展成为一个由多个不同子项目&#xff08;模块&#xff09;组成的成熟技术&#xff0c;例如 Spring Frame…

一分钟有60秒,这个有趣的原因你知道吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

AI图书推荐:这就是ChatGPT

这本书《这就是ChatGPT》&#xff08;What Is ChatGPT Doing ... and Why Does It Work &#xff09;由Stephen Wolfram撰写 全书内容概要如下&#xff1a; **引言与预备知识** - 作者首先表达了对ChatGPT技术突破的兴奋之情&#xff0c;指出这不仅是技术的故事&#xff0c;也是…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构&#xff0c;用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作&#xff0c;使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法&#xff1a; select {case communica…

单灯双控开关原理

什么是单灯双控&#xff1f;顾名思义&#xff0c;指的是一个灯具可以通过两个不同的开关或控制器进行控制。 例如客厅的主灯可能会设置成单灯双控&#xff0c;一个开关位于门口&#xff0c;另一个位于房间内的另一侧&#xff0c;这样无论你是从门口进入还是从房间内出来&#x…