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…...

蓝桥杯入门即劝退(二十一)三数之和(梦破碎的地方)
欢迎关注点赞评论,共同学习,共同进步!------持续更新蓝桥杯入门系列算法实例--------如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!你的点赞、关注、评论、是我创作的动力!-------希望我的文章对你有所…...

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

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

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

【面试宝典】准备面试了~集合
1、ArrayList和linkedList的区别 它们都是继承自 Collection。 ArrayList 是基于数组的,在使用查询的时候效率比较高,但删除效率却非常低,因为它需要重新排数组中的所有数据。 LinkList底层是一个双链表,在添加和删除元素时更好…...

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

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

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

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

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