当前位置: 首页 > 编程日记 > 正文

MTD NANDFLASH驱动相关知识介绍

转:http://blog.csdn.net/zhouzhuan2008/article/details/11053877

目录

  1. MTD总概述
  2. MTD数据结构 
  3. MTD相关层实现
MTD,Memory Technology Device即内存技术设备

字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问;同时,两者读写数据的基本单元不同。

字符设备,以字节为基本单位,在Linux中,字符设备实现的比较简单,不需要缓冲区即可直接读写,内核例程和用户态API一一对应,用户层的Read函数直接对应了内核中的Read例程,这种映射关系由字符设备的file_operations维护。

块设备,则以块为单位接受输入和返回输出。对这种设备的读写是按块进行的,其接口相对于字符设备复杂,read、write API没有直接到块设备层,而是直接到文件系统层,然后再由文件系统层发起读写请求。 
同时,由于块设备的IO性能与CPU相比很差,因此,块设备的数据流往往会引入文件系统的Cache机制。

MTD设备既非块设备也不是字符设备,但可以同时提供字符设备和块设备接口来操作它。

MTD总概述

Linux中MTD的所有源码位于/drivers/mtd子目录下,

MTD设备通常可分为四层 
这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。

一、Flash硬件驱动层 
硬件驱动层负责在init时驱动Flash硬件并建立从具体设备到MTD原始设备映射关系 
tip: 映射关系通常包括 分区信息、I/O映射及特定函数的映射 
drivers/mtd/chips :   CFI/jedec接口通用驱动 

drivers/mtd/nand :   nand通用驱动和部分底层驱动程序 
drivers/mtd/maps :   nor flash映射关系相关函数 
drivers/mtd/devices:   nor flash底层驱动

二、MTD原始设备 
用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。 
mtdcore.c :  MTD原始设备接口相关实现 
mtdpart.c :  MTD分区接口相关实现

三、MTD设备层 
基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。 
mtdchar.c :  MTD字符设备接口相关实现 
mtdblock.c : MTD块设备接口相关实现

四、设备节点 
通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)和MTD字符设备节点(主设备号为90) 
通过访问此设备节点即可访问MTD字符设备和块设备 
具体参考:  working-with-mtd-devices

五、文件系统 
内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。

MTD数据结构 

重要的数据结构: 
1. mtd_info 表示mtd原始设备, 所有mtd_info结构体被存放在mtd_info数组mtd_table中

2. mtd_part   表示MTD分区,其中包含了 mtd_info,每一个分区都是被看成一个MTD 原始设备 
在mtd_table中,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part->master中获得 
tip: master不作为一个mtd原始设备加入mtd_table

各层之间的交互如下图

image    
mtd_info的主要数据结构

作用
typemtd类型, 包括MTD_NORFLASH,MTD_NANDFLASH等(See mtd-abi.h)
flags标志位, MTD_WRITEABLE,MTD_NO_ERASE等(See mtd-abi.h)
sizemtd设备的大小
erasesize主要的擦除大小, 即Flash的块大小 (tip: mtd设备可能有多个erasesize)
writesize写大小, 对于norFlash是字节,对nandFlash为一页
oobsize每块oob数据量, eg 16
oobavail 
name命名
index 
ecclayoutnand_ecclayout结构体指针, 表示的是ecc布局,可参考硬件手册的OOB中ecc布局
numeraseregions可变擦除区域的数目, 通常为1
eraseregionsmtd_erase_region_info结构体指针, 可变擦除区域
erase擦除Flash函数
read/write读写Flash函数
read_oob/write_oob带oob读写Flash函数
suspend/resumePower Management functions
priv私有数据, cfi接口flash指向map_info结构, 或指向自定义flash相关结构体
  

mtd_part的主要数据结构

作用
mtd分区信息, 大部分由master决定
master分区的主分区
offset分区的偏移地址
index分区号 (3.0后不存在该字段)
list将mtd_part链成一个链表mtd_partitons
  

mtd_partition的主要数据结构

作用
name 
size 
offset 
mask_flags 
ecclayout 
mtdp 
  

map_info的主要数据结构

