nand flash spec

nand flash简介

nand flash是一种非易失性存储器。它具有高存储密度、低成本和高耐用性的特点。

nand flash的特性是非易失性,即在电源关闭的情况下,数据仍然保留。 nand flash的存储单元由浮动栅极晶体管组成,每个存储单元可以存储一位或多位数据。nand flash通过编程和擦除操作来写入和删除数据,这与传统的随机存取存储器 (RAM) 不同。

nand flash的基本存储类型有以下几种:

  • SLC(Single-Level Cell):每个存储单元存储 1 位数据,具有较高的速度和耐久性,但成本较高。
  • MLC(Multi-Level Cell):每个存储单元存储 2 位数据,成本较低,但速度和耐久性相对较差。
  • TLC(Triple-Level Cell):每个存储单元存储 3 位数据,进一步降低了成本,但速度和耐久性进一步下降。
  • QLC(Quad-Level Cell):每个存储单元存储 4 位数据,成本最低,但速度和耐久性最差

nand flash的架构基本如下:

块和页:NAND Flash 存储器被分成多个块,每个块又被分成多个页。数据写入以页为单位,而擦除则以块为单位。 控制器:管理 NAND Flash 的读写操作、错误纠正和磨损均衡等功能。

nand flash的主要规范如下:

  • 容量:NAND Flash 的总存储容量,通常以 GB 或 TB 为单位。

  • 页大小:NAND Flash 中最小的可写单元,通常为 2KB、4KB 或 8KB。

  • 块大小:包含的页数,每块大小通常为 64 页、128 页或 256 页。

  • 读取速度:读取数据的速度,通常以 MB/s 为单位。

  • 写入速度:写入数据的速度,通常以 MB/s 为单位。

  • 擦除时间:擦除一个块所需的时间,以毫秒(ms)为单位。

  • 耐久性:每个块可承受的编程/擦除循环次数,通常为几千到几十万次。

  • 数据保持:无电源情况下数据能够可靠保存的时间,通常为几年到十几年。

  • 接口:使用的通信接口类型,如并行接口、SPI 接口或 ONFI 标准接口。

  • 电压:核心和 I/O 操作的工作电压范围。

  • 封装:NAND Flash 的物理形态,如 TSOP、BGA 或 LGA 封装。

  • 温度范围:工作和存储温度范围。

    规范示例

    假设一个 NAND Flash 规格表如下:

    • 容量:128GB
    • 页大小:4KB
    • 块大小:256 页(1MB)
    • 读取速度:25 MB/s
    • 写入速度:10 MB/s
    • 擦除时间:2 ms
    • 耐久性:100,000 次编程/擦除循环
    • 数据保持:10 年
    • 接口:ONFI 2.2
    • 电压:1.8V 至 3.3V
    • 封装:48 针 TSOP
    • 温度范围:-40°C 至 85°C

nand 的interface 和pin脚

一个典型的 NAND Flash 存储器可以分为以下几个主要部分:

  • 存储单元阵列:由多个存储单元组成,每个存储单元可以存储 1 位或多位数据。
  • 页缓冲区:用于存储数据的临时区域,在数据写入或读取时使用。
  • 控制逻辑:负责管理数据的编程、读取和擦除操作。
  • 地址和数据寄存器:存储操作过程中用到的地址和数据。
  • 状态寄存器:存储当前操作的状态信息,如忙/闲状态、错误状态等。
  • 接口控制器:负责与外部主机进行通信

NAND Flash 存储器主要通过以下几种接口与外部设备通信:

  • 并行接口:传统的 NAND Flash 使用 8 位或 16 位并行接口进行数据传输,数据传输速率较高,适用于高速存储需求。
  • 串行接口:如 SPI (Serial Peripheral Interface) NAND,采用串行数据传输方式,接口简单,适用于较低数据传输速率的应用场景。
  • ONFI (Open NAND Flash Interface):一种标准化的 NAND Flash 接口协议,旨在提高 NAND Flash 的兼容性和互操作性。

