Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2)

By: Ailson Jack
Date: 2023.11.12
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/163.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

微信公众号:嵌入式那些事

面向块的读命令(class 2)

CMD16

CMD16的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31:0] block lengthR1SET_BLOCKLENSets the block length (in bytes) for all
following block commands (read and
write). Default block length is specified in
the CSD.

CMD16的参数[31:0]位域填写块长度,命令的类型为ac,CMD16的命令缩写为SET_BLOCKLEN,命令响应为R1,命令功能为设置接下来所有块操作命令(读和写)的块长度(以字节为单位),默认的块长度在CSD寄存器中被指定。

CMD17

CMD17的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] data addressR1READ_SINGLE_BLOCKReads a block of the size selected by the
SET_BLOCKLEN command.

CMD17的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD17的命令缩写为READ_SINGLE_BLOCK,命令响应为R1,命令功能为从eMMC设备指定地址读取一块数据,数据块的长度由SET_BLOCKLEN命令(CMD16)设置或者使用默认的块长度。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B)
address.

The transferred data must not cross a physical block boundary, unless READ_BLK_MISALIGN is set in the CSD
register.

CMD18

CMD18的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] data addressR1READ_MULTIPLE_BLOCKContinuously transfers data blocks from
Device to host until interrupted by a stop
command, or the requested number of data
blocks is transmitted If sent as part of a
packed read command, the argument shall
contain the first read data address in the
pack (address of first individual read
command inside the pack).

CMD18的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD18的命令缩写为READ_MULTIPLE_BLOCK,命令响应为R1,命令功能为从eMMC设备指定地址开始连续传输数据块到Host,直到被STOP_TRANSMISSION命令(CMD12)中断,或者已经读完请求的数据块数量。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B)
address.

CMD21

CMD21的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] stuff bitsR1SEND_TUNING_BLOCK128 clocks of tuning pattern (64 byte in 4
bit mode or 128 byte in 8 bit mode) is sent
for HS200 optimal sampling point
detection.

CMD21的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD21的命令缩写为SEND_TUNING_BLOCK,命令响应为R1,命令功能为eMMC设备发送128个时钟的tuning模式数据(4位模式下64字节,8位模式下128字节)用于HS200模式下Host优化采样点。

面向块的写命令(class 4)

CMD23(default)

CMD23(default)的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31] Reliable Write Request
[30] ‘0’ non- packed
[29] tag request
[28:25] context ID
[24]: forced programming
[23:16] set to 0
[15:0] number of blocks
R1SET_BLOCK_COUNTnon-packed command version
Defines the number of blocks (read/write) and the
reliable writer parameter (write) for a block read or
write command.

CMD23(default)的参数[31]位填写Reliable Write Request,[30]填写0,[29]位填写tag request,[28:25]位域填写context ID,[24]位填写forced programming,[23:16]位域填写0,[15:0]位域填写数据块数量,命令的类型为ac,CMD23(default)的命令缩写为SET_BLOCK_COUNT,命令响应为R1,命令功能为定义数据块的数量(用于读写)。

CMD23(packed)

CMD23(packed)的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31] set to 0
[30] ‘1’ packed
[29:16] set to 0
[15:0] number of
blocks
R1SET_BLOCK_COUNTpacked command version
Defines the number of blocks (read/write) for the
following packed write command or for the header of
the following packed read command.

CMD23(packed)的参数[31]位填写0,[30]填写1,[29:16]位域填写0,[15:0]位域填写数据块数量,命令的类型为ac,CMD23(packed)的命令缩写为SET_BLOCK_COUNT,命令响应为R1,命令功能为定义数据块的数量(用于读写)。

CMD24

CMD24的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] data addressR1WRITE_BLOCKWrites a block of the size selected by the
SET_BLOCKLEN command.

CMD24的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD24的命令缩写为WRITE_BLOCK,命令响应为R1,命令功能为写一块数据到eMMC设备指定地址,数据块的长度由SET_BLOCKLEN命令(CMD16)设置或者使用默认的块长度。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B) address.

The transferred data must not cross a physical block boundary unless WRITE_BLK_MISALIGN is set in the CSD.

