当前位置: 首页 > news >正文

Linux SPI-NAND 驱动开发指南

文章目录

  • Linux SPI-NAND 驱动开发指南
    • 1 概述
      • 1.1 编写目的
      • 1.2 适用范围
      • 1.3 相关人员
    • 3 流程设计
      • 3.1 体系结构
      • 3.2 源码结构
      • 3.3 关键数据定义
        • 3.3.1 flash 设备信息数据结构
        • 3.3.2 flash chip 数据结构
        • 3.3.3 aw_spinand_chip_request
        • 3.3.4 ubi_ec_hdr
        • 3.3.5 ubi_vid_hdr
      • 3.4 关键接口说明
        • 3.4.1 MTD 层接口
          • 3.4.1.1 aw_rawnand_mtd_erase
          • 3.4.1.2 aw_rawnand_mtd_read
          • 3.4.1.3 aw_rawnand_mtd_read_oob
          • 3.4.1.4 aw_rawnand_mtd_write
          • 3.4.1.5 aw_rawnand_mtd_write_oob
          • 3.4.1.6 aw_rawnand_mtd_block_isbad
          • 3.4.1.7 aw_rawnand_mtd_block_markbad
        • 3.4.2 物理层接口
          • 3.4.2.1 aw_spinand_chip_read_single_page
          • 3.4.2.3 aw_spinand_chip_erase_single_block
          • 3.4.2.4 aw_spinand_chip_isbad_single_block
          • 3.4.2.5 aw_spinand_chip_markbad_single_block
    • 4 模块配置
      • 4.1 uboot 模块配置
      • 4.2 kernel 模块配置
        • 4.3 env.cfg

Linux SPI-NAND 驱动开发指南

1 概述

1.1 编写目的

介绍 Sunxi SPINand mtd/ubi 驱动设计, 方便相关驱动和应用开发人员

1.2 适用范围

本设计适用于所有 sunxi 平台

1.3 相关人员

Nand 模块开发人员,及应用开发人员等

2 术语、缩略语及概念

MTD:(Memory Technology device)是用于访问存储设备的 linux 子系统。本模块是MTD 子系统的 flash 驱动部分

UBI:UBI 子系统是基于 MTD 子系统的,在 MTD 上实现 nand 特性的管理逻辑,向上屏蔽nand 的特性

坏块 (Bad Block):制作工艺和 nand 本身的物理性质导致在出厂和正常使用过程中都会产生坏块

3 流程设计

3.1 体系结构

NAND MTD/UBI 驱动主要包括 5 大组件,如下图:

​ 图 3-1: UBI 架构

说明:

  • MTD standard interface: 对接 MTD 层通用读写接口
  • FLASH bad block manager: 驱动层对 flash 坏块的管理
  • FLASH SPL: 主要是实现读写 boot0、boot1,可用于 ioctl 对boot0、boot1 的升级
  • SECURESTORAGE:主要是给上层提供私有数据的管理 SPI:HOST端控制器层的实现。

3.2 源码结构

kernel 源码目录:linux-5.4/drivers/mtd/awnand/spinand

.
├── Kconfig
├── Makefile
├── physic
│   ├── bbt.c
│   ├── cache.c
│   ├── core.c
│   ├── ecc.c
│   ├── id.c
│   ├── Makefile
│   ├── ops.c
│   └── physic.h
├── secure-storage.c
├── sunxi-common.c
├── sunxi-core.c
├── sunxi-debug.c
├── sunxi-nftl-core.c
└── sunxi-spinand.h

内核目录下