以下是常见的 NAND Flash 存储器引脚及其功能描述:

  • CE# (Chip Enable):芯片使能引脚,低电平有效。当 CE# 低电平时,芯片被选中,可以进行数据传输操作。
  • CLE (Command Latch Enable):命令锁存使能引脚,高电平有效。当 CLE 高电平时,写入的数据被解释为命令
  • ALE (Address Latch Enable):地址锁存使能引脚,高电平有效。当 ALE 高电平时,写入的数据被解释为地址。
  • WE# (Write Enable):写使能引脚,低电平有效。当 WE# 低电平时,数据被写入 NAND Flash。
  • RE# (Read Enable):读使能引脚,低电平有效。当 RE# 低电平时,数据从 NAND Flash 读取。
  • WP# (Write Protect):写保护引脚,低电平有效。当 WP# 低电平时,禁止写入和擦除操作,保护存储器数据。
  • R/B# (Ready/Busy):就绪/忙引脚,低电平表示存储器忙,高电平表示存储器就绪。
  • IO0-IO7 (或 IO0-IO15):数据输入/输出引脚,用于传输数据、命令和地址。
  • VCC:电源引脚,为 NAND Flash 提供工作电压。
  • VSS (GND):地引脚,提供电路参考地。

nand flash的组成和寻址方式

NAND Flash 的组成如下:

1.存储单元队列

  • 页 (Page):最小的可编程和可读取单元。典型的页大小是 2KB、4KB 或 8KB。
  • 块 (Block):由多个页组成,通常是 64、128 或 256 页。擦除操作以块为单位进行。
  • 平面 (Plane):由多个块组成,通常一个 NAND Flash 芯片有一个或多个平面。
  • 晶圆 (Die):由一个或多个平面组成。一个 NAND Flash 芯片可以包含一个或多个晶圆。

2.页缓冲区:用于临时存储数据的缓冲区,在数据写入和读取过程中使用。

3.控制逻辑:包括命令解码、地址生成、数据传输控制和错误校正码 (ECC) 等。

4.地址和数据寄存器:用于存储地址和数据,在传输过程中使用。

5.状态寄存器:用于存储当前操作的状态信息,如忙/闲状态、错误状态等。

6.接口控制器:负责与外部主机进行通信。

NAND Flash 的寻址方式

NAND Flash 的寻址方式包括逻辑地址和物理地址。逻辑地址是主机系统看到的地址,而物理地址是实际存储单元的地址。以下是 NAND Flash 的寻址机制:

逻辑到物理地址转换

由于 NAND Flash 存储器的磨损均衡 (Wear-Leveling) 和坏块管理 (Bad Block Management) 机制,逻辑地址与物理地址之间通常存在映射关系。这种映射关系由 NAND Flash 控制器管理。

物理地址结构

页地址:

​ 页地址用于选择具体的页。页地址包括平面地址、块地址和页内偏移。

​ 页地址的高位用于选择平面,中间位用于选择块,低位用于选择页。

块地址:

​ 块地址用于选择具体的块。块地址的高位用于选择平面,中间位用于选择块。

​ 一个块内包含多个页。

平面地址:

​ 平面地址用于选择具体的平面。平面地址的高位用于选择平面。

地址格式示例

假设一个 NAND Flash 存储器具有以下参数:

每页大小:4KB

每块包含页数:128 页

每平面包含块数:1024 块

每芯片包含平面数:2 个

一个具体地址可以表示为:

  • 页地址 (低 12 位):用于选择页内偏移
  • 块地址 (中间 10 位):用于选择块
  • 平面地址 (高 1 位):用于选择平面
  • 完整地址格式:平面地址 (1 位) + 块地址 (10 位) + 页地址 (12 位)

nand flash的各个cmd的功能以及作用场景

读取命令

读页命令 (Read Page):

  • 功能:从指定的页读取数据。
  • 使用场景:需要从 NAND Flash 中读取数据时使用。
  • 典型命令序列:发送读命令,指定页地址,然后读取数据。

写入命令

页编程命令 (Page Program):

  • 功能:将数据写入指定的页。
  • 使用场景:需要将数据存储到 NAND Flash 时使用。
  • 典型命令序列:发送写命令,指定页地址,传输数据,然后发送确认命令以开始编程。