CMD25

CMD25的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] data addressR1WRITE_MULTIPLE_BLOCKContinuously writes blocks of data until a
STOP_TRANSMISSION follows or the requested
number of block received.
If sent as a packed command (either packed write, or
the header of packed read) the argument shall contain
the first read/write data address in the pack (address of
first individual command inside the pack).

CMD25的参数[31:0]位域填写数据地址,命令的类型为adtc,CMD25的命令缩写为WRITE_MULTIPLE_BLOCK,命令响应为R1,命令功能为连续写入数据块到eMMC设备指定地址,直到被STOP_TRANSMISSION命令(CMD12)中断,或者已经写完了请求的数据块数量。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512 B) address.

CMD26

CMD26的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] stuff bitsR1PROGRAM_CIDProgramming of the Device identification register. This
command shall be issued only once. The Device
contains hardware to prevent this operation after the
first programming. Normally this command is reserved
for the manufacturer.

CMD26的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD26的命令缩写为PROGRAM_CID,命令响应为R1,命令功能为写eMMC设备的CID寄存器。

CMD26命令只能烧写一次CID寄存器,正常情况下是制造商使用这个命令。

CMD27

CMD27的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] stuff bitsR1PROGRAM_CSDProgramming of the programmable bits of the CSD.

CMD27的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD27的命令缩写为PROGRAM_CSD,命令响应为R1,命令功能为修改eMMC设备CSD寄存器的可编程位。

CMD49

CMD49的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] stuff bitsR1SET_TIMESets the real time clock according to the RTC
information in the 512 B data block.

CMD49的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD49的命令缩写为SET_TIME,命令响应为R1,命令功能为根据RTC信息数据块,设置eMMC设备的real time clock。

擦除命令(class 5)

CMD35

CMD35的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31:0] data addressR1ERASE_GROUP_STARTSets the address of the first erase group
within a range to be selected for erase

CMD35的参数[31:0]位域填写数据地址,命令的类型为ac,CMD35的命令缩写为ERASE_GROUP_START,命令响应为R1,命令功能为设置擦除操作的first erase group地址。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512B)
address.

The Device will ignore all LSB’s below the Erase Group size, effectively rounding the address down to the Erase
Group boundary.

CMD36

CMD36的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31:0] data addressR1ERASE_GROUP_ENDSets the address of the last erase group
within a continuous range to be selected
for erase

CMD36的参数[31:0]位域填写数据地址,命令的类型为ac,CMD36的命令缩写为ERASE_GROUP_END,命令响应为R1,命令功能为设置擦除操作的last erase group地址。

Data address for media =<2 GB is a 32 bit byte address and data address for media > 2 GB is a 32 bit sector (512B)
address.

The Device will ignore all LSB’s below the Erase Group size, effectively rounding the address down to the Erase
Group boundary.

CMD38

CMD38的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31] Secure
request
[30:16] set to 0
[15] Force
Garbage Collect
request
[14:2] set to 0
[1] Discard Enable
[0] Identify Write
Blocks for Erase
(or TRIM Enable)
R1bERASEErases all previously selected write
blocks according to argument bits.

When all argument bits are zero CMD38
will perform an erase on erase group(s).

When Bit 0 = 1 and Bit 1=0 then CMD38
will perform a TRIM on the sector(s).

When Bit 0 =1 and Bit 1=1 then CMD38
will perform a DISCARD on the
sector(s).

To maintain backward compatibility the
device must not report an error if bits 31
and 15 are set. The device behavior
when these are set is undefined.

All other argument settings should trigger
an ERROR.

CMD38的参数[31]位填写Secure request,[30:16]位域填写0,[15]位填写Force Garbage Collect request,[14:2]位域填写0,[1]位填写Discard Enable,[0]位填写Identify Write Blocks for Erase,命令的类型为ac,CMD38的命令缩写为ERASE,命令响应为R1b,命令功能为根据参数位的配置擦除之前选择的数据块。

