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 中
-
BAD_BLK_FLAG_FRIST_1_PAGE
-
BAD_BLK_FLAG_FIRST_2_PAGE
-
BAD_BLK_FLAG_LAST_1_PAGE
-
BAD_BLK_FLAG_LAST_2_PAGE
• OperationOpt:支持的操作
-
SPINAND_DUAL_READ
-
SPINAND_QUAD_READ
-
SPINAND_QUAD_PROGRAM
-
SPINAND_QUAD_NO_NEED_ENABLE
-
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。
-
因为 UBI 可以异步擦除物理上的擦除块,所以可能出现以下情况:L 被异步擦除,所以 P 被安排擦除,然后 L 被写入,即。映射到另一个物理的擦除块 P1,所以 P1 被写入,然后不干净的重启发生。结果-有两个物理的 eraseblock P 和 P1 对应同一个逻辑的 eraseblock L。但是 P1 的序列号更大,所以 UBI 在连接 flash 时选择 P1。
-
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

图 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
如下图:

图 4-1: u-boot-spinand-menuconfig
4.2 kernel 模块配置
Device Drivers->Memory Technology Device(MTD) support-->sunxi-nand

图 4-2: UBI

图 4-3: ker_nand-cfg

图 4-4: ker_spinand
Device Drivers->SPI support

图 4-5: spi-1

图 4-6: spi-2
Device Drivers->DMA Engine support

图 4-7: DMA-1

图 4-8: DMA-2
Device Drivers->SOC(System On Chip)

图 4-9: SID
File systems-->Miscellaneous filesystems-->

图 4-10: menuconfig_spinand_ubifs
4.3 env.cfg
在 env.cfg 中添加修改下值,setargs_nand_ubi 先 copy 一份 setargs_nand 再添加对应变量

图 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地图数据
本文接着系列文章(2)进行介绍,以VUE2为开发框架,该文涉及代码存放在HelloWorld.vue中。相较于上一篇文章对div命名class等,该文简洁许多。<template> <div></div> </template>接着引入核心库i…...
在windows搭建Redis集群并整合入Springboot项目
搭建集群配置规划Redis集群编写bat来启动每个redis服务安装Ruby安装Redis的Ruby驱动出现错误镜像过期SSL证书过期安装集群脚本redis-trib启动每个节点并执行集群构建脚本测试搭建是否成功配置springboot项目中配置规划Redis集群 我们搭建三个节点的集群,每个节点有…...
C++【内存管理】
文章目录C内存管理一、C/C内存分布1.1.C/C内存区域划分图解: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客户端服务发现源码分析 总体流程 首先我们先通过一个图来直观的看一下,Nacos客户端的服务发现,其实就是封装参数、调用服务接口、获得返回实例列表。 但是如果我们要是细化这个流程,会发现不仅包括了通过NamingService获取服务列表…...
华为OD机试题,用 Java 解【计算最大乘积】问题
最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…...
蓝牙运动耳机哪个好,比较好的运动蓝牙耳机
很多想选择蓝牙运动耳机的朋友都不知道应该如何选择,运动首先需要注意的就是耳机的防水能力以及耳机佩戴舒适度,在运动当中会排出大量的汗水,耳机防水等级做到越高,可以更好地保护耳机不受汗水浸湿,下面就分享五款适合…...
苹果设计可变色Apple Watch表带,智能穿戴玩法多
苹果最新技术专利显示,苹果正在为 Apple Watch 设计一款可变色的表带,可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍,这款表带里的灯丝具有电致变色功能,可以通过施加不同的电压,来实现显示多种颜色或…...
Elasticsearch集群Yellow亚健康状态修复
Elasticsearch集群Yellow亚健康状态修复问题背景排查流程解决办法问题背景 Elasticsearch集群健康状态为Yellow,涉及到多个索引。 排查流程 在浏览器打开Kibana Console进行问题排查,console地址为: http://{Kibana_IP}:5601/app/dev_too…...
第52讲:SQL优化之UPDATE更新操作的优化
文章目录 1.UPDATE更新语句的优化2.UPDATE更新语句优化案例1.UPDATE更新语句的优化 我们在使用UPDATE更新语句更改表中数据时,可能会导致表中产生行级锁或者是表级锁。 UPDATE语句的优化就是为了避免表中出现表级锁,从而影响并发的性能。 当UPDATE语句更新表数据时,WHERE…...
logback 自定义日志输出到数据库
项目日志格式 Spring Boot 的默认日志输出类似于以下示例: 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 组件插件: el-table拖拽修改列宽及行高 及 使用注意事项👉 资源Js包下载及说明👉 使用教程> 实现原理> 局部引入> 全局引入 (在main.js中)👉 注意事项往期内容 💨Ǵ…...
微信小程序的分享朋友圈
分享朋友圈官方API:分享到朋友圈 1、分享到朋友圈接口设置事项: 2、onShareTimeline()注意事项: 3、分享朋友圈后,测试发现,没有数据请求。 用户在朋友圈打开分享的小程序页面,并不会真正打开小程序&…...
华为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);// 设置…...
互联网企业如何进行数字化转型?业务需求迭代频繁的应对之策!
互联网行业作为我国数字经济发展“四化”框架中生产力主要组成部分,是国家数字化转型的主要推动者之一。为此,相对于其他传统行业来说,互联网行业企业数字化转型的紧迫程度更高,如果不数字化转型或者转型不成功,会有更…...
前端学习日记——Vue之Vuex初识(一)
前言 学习前端一段时间了,因为一直是做Python开发,所以凭借着语言的通性学习Javascript、Vue轻快很多,但一些碎片化的知识及插件的使用方法还是需要记录一下,时而复习,形成系统化的知识体系(PS:…...
【C++】Windows动态库【.DLL文件】制作方法总结
如题,我们本篇介绍如何制作DLL,将代码类中的方法以接口的形式暴露出来给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…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
