关于NAND FLASH调试的一点总结

2023-05-16

https://www.freesion.com/article/5033494883/

很久没接触过 nandflash 驱动,最近工作又摸了,于是顺便整理总结一下。nandflash 在我看来算是比较落后的存储设备,所以文章里没有太多细节的东西,更多的是一些开发思路和经验,希望能帮助到有需要的人。

一、了解 nandflash 当前发展状况
什么是 nandflash?
nandflash 由许多保存位( bit )的单元( cell )组成,这些位通过电荷开启或关闭。这些开/关单元的组织方式表示存储在nandflash 上的数据。这些单元中的位数也决定了 nandflash 的命名,例如 Single Level Cell ( SLC ) nandflash 在每个单元中都包含一个位。MLC nandflash将每个单元的位数增加了一倍,而 TLC nandflash 则增加了三倍,这为更高容量的 nandflash 开辟了道路。

SLC 的优点是速度最快,最耐用,但缺点是价格昂贵,并且无法提供更高的存储容量。SLC 是企业使用的首选。与 SLC 相比,MLC 和 TLC 闪存的生产成本更低,存储容量更高,但要权衡相对较短的使用寿命和较慢的读/写速度。MLC 和 TLC 是日常消费计算机等个人用品的首选。

SLC \ MLC \ TLC nandflash 对照表:
在这里插入图片描述

为什么在嵌入式设备上 emmc 取代了 nandflash?

由于NAND Flash芯片的不同厂牌包括三星、KingMax、东芝(Toshiba)或海力士(Hynix)、美光(Micron)等,都需要根据每家公司的产品和技术特性来重新设计,过去并没有哪个技术能够通用所有厂牌的NAND Flash芯片。

而每次NAND Flash制程技术改朝换代,包括70纳米演进至50纳米,再演进至40纳米或30纳米制程技术,手机客户也都要重新设计(重新设计什么?因为你要通讯,就需要通讯的电压,时序,甚至接口命令,这些都随着不同厂商,不同制程技术而不同,你作为手机制造商或者soc厂商,想要把每种新的 nandflash 集成到你的产品中,就要根据这些新的特性来花时间设计。soc这边会有一个nandflash controller,你要根据采用的nandflash特性来配置nand flash controller,以达到成功通讯的目的)。

但半导体产品每1年制程技术都会推陈出新,存储器问题也拖累手机新机种推出的速度,因此像eMMC这种把所有存储器和管理nandflash的控制芯片都包在1颗MCP上的概念,逐渐风行起来。即:

NAND Flash 是一种存储介质,要在上面读写数据,外部要加主控和电路设计;
eMMC是NAND Flash+主控IC ,对外的接口协议与SD、TF卡类似;
emmc 内部根本的存储介质还是 nandflash,而不是一种全新的 storage。但是他定义并规范了统一接口比如:emmc 4.3, 4.4, 4.5(类似于usb 2.0, 3.0 这样的), 把和 nand flash 的通讯封装在emmc内部,而提供给外部的接口就是 emmc 接口。同理, 外部,比如soc就需要有个 sdmmc controller, 并且宣布支持 emmc 4.3/4.4…,那么,你需要做的就是,根据选用的emmc的版本号,来给 sdmmc controller 来选择一个通讯的接口版本号4.4。

二、如何驱动一款NAND Flash?
参考:
《韦东山嵌入式Linux视频第一期-nandflash》

(一) 基础硬件知识
nandflash 是一个存储芯片,那么它应该能提供“读地址A的数据,把数据B写到地址A"的功能。

以Mini2440为例简单说明一下:
在这里插入图片描述

问1:原理图上 NAND FLASH 和 S3C2440 之间只有数据线,如何传输地址呢?

答1.在DATA0~DATA7上既传输数据,又传输地址,当ALE为高电平时传输的是地址。

问2:从NAND FLASH芯片手册可知,要读写NAND FLASH需要先发出命令,如何传入命令?
在DATA0~DATA7上既传输数据,又传输地址,也传输命令;
答2:
当ALE为高电平时传输的是地址;
当CLE为高电平时传输的是命令;
当ALE和CLE都为低电平时传输的是数据;

在这里插入图片描述
问3:数据线LDATAn既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等,cpu如何准确的将某个地址发到正确的芯片上而不干扰其他芯片呢?
答3:这些芯片,要访问之必须"选中"(即片选信号为低),没有选中的芯片不会工作,相当于没接一样。