Argument bit 15 is an optional feature that is only supported if SEC_GB_CL_EN (EXT_CSD[231] bit 4) is set.
Argument bit 31 is an optional feature that is only supported if SEC_ER_EN (EXT_CSD[231] bit 0) is set.

擦除命令的参数如下表所示:

在这里插入图片描述
eMMC 5.1总线协议标准主要提供了4种擦除数据的方法,以满足不同场景的擦除需求:

擦除方式擦除单位描述
EraseErase Group以Erase Group为擦除单位擦除数据,擦除完成后重新读取擦除地址
的数据会返回全0或者1的数据,但在物理存储介质上,可能还保留着原始数据。
TRIMWrite Block以Write Block为擦除单位擦除数据,擦除完成后重新读取擦除地址
的数据会返回全0或者1的数据,但在物理存储介质上,可能还保留着原始数据。
DiscardWrite Block以Write Block为擦除单位擦除数据,擦除完成后重新读取擦除地址
的数据可能会返回擦除前的数据。
Sanitize将标记擦除的数据块的数据在物理介质上清除。

这里主要讲讲Erase操作,其他的擦除操作,根据需要可以阅读下eMMC 5.1 spec。

Erase操作的数据擦除单位为Erase Group。一个Erase Group由一个或者多个Write Block组成。eMMC设备的最基本的数据写单元为Write Block。Erase操作可以进行一个或者多个Erase Group的数据擦除。

当EXT_CSD寄存器的[175]字节的ERASE_GROUP_DEF为0时,Erase Group的大小通过CSD寄存器的[46:42]位域的ERASE_GRP_SIZE和[41:37]位域的ERASE_GRP_MULT共同确定,计算公式如下:

Erase Group Size = (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULT + 1)

当EXT_CSD寄存器的[175]字节的ERASE_GROUP_DEF为1时,Erase Group的大小通过EXT_CSD寄存器的[224]字节的HC_ERASE_GRP_SIZE来设置,计算公式如下:

Erase Group Size = HC_ERASE_GRP_SIZE * 512KB

eMMC设备在执行Erase操作时,通常并不会进行实际物理数据的擦除,只是将待擦除的Erase Group中的Block从地址空间中unmap,然后从后台的空闲Block中选择已经完成物理擦除的Block,重新map到该地址空间中,然后告知Host端已完成Erase操作。实际物理擦除操作则在后台选择合适的时机进行。

这样的逻辑可以减少Host执行Erase操作的等待时间,提高eMMC设备的响应速度。

Host可以擦除eMMC设备连续范围内的Erase Group。擦除步骤主要分为以下3步:

  • Host使用ERASE_GROUP_START(CMD35)命令定义Erase Group范围的起始地址;
  • Host使用ERASE_GROUP_END(CMD36)命令定义Erase Group范围的最后地址;
  • Host发送命令参数为0的ERASE(CMD38)命令给eMMC设备,用于开始擦除过程;

设备锁定命令(class 7)

CMD42

CMD42的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:0] stuff bits.R1LOCK_UNLOCKUsed to set/reset the password or
lock/unlock the Device. The size of the data
block is set by the SET_BLOCK_LEN
command.

CMD42的参数[31:0]位域可以是任意值(默认填写0),命令的类型为adtc,CMD42的命令缩写为LOCK_UNLOCK,命令响应为R1,命令功能为设置/复位password或者锁定/解锁eMMC设备。

CMD42只能在SDR模式(single data rate)下使用。在DDR模式(dual data rate),CMD42不会被执行并且会被视为非法命令。

CMD42的命令数据块结构如下图所示:

在这里插入图片描述

  • SET_PWD:该位为1,表示设置一个新的password;
  • CLR_PWD:该位为1,表示清除PWD;
  • LOCK_UNLOCK:该位为1,表示锁定eMMC设备;该位为0,表示解锁eMMC设备;
  • ERASE:该位为1,表示强制擦除操作(所有其他位应该为0),并且只发送命令字节;
  • PWD_LEN:定义接下来的password的长度(以字节为单位)。有效的password的长度范围为:1-16字节;
  • PWD:password数据;

特定应用命令(class 8)

CMD55