作用
name名称
size大小
phys物理地址
bankwidth总线宽度(in octets)
virt虚拟地址,通常通过ioremap将物理地址进行映射得到
read/copy_from/write/copy_to读写函数
map_priv_1/map_priv_2驱动可用的私有数据
  

nand_chip的主要数据结构

作用
IO_ADDR_R/IO_ADDR_W读/写8根io线的地址
read_byte/read_word从芯片读一个字节/字
read_buf/write_buf读芯片读取内容至缓冲区/将缓冲区内容写入芯片
verify_buf 
select_chip 
block_bad检查是否坏块
block_markbad标识坏块
cmd_ctrl硬件相关控制函数
init_size 
dev_ready 
cmdfunc命令处理函数
waitfunc 
erase_cmd擦除命令
scan_bbt扫描坏块
errstat 
write_page 
options与具体的NAND 芯片相关的选项, 如NAND_USE_FLASH_BBT等(nand.h)
page_shift 
  
ecclayoutnand_ecclayout类型结构体, ECC布局信息
eccnand_ecc_ctrl类型结构体, ECC控制结构
  
  
  

nand_ecclayout的主要数据结构

作用
eccbytesecc的字节数(For 512B-per-page, eccbytes is 3)
eccposecc数据在oob中的位置
oobavailoob中可用的字节数, MTD 会根据其它三个变量自动计算得到
oobfreenand_oobfree类型结构体, 显示定义空闲的oob 字节
  

MTD相关层实现

MTD设备层

mtd字符设备接口: 
mtdchar.c 实现了字符设备接口,通过它,用户可以直接操作Flash 设备。 
Ø 通过read()、write()系统调用可以读写Flash。 
Ø 通过一系列IOCTL 命令可以获取Flash 设备信息、擦除Flash、读写NAND 的OOB、获取OOB layout 及检查NAND 坏块等(MEMGETINFO、MEMERASE、MEMREADOOB、MEMWRITEOOB、MEMGETBADBLOCK IOCRL) 
tip: mtd_read和mtd_write直接直接调用mtd_info的read 函数,因此,字符设备接口跳过patition这一层

mtd块设备接口: 
主要原理是将Flash的erase block 中的数据在内存中建立映射,然后对其进行修改,最后擦除Flash 上的block,将内存中的映射块写入Flash 块。整个过程被称为read/modify/erase/rewrite 周期。 
但是,这样做是不安全的,当下列操作序列发生时,read/modify/erase/poweroff,就会丢失这个block 块的数据。 
块设备模拟驱动按照block 号和偏移量来定位文件,因此在Flash 上除了文件数据,基本没有额外的控制数据。

 

MTD原始设备层

 

MTD硬件驱动层

1. NOR Flash驱动结构

Linux系统实现了针对cfi,jedec等接口的通用NOR Flash驱动 
在上述接口驱动基础上,芯片级驱动较简单 
     定义具体内存映射结构体map_info,然后通过接口类型后调用do_map_probe()  
以h720x-flash.c为例(位于drivers/mtd/maps) 
- 定义map_info结构体, 初始化成员name, size, phys, bankwidth 
- 通过ioremap映射成员virt(虚拟内存地址) 
- 通过函数simple_map_init初始化map_info成员函数read,write,copy_from,copy_to 
- 调用do_map_probe进行cfi接口探测, 返回mtd_info结构体 
- 通过parse_mtd_partitions, add_mtd_partitions注册mtd原始设备

2. NAND Flash驱动结构 

Linux实现了通用NAND驱动(drivers/mtd/nand/nand_base.c) 
tip: For more, check 内核中的NAND代码布局  
芯片级驱动需要实现nand_chip结构体 
MTD使用nand_chip来表示一个NAND FLASH芯片, 该结构体包含了关于Nand Flash的地址信息,读写方法,ECC模式,硬件控制等一系列底层机制。 
Ø NAND芯片级初始化 
主要有以下几个步骤: 

- 分配nand_chip内存,根据目标板及NAND控制器初始化nand_chip中成员函数(若未初始化则使用nand_base.c中的默认函数),将mtd_info中的priv指向nand_chip(或板相关私有结构),设置ecc模式及处理函数 
- 以mtd_info为参数调用nand_scan()探测NAND FLash。 
   nand_scan()会读取nand芯片ID,并根据mtd->priv即nand_chip中成员初始化mtd_info 