`-- include`-- linux`-- mtd|-- aw-spinand.h

3.3 关键数据定义

3.3.1 flash 设备信息数据结构

struct aw_spinand_phy_info {const char *Model;unsigned char NandID[MAX_ID_LEN];unsigned int DieCntPerChip;unsigned int BlkCntPerDie;unsigned int PageCntPerBlk;unsigned int SectCntPerPage;unsigned int OobSizePerPage;#define BAD_BLK_FLAG_MARK 0x03#define BAD_BLK_FLAG_FRIST_1_PAGE 0x00#define BAD_BLK_FLAG_FIRST_2_PAGE 0x01#define BAD_BLK_FLAG_LAST_1_PAGE 0x02#define BAD_BLK_FLAG_LAST_2_PAGE 0x03int BadBlockFlag;#define SPINAND_DUAL_READ BIT(0)#define SPINAND_QUAD_READ BIT(1)#define SPINAND_QUAD_PROGRAM BIT(2)#define SPINAND_QUAD_NO_NEED_ENABLE BIT(3)#define SPINAND_ONEDUMMY_AFTER_RANDOMREAD BIT(8)int OperationOpt;int MaxEraseTimes;#define HAS_EXT_ECC_SE01 BIT(0)#define HAS_EXT_ECC_STATUS BIT(1)enum ecc_status_shift ecc_status_shift;int EccFlag;enum ecc_limit_err EccType;enum ecc_oob_protected EccProtectedType;
};

说明:

Model:flash 的 model 名字

NandID:flash 的 id 码

DieCntPerChip:每 chip 的 die 个数

BlkCntPerDie:每 die 有多少个 block

PageCntPerBlk:每 block 有多少个 page

SectCntPerPage:每 page 有多少个扇区

OobSizePerPage:每 page 的 obb 大小

BadBlockFlag:坏块标志存放在每个 block 的那个 page 中

  1. BAD_BLK_FLAG_FRIST_1_PAGE

  2. BAD_BLK_FLAG_FIRST_2_PAGE

  3. BAD_BLK_FLAG_LAST_1_PAGE

  4. BAD_BLK_FLAG_LAST_2_PAGE

OperationOpt:支持的操作

  1. SPINAND_DUAL_READ

  2. SPINAND_QUAD_READ

  3. SPINAND_QUAD_PROGRAM

  4. SPINAND_QUAD_NO_NEED_ENABLE

  5. SPINAND_ONEDUMMY_AFTER_RANDOMREAD

MaxEraseTimes:最大擦除数据

EccFlag:特性物料读 ecc status 说需目录不同

GD5F1GQ4UCYIG 通过 0Fh + C0h 获取 ecc status,则无需配置 EccFlag

MX35LF1GE4AB 通过 7Ch + one dummy byte 获取 ecc status,则配置 EccFlag = HAS_EXT_ECC_STATUS

EccType:设置 ecc 值对应的状态关系

EccProtectedType:在 spare 去选择收 ecc 保护的 16byte 作为 oob 区

例(MX35LF2GE4AD):

{.Model = "MX35LF2GE4AD",.NandID = {0xc2, 0x26, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff},.DieCntPerChip  = 1,.SectCntPerPage = 4,.PageCntPerBlk  = 64,.BlkCntPerDie   = 2048,.OobSizePerPage = 64,.OperationOpt = SPINAND_QUAD_READ | SPINAND_QUAD_PROGRAM | SPINAND_DUAL_READ,.MaxEraseTimes = 65000,.EccFlag = HAS_EXT_ECC_STATUS,.EccType = BIT4_LIMIT5_TO_8_ERR9_TO_15,.EccProtectedType = SIZE16_OFF4_LEN4_OFF8,.BadBlockFlag = BAD_BLK_FLAG_FIRST_2_PAGE,
},

3.3.2 flash chip 数据结构

struct aw_spinand_chip {struct aw_spinand_chip_ops *ops;struct aw_spinand_ecc *ecc;struct aw_spinand_cache *cache;struct aw_spinand_info *info;struct aw_spinand_bbt *bbt;struct spi_device *spi;unsigned int rx_bit;unsigned int tx_bit;unsigned int freq;void *priv;
};

此结构定义了 flash chip 层的物理模型数据结构以及 chip 层对 flash 的操作接口。

aw_spinand_chip_ops:flash 读、写、擦等操作接口

aw_spinand_ecc:flash ecc 读、写和校验操作接口

aw_spinand_cache:对缓存 page 的管理,提高读写效率

aw_spinand_info:flash ID、page size 等信息及获取信息的操作接口

aw_spinand_bbt:flash 坏块表及管理等操作接口

spi_device:spi 父设备的操作结构体

rx_bit:读状态操作标志

tx_bit:写状态操作标志

3.3.3 aw_spinand_chip_request

struct aw_spinand_chip_request {unsigned int block;unsigned int page;unsigned int pageoff;unsigned int ooblen;unsigned int datalen;void *databuf;void *oobbuf;unsigned int oobleft;unsigned int dataleft;
};

操作目标结构体,改结构体填充我们待操作的 block 的那个 page 的多少偏移的数据

databuf/oobbuf

block:待操作块

page:待操作页

pageoff:操作偏移

ooblen:操作 oob 长度

datalen:操作数据长度

databuf:操作目标数据

oobbuf:操作目标 oob

3.3.4 ubi_ec_hdr

struct ubi_ec_hdr {__be32 magic;__u8 version;__u8 padding1[3];__be64 ec; /* Warning: the current limit is 31-bit anyway! */__be32 vid_hdr_offset;__be32 data_offset;__be32 image_seq;__u8 padding2[32];__be32 hdr_crc;
} __packed;

@magic: erase counter header magic number (%UBI_EC_HDR_MAGIC)

@version: version of UBI implementation which is supposed to accept this UBI image

@padding1: reserved for future, zeroes

@ec: the erase counter

@vid_hdr_offset: where the VID header starts

@data_offset: where the user data start

@image_seq: image sequence number

@padding2: reserved for future, zeroes

@hdr_crc: erase counter header CRC checksum

EC: Erase Count,记录块的擦除次数,在 ubiattach 的时候指定一个 mtd,如果 PEB 上没有

EC,则用平均的 EC 值,写入 EC 值只有在擦除的时候才会增加 1

3.3.5 ubi_vid_hdr

struct ubi_vid_hdr {__be32 magic;__u8 version;__u8 vol_type;__u8 copy_flag;__u8 compat;__be32 vol_id;__be32 lnum;__u8 padding1[4];__be32 data_size;__be32 used_ebs;__be32 data_pad;__be32 data_crc;__u8 padding2[4];__be64 sqnum;__u8 padding3[12];__be32 hdr_crc;
} __packed;

@magic: volume identifier header magic number (%UBI_VID_HDR_MAGIC)

@version: UBI implementation version which is supposed to accept this UBI image(%UBI_VERSION)

@vol_type: volume type (%UBI_VID_DYNAMIC or %UBI_VID_STATIC)

@copy_flag: if this logical eraseblock was copied from another physical eraseblock(for wear-leveling reasons)

@compat: compatibility of this volume(%0, %UBI_COMPAT_DELETE, %UBI_COMPAT_IGNORE,%UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT)

@vol_id: ID of this volume

@lnum: logical eraseblock number

@padding1: reserved for future, zeroes

@data_size: how many bytes of data this logical eraseblock contains

@used_ebs: total number of used logical eraseblocks in this volume

@data_pad: how many bytes at the end of this physical eraseblock are not used

@data_crc: CRC checksum of the data stored in this logical eraseblock

@padding2: reserved for future, zeroes

@sqnum: sequence number

@padding3: reserved for future, zeroes

@hdr_crc: volume identifier header CRC checksum

参数说明

@sqnum 是创建此 VID 头时的全局序列计数器的值。每次 UBI 写一个新的 VID 头到 flash 时,全局序列计数器都会增加,比如当它将一个逻辑的 eraseblock 映射到一个新的物理的 erase-block 时。全局序列计数器是一个无符号 64 位整数,我们假设它永远不会溢出。@sqnum(序列号) 用于区分新旧版本的逻辑擦除块。

有两种情况,可能有多个物理 eraseblock 对应同一个逻辑 eraseblock,即在卷标识头中有相同的 @vol_id@lnum 值。假设我们有一个逻辑的擦除块 L,它被映射到物理的擦除块 P。

  1. 因为 UBI 可以异步擦除物理上的擦除块,所以可能出现以下情况:L 被异步擦除,所以 P 被安排擦除,然后 L 被写入,即。映射到另一个物理的擦除块 P1,所以 P1 被写入,然后不干净的重启发生。结果-有两个物理的 eraseblock P 和 P1 对应同一个逻辑的 eraseblock L。但是 P1 的序列号更大,所以 UBI 在连接 flash 时选择 P1。

  2. UBI 不时地将逻辑擦除块移动到其他物理擦除块,以达到损耗均衡的目的。例如,如果 UBI将 L 从 P 移动到 P1,在 P 被物理擦除之前会发生不干净的重启,有两个物理擦除块 P 和 P1 对应于 L, UBI 必须在 flash 连接时选择其中一个。@sqnum 字段表示哪个 PEB 是原始的 (显然 P 的 @sqnum 更低) 和副本。但是选择具有更高序列号的物理擦除块是不够的,因为不干净的重新引导可能发生在复制过程的中间,因此 P 中的数据被损坏(P->P1 没复制完)。仅仅选择序号较低的物理擦除块是不够的,因为那里的数据可能很旧 (考虑在复制之后向 P1 添加更多数据的情况)。此外,不干净的重启可能发生在擦除 P 刚刚开始的时候,所以它会导致不稳定的 P,“大部分” 是 OK 的,但仍然有不稳定的情况。

UBI 使用 @copy_flag 字段表示这个逻辑擦除块是一个副本。UBI 还计算数据的 CRC,当数据被移动时,并将其存储在副本 (P1) 的 @data_crc 字段。因此,当 UBI 需要从两个 (P 或 P1)中选择一个物理擦除块时,会检查新块 (P1) 的 @copy_flag。如果它被清除,情况就简单了,新的就会被选中。如果设置了该值,则检查副本 (P1) 的数据 CRC。如果 CRC 校验和是正确的,这个物理擦除块被选中 (P1)。否则,将选择较老的 P。如果是静态卷,@data_crc 字段包含逻辑擦除块内容的 CRC 校验和。对于动态卷,它不包含 CRC 校验和规则。唯一的例外情况是,当物理擦除块的数据被磨损均衡子系统移动时,磨损均衡子系统计算数据 CRC,并将其存储在 @data_crc 字段中。

@used_ebs 字段仅用于静态卷,它表示该卷的数据需要多少个擦除块。对于动态卷,这个字段不被使用并且总是包含 0。

@data_pad 在创建卷时使用对齐参数计算。因此,@data_pad 字段有效地减少了该卷的逻辑擦除块的大小。当一个人在 UBI 卷上使用面向块的软件 (比如,cramfs) 时,这是非常方便的。

LEB PEB

image-20221227120254224

​ 图 3-2: PEB-LEB

3.4 关键接口说明

3.4.1 MTD 层接口

3.4.1.1 aw_rawnand_mtd_erase
static int aw_rawnand_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)

description:mtd erase interface

@mtd:MTD device structure

@instr:erase operation descrition structure

return:success return 0,fail return fail code

3.4.1.2 aw_rawnand_mtd_read
static int aw_rawnand_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,size_t *retlen, u_char *buf)

description:mtd read interface

@mtd:MTD device structure

@from:offset to read from MTD device

@len: data len

@retlen:had read data len

@buf:data buffer

return:success return max_bitflips,fail return fail code

3.4.1.3 aw_rawnand_mtd_read_oob
static int aw_rawnand_mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)

description:mtd read data with oob

@mtd:MTD device structure

@ops:oob eperation descrition structure

return:success return max_bitflips,fail return fail code

3.4.1.4 aw_rawnand_mtd_write
static int aw_rawnand_mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)

description:mtd write data interface

@to:offset to MTD device

@len:want write data len

@retlen:return the writen len

@buf:data buffer

return:success return 0, fail return code fail

3.4.1.5 aw_rawnand_mtd_write_oob
static int aw_rawnand_mtd_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *
ops)

description:write data with oob

@mtd:MTD device structure

@to:offset to MTD device

@ops:oob operation descrition structure

return:success return 0, fail return code fail

3.4.1.6 aw_rawnand_mtd_block_isbad

static int aw_rawnand_mtd_block_isbad(struct mtd_info *mtd, loff_t ofs)

description:check block is badblock or not

@mtd:MTD device structure

@ofs: offset the mtd device start (align to simu block size)

return:true if the block is bad, or false if the block is good

3.4.1.7 aw_rawnand_mtd_block_markbad
static int aw_rawnand_mtd_block_markbad(struct mtd_info *mtd, loff_t ofs)

description:mark block at the given offset as bad block

@mtd:MTD device structure

@ofs:offset the mtd device start

return:success to mark return 0, or fail return fail code.

3.4.2 物理层接口

3.4.2.1 aw_spinand_chip_read_single_page
static int aw_spinand_chip_read_single_page(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Read physics on a page

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.2 aw_spinand_chip_write_single_page

static int aw_spinand_chip_write_single_page(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Write physics on a page

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.3 aw_spinand_chip_erase_single_block
static int aw_spinand_chip_erase_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Erase physics on a block

@chip:See 3.3.2

@req: See 3.3.3

return:zero on success, else a negative error code.

3.4.2.4 aw_spinand_chip_isbad_single_block
static int aw_spinand_chip_isbad_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Set to bad block

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

3.4.2.5 aw_spinand_chip_markbad_single_block
static int aw_spinand_chip_markbad_single_block(struct aw_spinand_chip *chip, struct aw_spinand_chip_request *req)

description:Set to bad block

@chip:See 3.3.2

@req:See 3.3.3

return:zero on success, else a negative error code.

4 模块配置

4.1 uboot 模块配置

Device Drivers-->Sunxi flash support-->
[*]Support sunxi nand devices
[*]Support sunxi nand ubifs devices
[*]Support COMM NAND V1 interface

如下图:

image-20221227120338239

​ 图 4-1: u-boot-spinand-menuconfig

4.2 kernel 模块配置

Device Drivers->Memory Technology Device(MTD) support-->sunxi-nand

image-20221227140347684

​ 图 4-2: UBI

image-20221227140501741

​ 图 4-3: ker_nand-cfg

image-20221227140541762

​ 图 4-4: ker_spinand

Device Drivers->SPI support

image-20221227140943318

​ 图 4-5: spi-1

image-20221227141017709

​ 图 4-6: spi-2

Device Drivers->DMA Engine support

image-20221227141059654

​ 图 4-7: DMA-1

image-20221227141126258

​ 图 4-8: DMA-2

Device Drivers->SOC(System On Chip)

image-20221227141153846

​ 图 4-9: SID

File systems-->Miscellaneous filesystems-->

image-20221227141435508

​ 图 4-10: menuconfig_spinand_ubifs

4.3 env.cfg

在 env.cfg 中添加修改下值,setargs_nand_ubi 先 copy 一份 setargs_nand 再添加对应变量

image-20221227141519171

​ 图 4-11: build-mkcmd

相关文章:

Linux SPI-NAND 驱动开发指南

文章目录Linux SPI-NAND 驱动开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员3 流程设计3.1 体系结构3.2 源码结构3.3 关键数据定义3.3.1 flash 设备信息数据结构3.3.2 flash chip 数据结构3.3.3 aw_spinand_chip_request3.3.4 ubi_ec_hdr3.3.5 ubi_vid_hdr3.4 关键接口说…...

【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据

本文接着系列文章&#xff08;2&#xff09;进行介绍&#xff0c;以VUE2为开发框架&#xff0c;该文涉及代码存放在HelloWorld.vue中。相较于上一篇文章对div命名class等&#xff0c;该文简洁许多。<template> <div></div> </template>接着引入核心库i…...

在windows搭建Redis集群并整合入Springboot项目

搭建集群配置规划Redis集群编写bat来启动每个redis服务安装Ruby安装Redis的Ruby驱动出现错误镜像过期SSL证书过期安装集群脚本redis-trib启动每个节点并执行集群构建脚本测试搭建是否成功配置springboot项目中配置规划Redis集群 我们搭建三个节点的集群&#xff0c;每个节点有…...

C++【内存管理】

文章目录C内存管理一、C/C内存分布1.1.C/C内存区域划分图解&#xff1a;1.2.根据代码进行内存区域分析二、C内存管理方式2.1.new/delete操作内置类型2.2.new和delete操作自定义类型三、operator new与operator delete函数四、new和delete的实现原理4.1.内置类型4.2.自定义类型4…...

Spring Cloud Nacos源码讲解(六)- Nacos客户端服务发现

Nacos客户端服务发现源码分析 总体流程 首先我们先通过一个图来直观的看一下&#xff0c;Nacos客户端的服务发现&#xff0c;其实就是封装参数、调用服务接口、获得返回实例列表。 ​ 但是如果我们要是细化这个流程&#xff0c;会发现不仅包括了通过NamingService获取服务列表…...

华为OD机试题,用 Java 解【计算最大乘积】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...

蓝牙运动耳机哪个好,比较好的运动蓝牙耳机

很多想选择蓝牙运动耳机的朋友都不知道应该如何选择&#xff0c;运动首先需要注意的就是耳机的防水能力以及耳机佩戴舒适度&#xff0c;在运动当中会排出大量的汗水&#xff0c;耳机防水等级做到越高&#xff0c;可以更好地保护耳机不受汗水浸湿&#xff0c;下面就分享五款适合…...

苹果设计可变色Apple Watch表带,智能穿戴玩法多

苹果最新技术专利显示&#xff0c;苹果正在为 Apple Watch 设计一款可变色的表带&#xff0c;可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍&#xff0c;这款表带里的灯丝具有电致变色功能&#xff0c;可以通过施加不同的电压&#xff0c;来实现显示多种颜色或…...

Elasticsearch集群Yellow亚健康状态修复

Elasticsearch集群Yellow亚健康状态修复问题背景排查流程解决办法问题背景 Elasticsearch集群健康状态为Yellow&#xff0c;涉及到多个索引。 排查流程 在浏览器打开Kibana Console进行问题排查&#xff0c;console地址为&#xff1a; http://{Kibana_IP}:5601/app/dev_too…...

第52讲:SQL优化之UPDATE更新操作的优化

文章目录 1.UPDATE更新语句的优化2.UPDATE更新语句优化案例1.UPDATE更新语句的优化 我们在使用UPDATE更新语句更改表中数据时,可能会导致表中产生行级锁或者是表级锁。 UPDATE语句的优化就是为了避免表中出现表级锁,从而影响并发的性能。 当UPDATE语句更新表数据时,WHERE…...

logback 自定义日志输出到数据库

项目日志格式 Spring Boot 的默认日志输出类似于以下示例&#xff1a; 2021-12-14 22:40:14.159 INFO 20132 --- [ main] com.kuangstudy.SpringbootApplication : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)输出以下项目&…...

< elementUi 组件插件: el-table表格拖拽修改列宽及行高 及 使用注意事项 >

elementUi 组件插件&#xff1a; el-table拖拽修改列宽及行高 及 使用注意事项&#x1f449; 资源Js包下载及说明&#x1f449; 使用教程> 实现原理> 局部引入> 全局引入 &#xff08;在main.js中&#xff09;&#x1f449; 注意事项往期内容 &#x1f4a8;&#x1f4…...

微信小程序的分享朋友圈

分享朋友圈官方API&#xff1a;分享到朋友圈 1、分享到朋友圈接口设置事项&#xff1a; 2、onShareTimeline()注意事项&#xff1a; 3、分享朋友圈后&#xff0c;测试发现&#xff0c;没有数据请求。 用户在朋友圈打开分享的小程序页面&#xff0c;并不会真正打开小程序&…...

华为OD机试真题Python实现【 寻找路径】真题+解题思路+代码(20222023)

寻找路径 题目 二叉树也可以用数组来存储,给定一个数组,树的根节点的值储存在下标 1, 对于储存在下标 n 的节点,他的左子节点和右子节点分别储存在下标 2*n 和 2*n+1, 并且我们用 -1 代表一个节点为空。 给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,…...

九头蛇hydra爆破http示例

使用hydra执行http表单暴力破解 通过浏览器自带分析得知: 提交地址:http://10.0.0.115/student_attendance/ajax.php?action=login 提交方式:POST 提交数据:username=a&password=a 服务响应:3 根据以上收集的信息就可以使用hydra进行密码爆破 hydra 10.0.0.115 http…...

jQuery基本使用

获取和设置元素内容学习目标能够知道获取和设置元素内容的操作1. html方法的使用jquery中的html方法可以获取和设置标签的html内容示例代码:<script>$(function(){var $div $("#div1");// 获取标签的html内容var result $div.html();alert(result);// 设置…...

互联网企业如何进行数字化转型?业务需求迭代频繁的应对之策!

互联网行业作为我国数字经济发展“四化”框架中生产力主要组成部分&#xff0c;是国家数字化转型的主要推动者之一。为此&#xff0c;相对于其他传统行业来说&#xff0c;互联网行业企业数字化转型的紧迫程度更高&#xff0c;如果不数字化转型或者转型不成功&#xff0c;会有更…...

前端学习日记——Vue之Vuex初识(一)

前言 学习前端一段时间了&#xff0c;因为一直是做Python开发&#xff0c;所以凭借着语言的通性学习Javascript、Vue轻快很多&#xff0c;但一些碎片化的知识及插件的使用方法还是需要记录一下&#xff0c;时而复习&#xff0c;形成系统化的知识体系&#xff08;PS&#xff1a;…...

【C++】Windows动态库【.DLL文件】制作方法总结

如题&#xff0c;我们本篇介绍如何制作DLL&#xff0c;将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等。 目录 一、DLL介绍 二、C制作DLL文件 2.1 DLL端 2.2 调用端 三、DLL导出类方法 四、COM技术制作DLL…...

C 语言编程 — HelloWorld

目录 文章目录目录安装 Linux GCC 编译器YUM 安装发行版本编译安装指定版本HelloWorld基本语法编码运行安装 Linux GCC 编译器 YUM 安装发行版本 $ yum install gcc vim -y$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) Copyright © 2015 Free Software…...

蓝桥杯入门即劝退(二十一)三数之和(梦破碎的地方)

欢迎关注点赞评论&#xff0c;共同学习&#xff0c;共同进步&#xff01;------持续更新蓝桥杯入门系列算法实例--------如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01;你的点赞、关注、评论、是我创作的动力&#xff01;-------希望我的文章对你有所…...

element 下拉框支持搜索并输入

前言 下拉框对于开发来说再常见不过了&#xff0c;也是界面设计中的常用组件&#xff0c;在部分使用场景下&#xff0c;我们需要做到下拉框可以选择的同时&#xff0c;支持搜素和输入&#xff0c;以 element 的下拉框组件为例&#xff0c;当我们同时设置属性让其支持搜素和输入…...

JVM详解——垃圾回收

如果有兴趣了解更多相关内容的话&#xff0c;可以看看我的个人网站&#xff1a;耶瞳空间 GC&#xff1a;垃圾收集(Gabage Collection)&#xff0c;内存处理是编程人员容易出现问题的地方&#xff0c;忘记或者错误的内存。不当的回收可能会导致程序或系统的不稳定甚至崩溃&…...

spring之集成Mybatis

文章目录一、实现步骤1、准备数据库表2、在IDEA中创建一个模块&#xff0c;并引入依赖3、基于三层架构实现4、编写pojo5、编写mapper接口6、编写mapper配置文件7、编写service接口和service接口的实现类8、编写jdbc.properties配置文件9、编写mybatis-config.xml配置文件10、编…...

【面试宝典】准备面试了~集合

1、ArrayList和linkedList的区别 它们都是继承自 Collection。 ArrayList 是基于数组的&#xff0c;在使用查询的时候效率比较高&#xff0c;但删除效率却非常低&#xff0c;因为它需要重新排数组中的所有数据。 LinkList底层是一个双链表&#xff0c;在添加和删除元素时更好…...

华为OD机试真题Python实现【GPU 调度】真题+解题思路+代码(20222023)

GPU 调度 题目 为了充分发挥 GPU 算力, 需要尽可能多的将任务交给 GPU 执行, 现在有一个任务数组, 数组元素表示在这1s内新增的任务个数, 且每秒都有新增任务, 假设 GPU 最多一次执行n个任务, 一次执行耗时1s, 在保证 GPU 不空闲的情况下,最少需要多长时间执行完成。…...

gcc编译C源程序

一、安装 在Linux下&#xff0c;一般使用gcc或arm-linux-gcc交叉编译器来编译程序。在Ubuntu环境下&#xff0c;我们可以使用以下apt-get命令来安装这些编译程序。 apt-get install gcc apt-get install gcc-arm-linux-gnueabi 安装完毕后&#xff0c;使用以下命令查看编译器…...

Tina_Linux_各平台多媒体格式_支持列表_new

Tina Linux 各平台多媒体格式支持列表 1 概述 1.1 编写目的 本文档将介绍Allwinner Tina Linux 系统各个芯片平台支持的多媒体格式&#xff0c;旨在帮助软件开发工程师、技术支持工程师查找各芯片平台支持哪些多媒体格式。 1.2 适用范围 Tina Linux v3.5 及以上版本。 1.…...

归并排序及其应用

归并排序算法基于分而治之的概念&#xff0c;具体来说就是遍历一棵树&#xff0c;归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的&#xff0c;我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程&#xff0c;我们很容…...

【PAT甲级题解记录】1007 Maximum Subsequence Sum (25 分)

【PAT甲级题解记录】1007 Maximum Subsequence Sum (25 分) 前言 Problem&#xff1a;1007 Maximum Subsequence Sum (25 分) Tags&#xff1a;DP Difficulty&#xff1a;剧情模式 想流点汗 想流点血 死而无憾 Address&#xff1a;1007 Maximum Subsequence Sum (25 分) 问题描…...