CMD55的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
ac[31:16] RCA
[15:0] stuff bits
R1APP_CMDIndicates to the Device that the next
command is an application specific
command rather than a standard command

CMD55的参数[31:16]位域填写RCA,[15:0]位域可以是任意值(默认填写0),命令的类型为ac,CMD55的命令缩写为APP_CMD,命令响应为R1,命令功能为告诉eMMC设备下个命令是特定应用命令,不是标准命令。

CMD56

CMD56的命令类型,参数,响应类型,命令缩写和描述如下表所示:

TypeArgumentRespAbbreviationCommand Description
adtc[31:1] stuff bits.
[0]: RD/WR1
R1GEN_CMDUsed either to transfer a data block to the
Device or to get a data block from the
Device for general purpose / application
specific commands. The size of the data
block shall be set by the
SET_BLOCK_LEN command.

CMD56的参数[31:1]位域可以是任意值(默认填写0),[0]位填写数据传输方向,命令的类型为adtc,CMD56的命令缩写为GEN_CMD,命令响应为R1,命令功能为在通用命令或者特定应用命令中,用于传输一个数据块到eMMC设备或者从eMMC设备获取一个数据块。

欢迎关注博主的公众号(微信搜索公众号:嵌入式那些事),可以扫描下面的公众号二维码:

在这里插入图片描述
如果文中有什么问题欢迎指正,毕竟博主的水平有限。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/163.html

注:转载请注明出处,谢谢!^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序中如何设置门店信息

小程序是商家转型升级的利器&#xff0c;小程序中门店信息的准确性和完整性对于用户的体验和信任度都有很大的影响。下面具体介绍门店信息怎么在小程序中进行设置。 在小程序管理员后台->门店设置处&#xff0c;可以门店设置相关。主要分为2个模块&#xff0c;一个是门店级…

AD教程 (十三)常见CHIP封装的创建

AD教程 &#xff08;十三&#xff09;常见CHIP&#xff08;贴片&#xff09;封装的创建 PCB封装是电子设计图纸和实物之间的映射体&#xff0c;具有精准数据的要求&#xff0c;在实际设计中需要通过规格书获取创建封装的数据参数。 PCB封装和实物的大小一致。PCB封装是承载实物…

Linux进程的认识与了解[上]