- 若有分区,则以mtd_info和mtd_partition为参数调用add_mtd_partitions()添加分区信息 
-

Ø MTD对NAND芯片的读写 
主要分三部分: 

A、struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口; 
B、struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作; 
C、struct nand_chip中的读写函数,如read_buf,cmdfunc等,与具体的NAND controller相关,就是这部分函数与硬件交互,通常需要我们自己来实现。 
tip: nand_chip中的读写函数虽然与具体的NAND controller相关,但是MTD也为我们提供了默认的读写函数,如果NAND controller比较通用(使用PIO模式),那么对NAND芯片的读写与MTD提供的这些函数一致,就不必自己实现这些函数。

上面三部分读写函数相互配合完成对NAND芯片的读写 
首先,MTD上层需要读写NAND芯片时,会调用struct mtd_info中的读写函数,接着struct mtd_info中的读写函数就会调用struct nand_chip或struct nand_ecc_ctrl中的读写函数,最后,若调用的是struct nand_ecc_ctrl中的读写函数,那么它又会接着调用struct nand_chip中的读写函数。 
eg:  以读为例 
MTD上层会调用struct mtd_info中的读page函数,即nand_read函数。 
接着nand_read函数会调用struct nand_chip中cmdfunc函数,这个cmdfunc函数与具体的NAND controller相关,它的作用是使NAND controller向NAND 芯片发出读命令,NAND芯片收到命令后,就会做好准备等待NAND controller下一步的读取。 
接着nand_read函数又会调用struct nand_ecc_ctrl中的read_page函数,而read_page函数又会调用struct nand_chip中read_buf函数,从而真正把NAND芯片中的数据读取到buffer中(所以这个read_buf的意思其实应该是read into buffer,另外,这个buffer是struct mtd_info中的nand_read函数传下来的)。 
read_buf函数返回后,read_page函数就会对buffer中的数据做一些处理,比如校验ecc,以及若数据有错,就根据ecc对数据修正之类的,最后read_page函数返回到nand_read函数中。 
对NAND芯片的其它操作,如写,擦除等,都与读操作类似 

http://www.cnblogs.com/hzl6255/archive/2012/12/18/2824043.html

 

MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层 (从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 

  一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程 序则位于/drivers/mtd/nand子目录下。

  二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。 用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。mtd_table(mtdcore.c)则是所 有MTD原始设备的列表,mtd_part(mtd_part.c)是用于表示MTD原始设备分区的结构,其中包含了mtd_info,因为每一个分区都 是被看成一个MTD原始设备加在mtd_table中的,mtd_part.mtd_info中的大部分数据都从该分区的主分区 mtd_part->master中获得。 在drivers/mtd/maps/子目录下存放的是特定的flash的数据,每一个文件都描述了一块板子上的flash。其中调用 add_mtd_device()、del_mtd_device()建立/删除mtd_info结构并将其加入/删除mtd_table(或者调用 add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/删除mtd_part结构并将 mtd_part.mtd_info加入/删除mtd_table 中)。 

  三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。MTD字符设备的定义在 mtdchar.c中实现,通过注册一系列file operation函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。 

  四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。 

  五、根文件系统:在Bootloader中将JFFS(或JFFS2)的文件系统映像jffs.image(或jffs2.img)烧到flash的 某一个分区中,在/arch/arm/mach-your/arch.c文件的your_fixup函数中将该分区作为根文件系统挂载。 

  六、文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。

http://www.cnblogs.com/hoys/archive/2012/05/30/2526230.html

 

//----------------------------------------------个人见解----------------------------------------

 

1、linux nandflash驱动主要工作在于nand_chip结构体填充(linux内核在MTD的下层实现了通用的nand驱动(主要通过drivers/mtd/nand_base.c文件实现),因此芯片级的nand驱动不再需要实现mtd_info中的read、write、read_oob等函数,而主体转移到了nand_chip数据结构体填充上)、内核flash分区表配置两部分,而nand_chip结构体填充驱动一般芯片厂商提供的开发包中会有这个驱动,例如dm365的nand_chip结构体填充驱动就是drivers/mtd/nand/davinvi-nand.c

在davinvi-nand.c驱动中,会涉及到一个ecc布局的结构体struct nand_ecclayout如下:

static struct nand_ecclayout hwecc4_small __initconst = {
.eccbytes = 10,
.eccpos = { 0, 1, 2, 3, 4,
/* offset 5 holds the badblock marker */
6, 7,
13, 14, 15, },
.oobfree = {
{.offset = 8, .length = 5, },
{.offset = 16, },
},
};

nand_ecclayout结构体指针, 表示的是ecc布局,可参考硬件手册的OOB中ecc布局。

下面是相关的一些成员介绍:

 

struct nand_ecclayout {

uint32_t eccbytes;    //表示使用几个ecc字节

uint32_t eccpos[128]; //表示ecc占用的位置,因为现在大页面4kbyte也就128个,所以这里写了128,

                                   //以后有更大页面的,这里也要改了。

uint32_t oobavail;       //有几个oob可用,这个跟下面的成员有点像,一般用下面的

struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];  //定义oob有效个数,从哪开始等

};

 

 