问4:假设烧写NAND FLASH,把命令、地址、数据发给它之后,NAND FLASH肯定不可能瞬间完成烧写的,怎么判断烧写完成?
答4:通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙。

问5:怎么操作NAND FLASH呢?
答5. 根据NAND FLASH的芯片手册,一般的过程是:
(1) 发出命令
(2) 发出地址
(3) 写数据/读数据
(4) 等待

(二) CPU nandflash 控制器章节导读
以三星 s5pv210 芯片为例,摘选一下我认为比较重要的点:
在这里插入图片描述

SLC nandflash一般是1bit ecc,对应的编解码的过程需阅读上述内容。

在这里插入图片描述
MLC nandflash 一般是8/12/16 bit ecc,对应的编解码的过程需阅读上述内容。

(三) nandflash 芯片手册导读
以镁光 nandflash 芯片为例,摘选一下我认为比较重要的点:
在这里插入图片描述

特性列表,一般位于芯片手册首页,可以帮助我们快速了解芯片特性,基本可以认为是最重要的信息。
在这里插入图片描述

不同芯片厂商的nandflash芯片引脚定义基本是一致的,但是可能会有1~2引脚是有差异,需要核对。
在这里插入图片描述

上图可用于确定nandflash的存储布局;

在这里插入图片描述
上图可用于核对芯片的型号和详细的硬件特性;

(四) nandflash 调试思路:
1.通读 CPU 芯片手册 nandflash 控制器章节:

  • 了解该 CPU nandflash 控制器支持哪些特性,一般包括nandflash的bit数,以确定是否支持当前选用的nandflash芯片;- 明确该芯片的 nandflash 控制器 ecc 校验功能的工作流程;

2.通读 nandflash 芯片手册:

  • 了解 nandflash 芯片的基本信息,例如ID、容量、类型(SLC/MLC) - 结合板子的原理图一起查看,以确定 CPU 和 nandflash 芯片的引脚连接是否正确。不同厂商(例如三星、镁光)生产的nandflash引脚不一定完全兼容,可能会有一两根引脚有差异;

3.在 U-boot 或者 Linux 下实现读取 nandflash 芯片的ID值的功能:nand_read_id()

  • U-boot 和 Linux哪个顺手用哪个,U-boot的优点是启动快,做测试方便点,而 Linux的优点是支持网络/文件系统,功能强大;- 能读到 ID 只能说明 CPU 和 nandflash 芯片硬件连接上有了些许保障 (例如发命令、读数据),但是某些隐蔽的错误硬件连接仍然会导致写数据异常;

4.在 U-boot 或者 Linux 下实现读取擦除 一块数据的功能:nand_erase_block()

  • 相比起读写数据,擦除 nandflash 数据块较为容易。而且只有成功擦除了,才能进一步验证读写nandflash的功能。nandflash 数据块被擦除后所有数据均为 0xFF,利用这个特性可以验证稍后需要实现的读一页的操作是否正常;

5.在 U-boot 或者 Linux 下实现裸读一页数据( 不考虑ecc校验 )的功能:nand_read_page_raw()

  • nandflash 的1页包括 main 区域和oob区域, main 区域用于保存用户数据,spare 区域用于保存 ecc校验码;- 一般说写一页数据时,需要结合上下文才能判断是写 main 区域还是写 main + spare 区域;- nandflash 一般需要ecc 校验功能来保证数据的安全,但是在前期调试阶段,我们可以不考虑ecc 校验直接实现裸读一页数据的功能。事实上,我们也无法考虑ecc 校验的功能,因为到现在为止还不能写数据到 nandflash的main区域,更别说写 ecc 校验码到oob区域;- 我们需要先实现读数据的功能,确保读数据功能的可靠后,待会才能用其来验证写数据的操作;

6.在 U-boot 或者 Linux 下实现裸写一页数据( 不考虑ecc校验 )的功能;nand_write_page_raw()- 裸写一页和裸读一页的操作可以相互协同验证;- uboot 的 cmp 命令可以对比两块内存的数据是否相同,该命令可以用于验证写操作是否成功;

7.在 U-boot 或者 Linux 下实现写一页数据到 main区域,并将 nandflash 控制器生成的 ecc 校验码填写到oob区域:nand_write_page()

  • 写一页数据到 main 区域时,nandflash 控制器会生成 ecc 校验码,这些校验码就是用来保护这一页数据的;