文章目录 1.何为进程?1.1对进程的认识1.2基本概念 2.OS如何管理大量进程?2.1图解2.2进程的形成 3.何为PCB?3.1对PCB的认识3.2task_ struct内容分类3.2对进程表的认识 4.查看进程4.1基础指令4.2获取某进程的PID(process id)4.3杀死进程4.4获取当前进程的父进程的ppid(parent …

Vant 移动端UI

Vue项目中安装Vant # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant 组件按需引入配置 Vant按需引入- - -安装&#xff1a;unplugin-vue-components 插件 unplugin-vue-components 插件可以在Vue文件中自动引入组件&#xff08;包括项目自身的组件和各种组件库中的组件&…

RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构

🚀返回专栏总目录 文章目录 一、VFS二、分区结构三、挂载 mount四、目录结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 一、VFS Linux 所有的文件都建立在虚拟文件系统(Virtual File System ,VFS…

事件循环Eventloop

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有…

【Devchat 插件】创建一个GUI应用程序,使用Python进行加密和解密

VSCode 插件 DevChat——国内开源的 AI 编程&#xff01; 写在最前面DevChat是什么&#xff1f;什么是以提示为中心的软件开发 &#xff08;PCSD&#xff09;&#xff1f;为什么选择DevChat&#xff1f;功能概述情境构建添加到上下文生成提交消息提示扩展 KOL粉丝专属福利介绍D…

【原创课设】java+swing+mysql选课管理系统设计与实现

摘要&#xff1a; 随着学校规模的扩大和课程设置的多样化&#xff0c;传统的手工选课管理方式已经无法满足现代教育的需求。因此&#xff0c;开发一款高效、便捷的选课管理系统变得尤为重要。该系统可以提高选课工作的效率&#xff0c;减少人为错误&#xff0c;同时也能为学生…

linux循环继续fordodone数值处理和脚本的追踪调试

格式 for &#xff08;&#xff08;初始值&#xff1a;限制值&#xff1b;步长&#xff09;&#xff09; do 程序段 done 注意点&#xff1a;$(()) 数值运算 $()命令 ${}取值 sh [-nvx] *.sh -n 不执行脚本&#xff0c;检查语法错误-常用 -v 执行之前&#xff0c;将…

Windows server 2008 R2 IIS搭建ASP网站教程

一、安装应用程序服务器 提示安装成功 二、添加角色服务asp 三、asp网站配置 放入源码 设置网站首页为index.asp: 设置应用程序池 四、设置网站目录属性 五、access数据库连接配置 Cd c:\Windows\System32\inetsrv appcmd list apppool /xml | appcmd set apppool /…

华为防火墙基本原理工作方法总结(包含源进源出)

两台防火墙在规划接口时一般2台防火墙的业务口相同&#xff0c;心跳口相同&#xff0c;这个上是基础&#xff0c;例如&#xff1a;第一台防火墙业务口用了g1/0/1口&#xff0c;那第二台防火墙业务口也得是这个g1/0/1口。 防火墙只会对tcp首包syn建立会话表&#xff0c;其它丢掉…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽&#xff0c;大家好&#xff0c;我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题&#xff0c;在网上找了一大堆的解决方案&#xff0c;最后还是无功而返&#xff0c;那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

js案例:打地鼠游戏(打灰太狼)

效果预览图 游戏规则 当灰太狼出现的时候鼠标左键点击灰太狼加10分&#xff0c;小灰灰出现的时候鼠标左键点小灰灰击减10分&#xff0c;不点击不减分不加分。 整体思路 1.把获取背景图片中每个地洞的位置&#xff0c;把所有位置放到一个数组中。 2.封装随机数函数&#xff0c;随…

Tomcat学习

一、入门 在webapp里面必须先创建一个文件夹&#xff0c;文件夹里面放的内容&#xff0c;才会被访问到。 创建一个javaweb项目后

【狂神说Java】Nginx详解

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

推荐系统笔记--基于物品的协同过滤(Item CF)

1--基本原理 Item CF的原理是根据物品的相似度来将新的物品推荐给用户&#xff1b;下图中用户对红色物品的感兴趣度为 [2, 1, 4, 3]&#xff0c;红色物品与橙色物品的相似度为 [0.1, 0.4, 0.2, 0.6]&#xff0c;因此可以计算出用户对橙色物品的感兴趣度。 Item CF的基本思想是&…

探寻知识的新路径——电大搜题助您开启学习新纪元

江西开放大学和广播电视大学一直以来都是许多自学者和职场人士追寻知识的圣地。然而&#xff0c;对于许多学子来说&#xff0c;学习的过程也常常充满了困惑和挑战。为了帮助这些学习者通过更高效、便捷的方式获取知识&#xff0c;江西开放大学推出了一款创新的学习工具——电大…

3DMAX如何渲染室内效果图?

这可能不是最好的教程,但对于3dmax初学者来说,它具有一定的学习价值和启示意义。 任何在建筑或室内设计领域工作并需要室内或外部空间“艺术家渲染”的人都会熟悉行业巨头Autodesk发布的3ds Max。 3ds Max是此类工作的默认标准,不是因为它在其他3D程序中无法完成,而是因为它…

联邦学习的梯度重构

联邦学习中的梯度出现挑战&#xff1a; 暴露原始训练数据的某些属性 利用生成对抗网络生成与私有训练图像类似的图片 尽管许多研究已经证实从梯度中重构原始数据的可能性&#xff0c;这些研究通常基于一个前提假设&#xff0c;即用户上传的梯度是全梯度。 联邦学习系统更倾…

力扣哈希表--总结篇

前言 五天写了八道题&#xff0c;有点懈怠&#xff0c;但还是有收获。 内容 一般哈希表都是用来快速判断一个元素是否出现在集合里。 为了实现高效的查找和访问&#xff0c;map通常会使用哈希表或红黑树等数据结构来存储键值对。什么时候用map&#xff0c;什么时候用数组&a…