给个例子:

 

static struct nand_ecclayout mylayout = {

#ifdef CONFIG_SYS_NAND_PAGE_2K

.eccbytes = 40,

.eccpos = { 

24, 25, 26, 27, 28,

29, 30, 31, 32, 33, 34, 35, 36, 37, 38,

39, 40, 41, 42, 43, 44, 45, 46, 47, 48,

49, 50, 51, 52, 53, 54, 55, 56, 57, 58,

59, 60, 61, 62, 63, 

},

.oobfree = {

{.offset = 2, .length = 22, },

},

#endif

}
 其中,.eccbytes = 40,跟初始化有关系,我们一般这样初始化:

 

nand->ecc.size = 512; 

nand->ecc.bytes = 10;

恩,这下明朗了,我们需要每512个字节产生10个ecc字节,因此对2kbyte页面的flash来说,一页就是4个512,因此需要4*10=40个ecc字节。

.eccpos就是告诉驱动,这些ecc字节放在哪里,一般是按顺序存放,不要覆盖芯片默认的坏块标记位,对2kbyte的flash来说,厂家说是前两个即第0、1个字节是坏块标志。

所以分配为eccbytes和eccpos后,后面有个oobfree,这样看来也很明白了:

offset=2表示从第2个字节开始(因为前面2个是坏块标志啊~~),length=22表示(从offset开始)共22个ecc字节可以用户随便用。

这下一目了然了吧。

2、有了nand_chip结构体填充驱动了,接下来需要往系统注册一个nand flash设备了,一般情况是在板级初始化的代码中,一般目录是arch/arm/mach****/****.c文件(或者也有可能在devices.c中),在这个文件中,一般会包括定义nandflash分区信息结构,注册nandflash设备,其中还包括了定义一些IO资源,用于主控器驱动获得IO资源配置相应的寄存器以及数据读取。例如dm365的板级初始化文件:arch/arm/mach-davinci/board-dm365-evm.c中:

#define NAND_BLOCK_SIZE(SZ_16K)//32MB or 64MB
static struct mtd_partition nand_partitions[] = {
/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */
{
.name = "bootloader",
.offset = 0,
.size = 32 * NAND_BLOCK_SIZE,
.mask_flags = MTD_WRITEABLE,/* force read-only */
},
/* bootloader params in the next sector 15 */
{
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 96 * NAND_BLOCK_SIZE,
.mask_flags = MTD_WRITEABLE,/* force read-only */
},
/* kernel in sectors: 16 */
{
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
.mask_flags = 0
},
{
.name = "filesystem1",
.offset = MTDPART_OFS_APPEND,
.size = SZ_16M,//SZ_16M + SZ_8M,
.mask_flags = 0
},
{
.name = "filesystem2",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,//SZ_8M,
.mask_flags = 0
},
{
.name = "Calibration",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
.mask_flags = 0
}
};