8.在 U-boot 或者 Linux 下实现读一页数据的功能,包括读 main 区域的数据和 spare 区域的 ecc 校验码:nand_read_page()

  • 从nandflash spare 区域读到的 ecc 校验码应该发送给 nandflash 控制器,nandflash 控制器会帮我们计算好是否有bit 错误,并且将结果和纠错需要用到的信息保存在寄存器中,软件通过寄存器里的信息推导出正确的数据;

9.由于bit 错误的问题不容易出现,所以在调试阶段需要人为制造出与 spare 区域 不匹配的 main 数据,以检验ecc 校验功能是否正常,即数据是否能被纠正,大体的思路是:

  • 通过 nand_write_page() 写一页正确的数据到 main 区域 和 spare 区域;- 篡改在内存中的数据,然后通过 nand_write_page_raw() 将篡改后的数据填写到 main 区域,spare 区域保持不变;- 通过nand_read_page 读 一页数据,如果能执行纠错相关的代码,并且能获取到被篡改之前的数据,则说明校验功能是可以工作的;

10.如果 main 区域的 ecc 校验码字节数比较多,并且 spare 区域足够大的话,可以对存放在 spare 区域里的 main ecc校验码进行二次 ecc,这时生成的 ecc 校验码我将其称为 spare ecc,它一般会存放在spare区域的末尾,并不是必须的;

(五) Linux Nand Flash驱动
参考:
《韦东山嵌入式Linux视频第二期-nandflash》

Linux MTD stack
在这里插入图片描述

对于nandflash 驱动,需要重点关注的地方:

Flash memory abstraction layer/MTD layer	drivers/mtd/mtd*.c
Flash type abstration layer/NAND core	drivers/mtd/nand/nand_*.c
Flash controller drivers	drivers/mtd/nand/*_nand.c

  
  
  
  
  • 1
  • 2
  • 3

NAND legacy stack( Linux-4.16 之前)
在这里插入图片描述

/dev/mtd0是nandflash设备的字符设备驱动节点,上图展示了 read("/dev/mtd0") 的底层实现(MTD layer->NAND core->Controller driver)。

NAND legacy stack 的弊端

  • 无法执行细粒度的NAND Flash 命令,粒度的大小被限制在NAND core层面了;
  • 芯片厂商更新的NAND Flash特性时需修改所有的Controller driver;

NAND new stack( Linux-4.16 之后)
在这里插入图片描述

将NAND 的控制逻辑下放到Controller driver层,NAND Core统一调用Controller driver提供的钩子函数:exec_op();

(六) 测试稳定性和性能
MTD tests support

  • mtd_nandecctest.ko:nand flash的ECC校验测试
  • mtd_pagetest.ko:nand flash的page读写测试
  • mtd_speedtest.ko:MTD分区的读写速度测试
  • mtd_subpagetest.ko:nand flash的sub-page接口测试
  • mtd_oobtest.ko:nand falsh的OOB区域读写测试
  • mtd_readtest.ko:读取整个MTD分区
  • mtd_stresstest.ko:随机读写,擦除操作测试
  • mtd_torturetest.ko:该功能可用于做稳定性或者寿命测试,随机操作直到发生错误
    示例如下:
insmod mtd_stresstest.ko dev=9 count=1000
[ 3289.273771] =================================================
[ 3289.279826] mtd_stresstest: MTD device: 9
[ 3289.284079] mtd_stresstest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 64
[ 3289.303250] mtd_stresstest: scanning for bad eraseblocks
[ 3289.420267] mtd_stresstest: scanned 2048 eraseblocks, 0 are bad
[ 3289.426534] mtd_stresstest: doing operations
[ 3289.431031] mtd_stresstest: 0 operations done  
[ 3339.606972] mtd_stresstest: finished, 1000 operations done  
[ 3339.612992] =================================================

  
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

一个反复读写并校验数据正确性的小脚本:

#!/bin/sh

rm -rf /media/local/
count=1
while [ ${count} -lt 600 ]; do
TSTAMP=“date | —> c o u n t " e c h o " {count}" echo " count"echo"TSTAMP”
mkdir -p /media
time cp /usr/local /media/ -raf
diff /usr/local /media/local -r || exit -1
rm -rf /media/local;
sync

let count=${count}+1

done

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、NAND Flash 文件系统的选择:YAFFS2
参考:
《基于nand flash的文件系统的整理》
《Cramfs、JFFS2、YAFFS2的全面对比》

针对 nandflash 特点优化其性能以及克服其缺点

1.nanflash 不是通常意义上的块设备,块设备的特点是可以对数据块进行读、写操作(如磁盘,文件系统等),但是对于nanflash 来说有三种操作分别是:读、写、擦除。只有对已擦除的块才能进行写操作。所以为了使其兼容传统的硬件和系统,需要对其进行特殊处理;

2.当一个闪存处在干净状态时(被擦除过,但是还没有写操作发生),这块flash上的每一位(bit)都是逻辑1;

3.闪存的使用寿命是有限的,具体来说,闪存的使用寿命是由擦除块的最大可擦除次数来决定的。超过了最大可擦除次数,这个擦除块就成为坏块(bad block)了。因此要避免某个擦除块被过度使用,以至于先于其他擦除块变成坏块,应该在尽量少影响性能的前提下,使擦写操作均匀分布在每个擦除块上,叫做损耗均衡(wear leveling)。

YAFFS意为「Yet Another Flash File System」,是目前唯一一个专门为NAND Flash设计的文件系统。它采用了类日志结构,结合NAND Flash的特点,提供了损耗平衡和掉电保护机制,可以有效地避免意外掉电对文件系统一致性和完整性的影响。

nanflash 和 YAFFS2之间是如何配合的?
通过分析mkyaffs2iamge.c可知:

  • yaffs2 映像文件是由一个个的main(4096) + spare(224)数据组成;
  • main里存放的是文件(包括目录、普通文件、特殊文件等)数据;
  • spare里前面的nand_oobinfo->oobfree(2+22=24)个字节归yaffs2自由使用,然后接下来的nand_oobinfo->eccbytes(104)个字节都填0xFF,即yaffs2 images本身是不含有ecc校验码的;(以上数值跟实际nandflash芯片相关)
    更多细节:
    how-yaffs-works[1]

参考资料
[1]
YAFF2官网: https://yaffs.net/documents/how-yaffs-works

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于NAND FLASH调试的一点总结 的相关文章

  • 我有两个类型定义,如何确定一个类型是否是另一个的基类型?

    我在 ActionScript 3 中有两个类型定义 Class 类型的引用 我需要确定其中一个是否是另一个的基类型 类或接口 我本来希望像下面这样的东西会起作用 但遗憾的是它没有 var isBaseClass Boolean Mouse
  • HTML5 画布/Flash。如何访问儿童影片剪辑并使其转到AndPlay?

    在 Flash 中 我的主时间轴中有 2 帧 第一个是选择语言 第二个包含导航栏 该导航栏是一个影片剪辑 其中包含项目 影片剪辑 这些 item movieclips 包含 2 个帧 每种语言一个 在 navigation bar movi
  • 在 ActionScript 中移动数组中的对象,产生体育场波浪效果

    我想移动数组中的所有对象 产生体育场波浪效果 我想根据舞台上的 y 值移动对象 我所有的方块大小都是 50x50 我想将它们向上移动然后向下移动 下面是我的代码 import fl transitions Tween import fl t
  • 游戏开发者的 Flash 性能:本机渲染 VS BitmapData 帧缓冲区

    我开发了一款 2D 射击游戏很多物体 and 激进的滚动 问题 哪种方式更好 选择 1 使用原生 Flash 渲染 从 Bitmap 派生游戏对象 使用现有的 x y 宽度 高度 bitmapData 将所有对象添加为子 UI Compon
  • 使用 Swift 以编程方式闪烁屏幕(在“屏幕截图”上)

    为了从这里转换 Objective C 示例 如何以编程方式闪烁屏幕 https stackoverflow com questions 5254508 how to flash screen programmatically我写了以下代码
  • 将过滤器应用于 AS3 中的所有内容

    我正在尝试在 AS3 Flex SDK 中添加过滤器 我可以为任何一个对象添加一个过滤器 但我想将过滤器应用到一切那是某个对象的子对象 假设弹出一个暂停窗口 暂停窗口下方的所有内容都会变得模糊 将过滤器应用于每个单独的对象 例如 迭代列表
  • 使用flash动作脚本开发网络游戏

    简而言之 如果我想使用 Flash 技术开发在线游戏 你能告诉我一些很好的学习资源吗 包括3D游戏 您可以从新发布的开始Flash平台游戏技术中心 http www adobe com devnet games 在 Adob e Devne
  • Actionscript 内存管理、垃圾收集

    这个博客 http blogagic com 163 flex memory management and memory leaks varref 和其他人 指出 在清理对象时 您应该在 dispose 方法中将对象引用设置为 null 但
  • 禁用缓存 YouTube 视频

    当 YouTube 使 YouTube 视频与缓存一起使用时 YouTube 取得了相当大的成就 然而 这导致我的 ajax 网站出现问题 我想知道是否有办法禁用 YouTube 视频的缓存 特别是在 Internet Explorer 中
  • 为什么 ActionScript 中没有记录 drawRoundRectComplex() ?

    在研究actionscript 3的图形类时 我遇到了未记录的drawRoundRectComplex 方法 它是一个变种drawRoundRect 但有 8 个参数 最后四个是每个角的直径 x y 宽度 高度 左上 右上 左下 右下 ex
  • ReferenceError:错误#1065:变量 JSON 未定义

    我快要爆炸了 想弄清楚如何解决这个问题 所以在我这样做之前 也许你可以帮助我 我正在 flash builder 4 5 1 21328 中的 flash Player 11 下开发一个游戏 我想尝试一下新功能 例如本机 JSON 支持 但
  • 如何在多个 HTML 页面上播放背景音频?

    是否有解决方案可以让背景音频 音乐在网站上的多个页面上播放 而无需在每个页面加载时重新启动 该网站当前使用框架集 但我正在寻找替代方案 如果不让整个网站都 AJAX 我认为框架是唯一的方法 如果您需要的话 这里有一个关于制作 ajax 站点
  • AS3 中的 Flash 翻页卷曲效果

    我正在开发一个项目 需要使用 Flash 开发翻页 卷曲 效果 如下例所示 http www actionscript org showMovie php id 459http www actionscript org showMovie
  • 如何保护swf文件不被反编译?

    我正在使用 Flex 框架从事重要项目 我想对我的算法和代码保密 是否有可能以某种方式保护 swf 文件不被反编译 我不希望有人使用 flash 反编译器提取我的代码 Thanks 这很简单 只需将其保存在您的 PC 上 不要将其放在网络上
  • 如何向 Flash Player 10.1 发出启动 flv 或 swf 的意图?

    我有一堆FLV视频文件存储在媒体服务器 我正在尝试让它们在 Flash 播放器中启动 一直在四处寻找但没有找到太多帮助 我已将 flv 文件下载到临时存储中 并尝试使用intent 这就是我的代码的样子 来自我在网上看到的 try URL
  • 安全沙箱违规

    运行我的 Flash 应用程序时出现以下错误 违反安全沙箱 与 rtmp system ip live 的连接已停止 不允许从 file F Flash 工作 RTS RT vlab BIOTECH NEO 简单神经元的被动属性 vi 特征
  • 将数据/变量从 Visual Basic 表单传递到 Flash 对象

    我很确定这个问题可以在 stackOverflow 上的某个地方得到解答 但我对此没有选择 我有一个 VisualBasic 窗体 上面有一个按钮对象 我希望该按钮有一个 onClick 过程 以便单击它可以将变量或其他命令传递到另一个正在
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • 我应该等待 Flash Player 10.1 还是使用 Flash Lite 3 来为手机和设备开发 Flash 内容

    Adobe 将在 2010 年第一季度推出 Flash Player 10 1 这将在桌面和移动设备上提供一致的运行时 因此我假设如果它是为 Web 构建的 那么它也可以在移动设备上运行 我即将开始为手机开发基于 Flash 的应用程序 我
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch

随机推荐

  • python 爬虫遇到验证码如何解决

    1 安装对应的库 安装tesseract https digi bib uni mannheim de tesseract 其中文件名中带有dev的为开发版本 xff0c 不带dev的为稳定版本 xff0c 可以选择下载不带dev的版本 x
  • Vector CANdb++的下载安装

    1 下载安装包 xff1a https download csdn net download m0 68158707 87657730 spm 61 1001 2014 3001 5501 2 解压缩后可得到如图两个文件 xff1a 将dl
  • 数据结构之顺序栈的操作(C语言附详细代码与解释)

    目录 一 xff0c seq stack h头文件代码 xff1a 二 xff0c seq stack c文件内 1 创建空栈 2 入栈 3 出栈 4 栈的清空和销毁 三 xff0c 详细代码 数据结构中的栈 xff0c 有顺序栈与链式栈两
  • 数据结构之链式队列的实现操作(C语言附详细代码与关键代码详解)

    目录 一 xff0c 关于链式队列程序编写的简要说明 二 xff0c linkqueue h头文件 三 xff0c 关键函数代码与详解 1 创建空的链式队列 2 入队 3 出队 4 销毁链式队列 四 xff0c linkqueue c文件详
  • 数据结构之二叉树(C语言附详细代码)

    目录 一 xff0c 树和二叉树 1 树 定义 关于树的一些概念 2 二叉树 定义 特殊的二叉树 二叉树的性质 二叉树的存储结构 顺序结构 只适用于完全二叉树 二叉树的遍历 二 xff0c 二叉树操作代码 1 头文件 2 函数代码 创建二叉
  • 共享内存(进程间的通信方式)

    目录 1 共享内存的特点 2 函数接口 3 有关共享内存的系统命令 1 共享内存的特点 xff08 1 xff09 共享内存是一种最高效的进程间的通信方式 xff0c 进程可以直接读写内存 xff0c 而进程之间不需要通过任何数据的拷贝 x
  • Linux-C语言编写-TCP服务端接收消息流程(含代码)简介(1)

    目录 服务端 第一步socket 第二步struct sockaddr in 第三步 可以与第二步合为一个步骤 bind 第四步listen 第五步accept 第六步recv 第七步close 详细代码 服务端 第一步socket 1 操
  • Linux-C语言编写-TCP客户端发送消息流程(含代码)简介(2)

    目录 第一步socket 第二步struct sockaddr in 第三步connect 第四步send 第五步close 详细代码 第一步socket 1 操作 xff1a 创建流式套接字 xff1b 2 所用函数 xff1a sock
  • 基于Linux下的Nand (Nor) Flash读写速度测试

    https blog csdn net qq 39721016 article details 117993088 基于Linux下的Nand xff08 Nor xff09 Flash读写速度测试 1 打开内核测试模块2 编译内核 xff
  • 关于结构体赋值的一个小知识点

    一 xff0c 如果结构体中定义了一个字符数组的成员变量 xff0c struct test int num char ch 32 TEST 当我们需要给字符数组赋值时 xff0c 我们可能会选择下列某种方式进行初始化 xff1a 1 可以
  • lighttpd服务器搭建教程

    目录 一 xff0c 下载安装 二 xff0c 配置服务器 1 创建目录以及移动文件位置 2 修改配置文件 三 xff0c 运行测试 四 xff0c 常见错误 环境 xff1a linux虚拟机 xff1b 一 xff0c 下载安装 1 下
  • 牛客中C++/C语言的一道练习题详解

    解题思路及涉及知识点 xff1a 先简单判断一下 xff0c 程序最终是要打印k的值 xff1b k的值由两次循环中的fun函数的返回值决定 xff1b fun函数中 xff0c 变量c是静态的 xff1b fun函数中第三行代码a 61
  • QT基本组件与常用类

    目录 一 设计师 Designer xff08 掌握 xff09 二 布局 Layout 2 1 布局的基本使用 xff08 掌握 xff09 2 2 布局属性 xff08 掌握 xff09 2 3 伸展器 xff08 掌握 xff09 2
  • QT多窗口编程与文件IO编程

    目录 一 消息对话框 QMessageBox xff08 掌握 xff09 二 常用窗口类 xff08 掌握 xff09 三 主窗口类 QMainWindow xff08 重点 xff09 四 parent参数 xff08 掌握 xff09
  • QT数据库-网络编程-打包

    目录 一 讲解之前 二 数据库基本操作 三 模糊查询 二 编程之前 三 通信结构 一 设置应用图标 xff08 熟悉 xff09 二 Debug和Release模式 xff08 掌握 xff09 三 动态链接库 xff08 掌握 xff09
  • Visual Studio 2022 的安装和创建C++项目

    下面我们来讲一下如何下载安装VS 2022并且创建C 43 43 项目 1 下载 首先 xff0c 我们来到VS的微软官网下载地址 xff1a https visualstudio microsoft com zh hans vs 然后点击
  • 一起自学SLAM算法:写在前面

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:第1章-ROS入门必备知识

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.3 ROS系统架构

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 关于NAND FLASH调试的一点总结

    https www freesion com article 5033494883 很久没接触过 nandflash 驱动 xff0c 最近工作又摸了 xff0c 于是顺便整理总结一下 nandflash 在我看来算是比较落后的存储设备 x