擦除命令

块擦除命令 (Block Erase):

  • 功能:擦除指定块的所有数据。
  • 使用场景:需要清空一个块的数据,以便写入新数据时使用。
  • 典型命令序列:发送擦除命令,指定块地址,然后发送确认命令以开始擦除。

状态命令

读状态命令 (Read Status):

  • 功能:读取 NAND Flash 当前的状态。
  • 使用场景:需要检查 NAND Flash 是否忙碌,或者是否有错误发生时使用。
  • 典型命令序列:发送读状态命令,然后读取状态寄存器。

初始化和复位命令

复位命令 (Reset):

  • 功能:复位 NAND Flash,使其进入初始状态。
  • 使用场景:在进行大规模操作前,需要确保 NAND Flash 处于已知状态时使用。
  • 典型命令序列:发送复位命令,然后等待复位完成。

隐藏命令

缓存读取命令 (Cache Read):

  • 功能:从缓存中读取数据,提高读取速度。
  • 使用场景:需要快速连续读取多个页的数据时使用。
  • 典型命令序列:发送缓存读命令,然后读取数据。

随机数据读取命令 (Random Data Read):

  • 功能:从页内的任意位置读取数据。
  • 使用场景:需要从特定位置读取数据时使用。
  • 典型命令序列:发送随机读命令,指定地址,然后读取数据。 命令执行的流程示例 写入操作 发送页编程命令:将命令发送到 CLE。 指定地址:将要写入的页地址发送到 ALE。 传输数据:将数据发送到数据寄存器。 开始编程:发送确认命令,启动编程过程。 读取操作 发送读页命令:将命令发送到 CLE。 指定地址:将要读取的页地址发送到 ALE。 读取数据:从数据寄存器中读取数据。

reset 在各个sequence下的复位时序

理解 NAND Flash 存储器中的复位命令(Reset)的时序对确保设备正确初始化和恢复正常工作至关重要。复位命令会将 NAND Flash 重置到初始状态,清除所有进行中的命令并返回到空闲状态。以下是不同操作序列中的复位时序解释:

复位时序