上面是nandflash分区信息定义结构体,在上面结构体中,总共为nandflash分成了6个区,在系统启动后,可以通过ls /dev/mtdblock*查看到所有的分区,看到的mtdblock*设备文件节点从0开始分别对应上面数组中的六个分区,如果需要使用哪个分区,则可以通过mount挂载到文件系统中使用。也能通过系统启动时打印的信息看到分区情况:

Creating 6 MTD partitions on "nand_davinci.0":
0x00000000-0x00080000 : "bootloader"
0x00080000-0x00200000 : "params"
0x00200000-0x00400000 : "kernel"
0x00400000-0x01400000 : "filesystem1"
0x01400000-0x01600000 : "filesystem2"
0x01600000-0x04000000 : "Calibration"

按照上面信息可以看出,文件系统是保存在0x00400000-0x01400000或者0x01400000-0x01600000地址段中(后面假设系统是只用filesystem1),内核是保存0x00200000-0x00400000地址段中,所以在烧录内核时,应该使用nand write 0x80700000 0x00200000 0x00300000(其中0x00300000表示写入大小,0x00200000表示写入nandflash的起始地址,0x80700000表示从内存的这个地址读出内核烧写到对应的nandflash地址中),而烧录文件可以通过网络文件系统启动板子,再将上面的filesystem1挂载在mnt/目录下:mount /dev/mtdblock3 /mnt/mtd3,然后直接将要烧录的文件系统解压到这个filesystem1分区中,也能通过网络上其它方式烧录文件系统,如yaffs jffs2等等,烧钱文件系统前,必须通过nand erase在uboot阶段擦除这块地址段中的flash数据,如擦写filesystem1的数据命令:nand erase 0x00400000 ********* (***表示擦写块大小) 

 

static struct resource nand_resources[] = {
[0] = {
/* First memory resource is AEMIF control registers */
.start = DM365_ASYNC_EMIF_CNTRL_BASE,
.end = DM365_ASYNC_EMIF_CNTRL_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
/* Second memory resource is NAND I/O window */
.start = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE,
.end = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_16K - 1,
.flags = IORESOURCE_MEM,
},
[2] = {
/* Third (optional) memory resource is NAND I/O window */
/* for second NAND chip select */
.start = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + SZ_16K,
.end = DAVINCI_ASYNC_EMIF_DATA_CE0_BASE + 2 * SZ_16K - 1,
.flags = IORESOURCE_MEM,
},
};

上面数组中定义的是nandflash接口(一般接在EMIF上)的IO内存资源,需要注意的是,这个数组如何定义取决于nandflash驱动(drivers/mtd/nand/davinvi-nand.c)中代码是如何使用这些资源的,比如说davinci-nand.c获取资源是platform_get_resource(pdev, IORESOURCE_MEM, 0),而获取的这个资源是用于控制寄存器配置的,则上面数组中0成员就必须是EMIF控制寄存器的IO内存地址,如果这个资源是用于访问nandflash数据的,则0数组的成员就必须是EMIF数据寄存器。所以这个数组的定义需要配置davinci-nand.c驱动的编写来更改。

转载于:https://www.cnblogs.com/pengdonglin137/p/3467960.html

相关文章:

Spring Boot轻松理解动态注入,删除bean

原文地址:http://412887952-qq-com.iteye.com/blog/2348445 ​ 我们通过getBean来获得对象,但这些对象都是事先定义好的,我们有时候要在程序中动态的加入对象.因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就…

mysql数据库常见进阶使用

事务 1)mysql中的工作单元,由一个或者多个sql语句组成,“不成功便成仁”,要么全部执行成功,要么全部执行失败,以此来保证数据的一致性。 2)事务的回滚:如果事务中的任何一个sql执行失…

[转]web打印实现方案 Lodop6.034 使用方法总结

本文转自:https://www.cnblogs.com/tiger8000/archive/2011/09/19/2181365.html 官文下载: http://mtsoftware.v053.gokao.net/download.html 本地 Lodop6.034 版本下载:/Files/tiger8000/Lodop6.034.rar 假设你的 lodop 打印控件放在你项目的…

图片的另一种展现—将后台图片编码直接展现为图片

1、应用场景 开发过程中,遇到这样的需求:需要将服务器上的图片展现在页面上,但是图片所在服务器不是对外的,图片所在服务器与应用服务器也不在同一台机器上,这时候就需要在开发中先将图片读出来,返回给应用…

电子学会青少年编程等级考试Python一级题目解析12

Python一级题目解析 1、题目(2021.03) 写一个计算长方形面积的程序,并对每行代码进行相应的注释,要求如下: (1)采用多行注释,说明程序的功能(如下)&#x…

Swing基础知识(更新中)

Swing是什么 做桌面应用程序的界面,GUI。 组件和容器:容器是特殊的组件。 布局管理器: 一般放中间容器,用来控制容器中组件的排列方式。 常见: ① FlowLayout 流布局(默认布局) 左上是起点,按组件加入容…

timesten 修改最大连接数

修改完/var/Timesten/sys.odbc.ini里面的connections之后 重启TT:ttdaemonadmin -restart 报错:15019: Only the instance admin may alter the Connections attribute Command> Command> connect dsn的名称;15019: Only the instance admin may a…

青少年编程竞赛交流群第050次活动录播

背景介绍 把电子学会的青少年编程能力等级测评作为游戏的关卡,带着小朋友们升级打怪,这个想法来自于 我从邵慧宁身上得到的启发。 升级打怪: 电子学会考评中心:http://www.qceit.org.cn/bos/default.html 知识内容&#xff1a…

JDBC连接mysql数据的7个步骤(讲解+源码)

步骤 源码 DBUtils类 package com.csu.db;import java.sql.*;public class DBUtils {public static Connection getConnection(){try {//[1/7] 加载JDBC的驱动Class.forName("com.mysql.cj.jdbc.Driver");//[2/7] 定义url连接参数String url "jdbc:mysql://l…

UML:概要设计,用什么画我的类图?

背景 做过需求之后,很少使用 UML 画概要设计,这几天尝试的用了几个工具,最总还是选择了 VisualStudio。 Edraw 详细信息很难编辑,如:签名。 Viso 添加成员太麻烦了。 VisualStudio 图形不支持着色。 备注 使用 VisualS…

RN Exception: Before building your project, you need to accept the license agreements and comp le...

异常 * What went wrong: A problem occurred configuring project :app. > You have not accepted the license agreements of the following SDK components: [Android SDK Platform 23, Android SDK Build-Tools 23.0.1]. Before building your project, you need to acc…

【组队学习】【35期】李宏毅机器学习(含深度学习)

李宏毅机器学习(含深度学习) 航路开辟者:王茂霖、陈安东,刘峥嵘,李玲领航员:梁家晖航海士:程浩伟、周小要、吴昌广 基本信息 开源内容:https://linklearner.com/datawhale-homepa…

git关键原理简介

集中化版本控制 缺点:1中央仓库得相当稳定,出问题可能每个人那里都没完整备份 2 只能在线使用(今天网络已经不是问题) 分布式版本控制 改进:每台客户机在本地都维护一份仓库 主要特点 保存数据和文件的主要方式 每个…

项目管理和缺陷跟踪工具Redmine

官网: http://www.redmine.org/ http://demo.redmine.org/ 下载: http://www.redmine.org/projects/redmine/wiki/Download Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示。同时它又支持多项目管理…

Redis (二)_ jedis的使用

Jedis 是 Redis 官方首选的 Java 客户端开发包 虚拟机设置 查看虚拟机的ipifconfig 将虚拟机的6379端口打开#运行下面的命令 如果是新建的一个新的 文件,你需要先安装 iptables,再打开 vim /etc/sysconfig/iptables## 安装命令 yum install -y iptables-…

【组队学习】【35期】数据可视化(Matplotlib)

数据可视化(Matplotlib) 航路开辟者:杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员:武帅航海士:叶庭云、李显、郭棉昇 基本信息 开源内容:https://github.com/datawhalechina/fantastic-matplotlib开源内…

解决日常bug的正确姿势

bug的错误分两种情况: ① 控制台报错->可以定位到错误位置(比较想看到的) ② 控制台不报错却达不到想要的功能->设计代码的逻辑有问题 问题解决方案的优先级(由高到低) ① 自己解决 a. 分析控制台的错误信息描述->定位问题的代码行数->分析该行代码前后…

02-NLP-01-python正则表达式

Python正则表达式 by 寒小阳(hanxiaoyang.mlgmail.com) 正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎。 我们在大文本中匹配字符串时,有些情况用str自带的函数(比如find, in)可能可以完成,有些情况会稍稍复杂一些(比如说…

【组队学习】【35期】SQL编程语言

SQL编程语言 航路开辟者:王复振、杨煜、闫钟峰、杨梦迪、苏鹏领航员:庞永生航海士:王彦淳、木卷、丁一超 基本信息 开源内容:https://github.com/datawhalechina/wonderful-sql开源内容:https://hub.fastgit.org/da…

神经网络基础知识梳理

神经网络是什么 说明: 我们在机器学习中谈论的神经网络是指“神经网络学习”,即机器学习与神经网络这两个学科领域的交叉部分。 生物学意义上神经网络的最基本成分是神经元,计算机科学中的神经网络的最基本成分是神经元模型。 最广泛的一种…

Xcode 5 Error CertUIFramework.axbundle

Xcode 5 新建项目&#xff0c;运行总是出现错误&#xff1a; Cannot find executable forCFBundle0x8a7c7a0</Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/System/Library/AccessibilityBundle…

【组队学习】【35期】深入浅出Pytorch

深入浅出Pytorch 航路开辟者&#xff1a;李嘉骐、牛志康、刘洋、陈安东领航员&#xff1a;朱松青航海士&#xff1a;管柯琴、宋泽山、林旭升 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/thorough-pytorch内容属性&#xff1a;深度学习&#xff08;实践…

环形动画加载视图AnimatedCircleLoadingView​​​​​​​

2019独角兽企业重金招聘Python工程师标准>>> 环形动画加载视图AnimatedCircleLoadingView AnimatedCircleLoadingView是基于Android手表动画android-watch-loading-animation衍生出来的动画加载视图。该视图采用循环的环形动画显示加载进度。同时&#xff0c;开发者…

软件缺陷预测的两种定义

软件缺陷预测是根据软件产品中提取的度量信息和已经发现的缺陷来尽早地预测软件可能还存在的缺陷&#xff0c;基于预测结果可合理分配测试和验证资源。 软件缺陷预测作为实证软件工程的一个重要方向&#xff0c;通过对软件开发过程中积累的历史数据进行挖掘与分析&#xff0c;…

php函数:register_shutdown_function

php中register_shutdown_function函数用法详解&#xff1a; 由于程序出现一些不可预知的问题&#xff0c;给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下)&#xff0c;不是一个很好的处理方法 . PHP中有一个叫做 register_shutdown_function 的函数…

使用IDEA新建springboot工程

2019独角兽企业重金招聘Python工程师标准>>> 说明&#xff1a;因为习惯eclipse的workspace的结构&#xff0c;所以我提前新建了一个父工程&#xff0c;只是一个简单的maven工程&#xff0c;当做工作空间&#xff0c;下面的项目就是 module&#xff08;其实和项目一样…

【青少年编程竞赛交流】03月份微信图文索引

03月份微信图文索引 由于“组队学习”这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习&#xff0c;所以&#xff0c;我另外新建了这个微信公众号“青少年编程竞赛交流”&#xff0c;在这个公众号上分享有关青少年编程方面的知识&#xff0c;带小朋友们参…

使用LaTeX排版如何方便地引用多篇参考文献(不使用插件)

本文是一篇适合排版参考文献较多的论文的教程&#xff0c;目的如题。 环境&#xff1a;TexStudio 在文献管理工具中将题录导出为BibTex 打开这个文件&#xff0c;尽管是.txt结尾&#xff0c;内部格式应当是这样的 注意红框的内容&#xff0c;一会要用到。 在TexStudio里面新…

详解亚马逊:物流为何是电商命脉

在物流环节上&#xff0c;亚马逊(AMZN)主要涉及物流中心运营&#xff0c;商品配送环节主要采取和第三方快递公司合作完成。那么&#xff0c;亚马逊物流促销活 动反映在财务收支上的结果又如何&#xff1f;根据年报数据&#xff0c;2011年亚马逊收到来自用户支付的运费总计15.5亿…