复位命令通常包括以下步骤:

  1. 发送复位命令:在命令锁存使能(CLE)高电平时,将复位命令(通常为 0xFF)发送到 NAND Flash。
  2. 等待复位完成:复位操作需要一些时间来完成,这段时间称为复位时间(tRST)。 可以通过查询就绪/忙(R/B#)引脚或读取状态寄存器来确认复位是否完成。
  3. 检查状态寄存器:复位完成后,可以读取状态寄存器以确保 NAND Flash 处于正常状态。

复位命令在不同操作中的使用

  1. 在初始化过程中 在系统启动时,为了确保 NAND Flash 处于已知状态,发送复位命令。 确保所有寄存器和内部状态清除,准备接收新的命令。
  2. 在错误恢复过程中 当发生错误或意外情况时,复位命令用于恢复 NAND Flash 的正常工作状态。 例如,在编程或擦除操作失败后,可以发送复位命令进行恢复。

复位时序示例

在这个时序图中:

       ____________________________
CE#  __|                            |_____________                 _______
CLE  __|           |_______________|___________                 _______
WE#  __|           |_______________|_______________________
IOx  | 0xFF       |____________________________
R/B# |____________________________|
  • CE#:芯片使能引脚
  • CLE:命令锁存使能引脚
  • WE#:写使能引脚
  • IOx:数据引脚
  • R/B#:就绪/忙引脚
  1. CE# 低电平:选中芯片。
  2. CLE 高电平:命令锁存使能。
  3. WE# 低电平:写使能。
  4. 发送复位命令(0xFF):通过数据引脚传输命令。
  5. 等待 R/B# 高电平:表示复位完成。

不同操作序列中的复位命令

  • 在写操作中的复位 如果写操作过程中发生错误,可以发送复位命令清除错误状态,恢复 NAND Flash 的正常工作。
  • 在读操作中的复位 在读操作过程中,如果 NAND Flash 进入不可预期的状态,可以通过复位命令恢复正常状态。

通过理解复位命令的时序,可以确保 NAND Flash 在各种操作场景中正确恢复并准备接收新的操作命令。

read id的应用场景以及解析方法

应用场景

  1. 设备识别:在系统启动时,使用 Read ID 命令识别连接的 NAND Flash 芯片型号和制造商,以便选择正确的驱动程序和配置。
  2. 兼容性检查:确保主控芯片(如微控制器或 FPGA)能够识别和正确配置不同型号的 NAND Flash 存储器。
  3. 诊断和调试:在开发和调试过程中,通过读取 ID 来确认 NAND Flash 芯片型号和版本,帮助定位和解决问题。

解析方法

  1. 发送 Read ID 命令:向 NAND Flash 发送 Read ID 命令(通常为 0x90)。

  2. 读取 ID 数据:按顺序读取一系列字节,这些字节包含制造商 ID、设备 ID、第三、第四和第五字节等信息。

读取 ID 数据的结构示例

假设 NAND Flash 返回如下 ID 数据:

  • 第1字节:制造商 ID(如 0x2C)
  • 第2字节:设备 ID(如 0xA1)
  • 第3字节:扩展信息
  • 第4字节:保留
  • 第5字节:保留

解析步骤:

  • 制造商 ID:识别 NAND Flash 的制造商,例如 0x2C 对应 Micron。
  • 设备 ID:识别具体的 NAND Flash 型号,例如 0xA1 对应某型号。
  • 扩展信息:包含页大小、块大小、平面数等具体参数。

示例解析

假设读取到以下数据:0x2C(制造商 ID) 0xA1(设备 ID) 0x90(扩展信息) 0x15(保留) 0x00(保留)

解析:

  • 0x2C:Micron 制造商 ID。
  • 0xA1:设备 ID,对应特定型号。
  • 0x90:扩展信息,可能表示页大小为 4KB,块大小为 128 页。
  • 其余字节保留或未使用。

通过读取和解析这些 ID 数据,系统能够正确识别和配置 NAND Flash 存储器,确保兼容性和正常运行。

interface change 和driver strength setting

Interface Change 主要指在 NAND Flash 和主控芯片之间改变通信接口的模式或速率

应用场景

  • 不同模式切换: 切换 NAND Flash 通信模式,如从传统的并行接口切换到 ONFI(开放 NAND 闪存接口)标准。
  • 速率调整: 根据系统需求调整数据传输速率,提高数据传输效率。

Driver Strength Setting 指调整 NAND Flash 芯片驱动信号的强度,以适应不同的负载条件和信号完整性要求。

应用场景

  • 信号完整性: 在长电缆或高速传输情况下,增强驱动强度以减少信号衰减和噪声干扰。

  • 功耗优化: 在短距离或低速传输情况下,降低驱动强度以减少功耗。

Interface Change 示例

假设从传统的并行接口切换到 ONFI 3.0 标准:

  • 发送切换命令:主控芯片发送接口切换命令。
  • 配置寄存器:设置相关寄存器以启用新的接口模式。
  • 确认切换:通过读取状态寄存器确认切换成功。

Driver Strength Setting 示例

假设在高速数据传输情况下需要增强驱动强度:

  • 发送设置命令:主控芯片发送驱动强度设置命令。
  • 配置寄存器:调整驱动强度寄存器以设置新的强度值。
  • 确认设置:通过读取状态寄存器确认设置成功。 通过合理的 Interface Change 和 Driver Strength Setting,能够优化 NAND Flash 的性能和可靠性。

各个sequence的基本时序

读操作时序

步骤:

  • 发送读命令:在 CLE 高电平时,发送读命令。
  • 发送地址:在 ALE 高电平时,发送页地址和列地址。
  • 读取数据:等待数据准备好,通过数据引脚读取数据。
       ____________________________
CE#  __|                            |_____________                 _______
CLE  __|           |_______________|___________                 _______
WE#  __|           |_______________|_______________________
IOx  | 命令        | 地址         | 数据____________________________
R/B# |____________________________|

写操作时序

步骤:

  • 发送写命令:在 CLE 高电平时,发送写命令。
  • 发送地址:在 ALE 高电平时,发送页地址和列地址。
  • 传输数据:在 WE# 低电平时,通过数据引脚传输数据。
  • 发送编程确认命令:在 CLE 高电平时,发送编程确认命令。
  • 等待编程完成:通过 R/B# 引脚检测编程完成状态。
       ____________________________
CE#  __|                            |_____________                 _______
CLE  __|           |_______________|___________                 _______
WE#  __|           |_______________|_______________________
IOx  | 命令        | 地址         | 数据____________________________
R/B# |____________________________|

擦除操作时序

步骤:

  • 发送擦除命令:在 CLE 高电平时,发送擦除命令。
  • 发送块地址:在 ALE 高电平时,发送块地址。
  • 发送擦除确认命令:在 CLE 高电平时,发送擦除确认命令。
  • 等待擦除完成:通过 R/B# 引脚检测擦除完成状态。
       ____________________________
CE#  __|                            |_____________                 _______
CLE  __|           |_______________|___________                 _______
WE#  __|           |_______________|_______________________
IOx  | 命令        | 地址         | 确认____________________________
R/B# |____________________________|

复位操作时序

步骤:

  • 发送复位命令:在 CLE 高电平时,发送复位命令(0xFF)。
  • 等待复位完成:通过 R/B# 引脚检测复位完成状态。
       ____________________________
CE#  __|                            |_____________                 _______
CLE  __|           |_______________|___________                 _______
WE#  __|           |_______________|_______________________
IOx  | 0xFF       |____________________________
R/B# |____________________________|

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

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

相关文章

短视频世界对我温柔以待:成都柏煜文化传媒有限公司

短视频世界对我温柔以待 在繁忙的都市生活中,每个人都在为生活奔波,为梦想努力。而在这个快节奏的时代里,短视频如同一股清流,以其独特的魅力,为我带来了片刻的宁静与温柔。它像是一个无声的朋友,在我疲惫…

(必看图文)Hadoop集群安装及MapReduce应用(手把手详解版)

前言 随着大数据时代的到来,处理和分析海量数据已成为企业和科研机构不可或缺的能力。Hadoop,作为开源的分布式计算平台,因其强大的数据处理能力和良好的可扩展性,成为大数据处理领域的佼佼者。本图文教程旨在帮助读者理解Hadoop集…

Mysql面试合集

概念 是一个开源的关系型数据库。 数据库事务及其特性 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。 事务特性: (1)原子性:即不可分割性,事务要么全部被执行,要么就…

代码随想录1数组

1 二分查找 Leetcode704 1 [l,r]区间 l 0, r nums.length-1; while(l<r) 因为lr有意义 2 [l,r)区间 l 0, r nums.length; while(l<r) Leetcode35 class Solution {public int searchInsert(int[] nums, int target) {int l0,rnums.length;while(l<r){int m l(…

使用设计模式来增强你的 SpringBoot 开发

SpringBoot 是一个出色的框架&#xff0c;可以快速构建强大而高效的应用程序。但你是否知道设计模式可以将 SpringBoot 开发提升到一个新的水平&#xff1f; • 设计模式的重要性&#xff1a;了解设计模式如何促进代码的可重用性、可维护性和整体应用程序健康。 • SpringBoot…

在Spring Data JPA中使用@Query注解

目录 前言示例简单示例只查询部分字段&#xff0c;映射到一个实体类中只查询部分字段时&#xff0c;也可以使用List<Object[]>接收返回值再复杂一些 前言 在以往写过几篇spring data jpa相关的文章&#xff0c;分别是 Spring Data JPA 使用JpaSpecificationExecutor实现…

python 笔试面试八股(自用版~)

1 解释型和编译型语言的区别 解释是翻译一句执行一句&#xff0c;更灵活&#xff0c;eg&#xff1a;python; 解释成机器能理解的指令&#xff0c;而不是二进制码 编译是整个源程序编译成机器可以直接执行的二进制可运行的程序&#xff0c;再运行这个程序 比如c 2 简述下 Pyth…

运维锅总详解RocketMQ

本文尝试从Apache RocketMQ的简介、主要组件及其作用、3种部署模式、Controller集群模式工作流程、最佳实践等方面对其进行详细分析。希望对您有所帮助&#xff01; 一、Apache RocketMQ 简介 Apache RocketMQ 是一个开源的分布式消息中间件&#xff0c;由阿里巴巴集团开发并…

祝贺《华为战略管理法:DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一(宏观战略类书籍)

祝贺《华为战略管理法&#xff1a;DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一 2024年4月23日&#xff08;周二&#xff09;下午13:00&#xff0c;《中国企业家》杂志如期举办“每天都是读书日”线下活动。 《中国企业家》杂志携手商界大咖共同推选50本枕边书…

Vue.js中的计算属性

Vue.js中的计算属性&#xff08;computed properties&#xff09;是用于声明响应式依赖的属性。它们会根据它们的依赖进行缓存&#xff0c;并且只有在相关依赖发生改变时才会重新求值。这使得它们非常适合用来处理复杂逻辑和数据处理。 基本用法 在Vue实例中&#xff0c;可以…

镭速实现AD域集成助力企业文件安全传输管控

在当今这个信息量爆炸扩张的年代&#xff0c;企业数据宛如一座蕴藏无限价值的宝库&#xff0c;它不仅是企业核心竞争力的载体&#xff0c;也成为了各种潜在风险的聚焦点。随着数字化转型步伐的加快&#xff0c;安全文件传输的管理控制显得尤为重要&#xff0c;它构成了保护企业…

各类排序方法 归并排序 扩展练习 逆序对数量

七月挑战一个月重刷完Y总算法基础题&#xff0c;并且每道题写详细题解 进度:(3/106) 归并排序的思想也是分而治之 归并优点&#xff1a;速度稳定,排序也稳定 排序也稳定&#xff08;数组中有两个一样的值&#xff0c;排序之后他们的前后顺序不发生变化&#xff0c;我们就说…

Leetcode 2065. 最大化一张图中的路径价值(DFS / 最短路)

Leetcode 2065. 最大化一张图中的路径价值 暴力DFS 容易想到&#xff0c;从0点出发DFS&#xff0c;期间维护已经走过的距离&#xff08;时间&#xff09;和途径点的权值之和&#xff0c;若访问到0点则更新答案&#xff0c;若下一步的距离与已走过的距离和超出了maxTime&#…

oracle sql语句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面

要实现这个排序需求&#xff0c;你可以使用 CASE 表达式来自定义排序逻辑。假设你有一个表格名为 your_table&#xff0c;并且有一个字段 fjd 存储类似 ‘0101’, ‘0103’ 这样的值&#xff0c;你可以这样编写 SQL 查询&#xff1a; SELECT * FROM your_table ORDER BY CASE …

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

第55期:MySQL 频繁 Crash 怎么办?

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

MSVCR120.DLL丢失的多种修复方法,助你快速解决dll问题

在日常生活和工作中&#xff0c;电脑已经成为我们不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑运行软件时提示找不到msvcr120.dll。如果该文件缺失或损坏&#xff0c;可能会导致依赖它的应用程序无法启…

高优先线程

你开发的时候有么有遇到过一个问题&#xff1a;服务器的一个服务线程过几个小时断连一次&#xff0c;断连之后会马上重连这种情况。这是由于CPU负载较高,线程调度时将处理数据的线程挂起了一段时间导致的。 因此&#xff0c;我有考虑到把cpu的核心进行分散开来&#xff0c;就类…

CesiumJS【Basic】- #042 绘制纹理线(Primitive方式)

文章目录 绘制纹理线(Primitive方式)1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Primitive方式) 1 目标 使用Primitive方式绘制纹理线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路&#xff1a;使用map存储每个节点的父节点&#xff0c;则两个节点的最近公共祖先&#xff0c;即二者的最近父节点 1、中序遍历二叉树&#xff08;当前节点的下一个节点&#xff09; 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…