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

NAND FLASH

NAND Flash

以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用。

1. 概述

MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输、地址、指令。5个命令脚(CLE、ALE、CE#、WE#)实现NAND命令总线接口规程。3个附加的脚用作: 控制硬件写保护(WP#)、监视芯片状态(R/B#),和发起上电自己主动读特征(PRE-仅3V芯片支持)。注意, PRE功能不支持宽温芯片。

MT29F2G08内部有2048个可擦除的块,每一个块分为64个可编程的页,每一个页包括2112字节(2048个字节作为数据存储区,64个备用字节一般作为错误管理使用)。

每一个2112个字节的页能够在300us内编程,每一个块(64x2112=132K)能够在2ms内被擦除。片上控制逻辑自己主动进行PROGRAM和ERASE操作。

NAND的内部存储阵列是以页为基本单位进行存取的。读的时候,一页数据从内部存储阵列copy到数据寄存器,之后从数据寄存器按字节依次输出。写(编程)的时候,也是以页为基本单位的:起始地址装载到内部地址寄存器之后,数据被依次写入到内部数据寄存器,在页数据写入之后,阵列编程过程启动。

为了添加编程的速度,芯片有一个CACHE寄存器。在CACHE编程模式,数据先写入到CACHE寄存器,然后再写入到数据寄存器,一旦数据copy进数据寄存器后,编程就開始。在数据寄存器被装载及编程開始之后,CACHE寄存器变为空,能够继续装载下一个数据,这样内部的编程和数据的装载并行进行,提高了编程速度。

内部数据搬移命令(INTERNAL DATA MOVE)也使用内部CAHCE寄存器,通常搬移数据须要非常长时间,通过使用内部CACHE寄存器和数据寄存器,数据的搬移速度大大添加,且不须要使用外部内存。

2. 功能框图

3. 管脚

名称

类型

描写叙述

ALE

I

地址锁存使能。ALE为高时,在WE#下降沿,地址信息通过I/O[7:0]锁存片内的地址寄存器。假设传输的不是地址信息,ALE应该为低。

CE#

I

片选。一旦器件进入PROGRAM或ERASE操作,CE#能够变无效。

CLE

I

命令锁存使能。CLE为高时,在WE#上升沿,命令通过I/O[7:0]锁存到命令寄存器,当不传输命令时,CLE应该为低。

PRE

I

上电读使能。

RE#

I

读使能。

WE#

I

写使能。

WP#

I

写保护。当为低时候,全部的PROGRAM和ERASE都被禁止。

I/O[7:0]

I/O

数据输入/输出。传输命令、数据、地址。仅在读操作时,数据是输出。

R/B#, R/B2

O

准备好/忙。集电极开路输出。外部须要接上拉电阻,这个脚表示芯片正在进行PROGRAM或ERASE操作。在读操作期间,表示数据正从阵列中传输到串行数据寄存器中,一旦这些操作完毕,R/B#回到High-Z状态。

Vcc

电源

电源

Vss

4. 寻址

Block地址和页地址 = 实际的页地址,希望通过这个图,我们能理解块、页、块地址,页地址,列地址,备份空间,备份地址

Cycle

I/O7

I/O6

I/O5

I/O4

I/O3

I/O2

I/O1

I/O0

1

CA7

CA6

CA5

CA4

CA3

CA2

CA1

CA0

2

LOW

LOW

LOW

LOW

CA11

CA10

CA9

CA8

3

RA19

RA18

RA17

RA16

RA15

RA14

RA13

RA12

4

RA27

RA26

RA25

RA24

RA23

RA22

RA21

RA20

5

LOW

LOW

LOW

LOW

LOW

LOW

LOW

RA28

CAx:列地址;RAx=行地址

5. 总线操作

CLE

ALE

CE#

WE#

RE#

WP#

PRE#

MODE

H

L

L

上升沿

H

X

X

读模式

命令输入

L

H

L

上升沿

H

X

X

地址输入

H

L

L

上升沿

H

H

X

写模式

命令输入

L

H

L

上升沿

H

H

X

地址输入

L

L

L

上升沿

H

H

X

数据输入

L

L

L

H

下降沿

X

X

依次读和数据输出

L

L

L

H

H

X

X

在读期间(忙)

X

X

X

X

X

H

X

在编程期间(忙)

X

X

X

X

X

H

X

在擦除期间(忙)

X

X

X

X

X

L

X

写保护

X

X

H

X

X

0V/Vcc

0V/Vcc

待机

上电自己主动读:在上电期间,PRE为VCC,3V VCC器件自己主动传输第一页到数据寄存器,而无须要公布一个命令或地址锁存序列。在VCC达到大约2.5V的时候,内部电压检測器触发上电自己主动读功能。在第一页数据copy到数据寄存器过程中,R/B#为低,当copy结束后,R/B#变高,在RE#脉冲的作用下第一页数据能够依次输出。

6. 命令表

操作

周期1

周期2

在忙期间有效

PAGE READ

0x00

0x30

NO

PAGE READ CACHE MODE START

0x31

-

NO

PAGE READ CACHE MODE START LAST

0x3F

-

NO

READ for INTERNAL DATA MOVE

0x00

0x35

NO

RANDOM DATA READ

0x05

0xE0

NO

READ ID

0x90

-

NO

READ STATUS

0x70

-

NO

PROGRAM PAGE

0x80

0x10

NO

PROGRAM PAGE CACHE

0x80

0x15

NO

PROGRAM for INTERNAL DATA MOVE

0x85

0x10

NO

RANDOM DATA INPUT for PROGRAM

0x85

-

NO

BLOCK ERASE

0x60

0xD0

NO

RESET

0xFF

-

YES

7. PAGE READ,0x00-0x30

5个地址周期,确定了读出的起始地址,数据才RE#脉冲的作用下,从这个起始地址開始依次输出,直到这一页的结束。

8. RANDOM DATA READ,0x05-0xE0

随机数据读,是为了用户可以设定新的列地址,添加数据读出的灵活性,随即读模式在页读(0x00-0x30序列)后使能。这个命令的公布次数是不受限制的。但不过当前页数据的读出。

9. PAGE READ CACHE MODE START,0x31;PAGE READ CACHE MODE START LAST,0x3F

公布PAGE READ命令后,在R/B#变高后,在发送0x31命令,这时启动将数据寄存器的内容传给CACHE寄存器,然后就能够顺序从CACHE里读第一个PAGE READ命令获得数据,因为这是数据寄存器是没实用的,因此,芯片自己主动启动读下一页的PAGE READ命令,将下一页读到数据寄存器,能够看出这么做提高的读出的速度,除了第一个PAGE READ命令外,其它PAGE READ命令都是后台自己主动进行的。再最后一次使用0x3F命令,以便禁止芯片再次自己主动公布PAGE READ命令。

10.            READ ID,0x90

读出厂家的芯片标识。

11.            READ STATUS,0x70

读出芯片的8bit状态。能够通过RE#脉冲,重复读。

12.            编程操作

PROGRAM PAGE 0x80-0x10:

Micron NAND FLASH仅支持页的编程,在一个块以内,页必须从一个块的页最低位到这个块的页的最高位连续编程,禁止随机页地址的编程。

芯片也支持页的部分编程操作,这意味着不论什么单个位在须要一个擦除之前仅能够被编程一次,然而,这样的页能被划分成在须要一个擦除之前同意最大8个编程操作。

SERIAL DATA INPUT 0x80:

PAGE PROGRAM操作要求载入SERAIL DATA INPUT(0x80)命令进入命令寄存器,随着5个地址周期之后,串行数据通过连续的WE#周期载入到值得的起始地址,PROGRAM(0x10)命令在数据输入完毕之后被写入,内部写状态周期自己主动运行合适的编程算法,并控制全部必要的定时编程和比較操作。写比較只检測“1”是否被成功地编程为“0”了。

R/B#在阵列编程期间(tPROG)为低,在编程操作期间,仅READ STATUS和RESET命令有效,状态寄存器的Bit6反映R/B#的状态,当芯片准备好时,读Bit0的状态确定编程操作是否成功或失败,命令寄存器在新的有效命令写入之前,一直停留在读状态寄存器模式。

RANDOM DATA INPUT 0x85:

在发起数据集输入之后,能够通过RANDOM DATA INPUT命令向新的列地址写入数据。在公布0x10命令之前,能够对同一页多次使用0x85命令。

PROGRAM PAGE CACHE MODE 0x80-0x15:

CACHE编程实际上是标准的页编程命令的带缓冲编程模式,编程開始是公布SERIAL DATA INPUT(0x80)命令,随后是5个地址周期,以及页的所有或部分数据,数据copy到CACHE寄存器,然后公布CACHE WRITE(0x15)命令。数据在WE#的上升沿锁存到数据寄存器,在这个锁存期间,R/B#为低,锁存结束之后,R/B#变高,编程開始。

当R/B#变高之后,新的数据能够通过公布还有一个CACHE PROGRAM命令来写入,R/B#保持低的时候由实际的编程时间来控制,第一次等于数据从CACHE寄存器写入到数据寄存器须要的时间,之后,仅仅有数据寄存器的内容被编程进阵列之后,CACHE寄存器才干锁存到数据寄存器,全部,以后的R/B#为低的实际应该更长一些。

状态寄存器中反映CACHE R/B#的Bit6能够通过READ STATUS命令读出,以便确定什么时候,CACHE寄存器准备好接受新的数据了。

状态寄存器中反映R/B#的Bit5能够被查询,以确定什么时候当前编程周期的实际阵列编程完毕。

假设仅使用R/B#来确定编程是否完毕,那么编程序列的最后一页必须使用PROGRAM PAGE(0x10)来替代CACHE PROGRAM(0x15)。假设CACHE PROGRAM命令每次都使用,状态寄存器的Bit5必须用来确定编程是否结束。

当状态寄存器的bit6为1时,状态寄存器Bit0返回前一页的编程是否成功,当前PROGRAM操作的成功与否的状态是:Bit5为“1”(准备好状态)时的Bit0状态

13.            内部数据搬移

内部数据搬移须要两个命令序列,先公布一个READ FOR INTERNAL DATA MOVE(0x00-0x35),然后公布一个INTERNAL DATA MOVE(0x85-0x10)命令,数据搬移只支持被读数据die范围。

READ FOR DATA MOVE 0x00-0x35:先将00写到命令寄存器,然后是内部源地址(5个周期),之后,将0x35写到命令寄存器,这将起动从内存传输一页到CACHE寄存器。虽然5个周期的地址被公布,可是列地址是被忽略的。如今芯片准备接受INTERNAL DATA  MOVE(0x85-0x00)命令。

INTERNAL DATA MOVE 0x85-0x10:在READ FOR INTERNAL DATA MOVE命令公布之后,以及R/B#变高,就能够公布INTERNAL DATA MOVE命令了,这个命令将CACEH寄存器内容传输到数据寄存器,然后编程到新的目标地址,再INTERNAL DATA MOVE命令以及地址序列之后,R/B#变低,同一时候内部控制逻辑自己主动将数据编程到新的页,READ STATUS命令和状态寄存器的bit6能取代R/B#,以确定编程什么时候完毕。状态寄存器Bit0指示操作是否成功。在INTERNAL DATA MOVE命令序列期间,RANDOM DATA INPUT(0x85)用来改动原始数据的一个或多个字:首先,使用0x00-0x35命令序列将数据copy到CACHE寄存器,然后,使用带要改动的数据地址的命令RANDOM DATA INTPUT(0x85),新的数据输入呈如今外部数据脚,这将copy新的数据进入CACHE寄存器。当0x10写入命令寄存器时候,原始数据+改动的数据被传输到数据寄存器。编程新的一页将開始,假设有必要RANDOM DATA INPUT命令能够在启动编程序列(0x10)之前公布多次。由于INTERNAL DATA MOVE操作并不使用外部内存,所以ECC不可能在编程之前用来检查错误,这将可能或导致数据错误。在这样的情况下,运行多次INTERNAL DATA MOVE操作,这些位错误可能会因没有校正而积累。因为这个原因,我们强烈推荐利用INTERNAL DATA MOVE的系统使用鲁棒ECC方案。这将能够对每一个SECTOR校正2个或多个错误。

14.            块擦除操作,0x60-0xD0

一次擦除一个块。三个周期的地址A[28:18]被要求,先公布ERASE SETUP(0x60)命令,然后是三个地址周期,之后是ERASE CONFIRM(0xD0)命令。通过READ STATUS RESGISTER命令读擦除操作的状态,当bit6=1时,操作完毕,Bit0指示通过/失败条件,0表示通过。

15.            复位操作,0xFF

复位操作使芯片进入一个已知的状态,中断正在处理的命令序列。RANDOM READ、PROGRAM、ERASE命令在芯片忙状态能够被中断,正在被编程的位置或正在擦除的块的内容变无效,数据有可能会部分地被擦除或编程。命令寄存器被清除,准备好进入下一个命令。

复位后状态寄存器内容:

条件

状态

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Hex

WP#高

准备好

1

1

1

0

0

0

0

0

0xE0

WP#低

准备好和写保护

0

1

1

0

0

0

0

0

0x60

16.            写保护操作

写保护是为了防止不小心的编程和擦除操作。当WP#为低时候,全部的编程和擦除操作都会被禁止。

17.            错误管理

Micron NAND芯片出厂时并不保证芯片中全部的块都是好的,仅仅要2048个块中有不少于2008个完善块就觉得是合格品能够出厂。可是坏的块的存在,并不影响好的块的操作。在应用系统中应该提供坏块影射、替代、错误校正等算法就能够保证数据具有非常高的可靠性和完整性。

每一个CE#的第一个块(物理块地址是0)绝对是经过測试,是完善无缺的。这就提供了存放BOOT代码和重要信息的存储位置。

在芯片出厂之前,厂家会在每一个坏块的第一或第二页的第一个备份位置(列地址是2048)用非0xFF编程来标识坏块。

系统软件在进行不论什么擦除或编程操作之前应该检查每一个块的第一或第二页的第一个备份地址数据。这样创建一个坏块表。

经过一定时间的使用,内存的某些位置可能会不能正确地编程和擦除,为了确保数据的可靠性,应该採取一些预防措施,比方:

l  在写、擦除、或数据搬移操作之后,总是检查状态。

l  使用某些类型的错误检測纠正算法,以便能恢复某些轻微iede1错误。

l  使用坏块替代算法。

相关文章:

swift 中跳转web view的两种方法

首先 遵循代理 引入头文件 #import <WebKit/WebKit.h> 第一种情况 直接跳转 了解不含特殊字符的 import UIKit class NewsViewController: UIViewController,WKNavigationDelegate,UIScrollViewDelegate { var webView : WKWebView WKWebView() override func viewW…

YAML开源库yaml-cpp简介及使用

关于YAML的介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/88090609 yaml-cpp是用c实现的用来解析和生成yaml文件的&#xff0c;源码地址在https://github.com/jbeder/yaml-cpp &#xff0c;这里使用的是最新发布的稳定版0.6.2. 解析和产生yam…

数据安全引担忧?get它,让你吃一颗“定心丸”

网络购物、在线外卖、远程教育、共享单车……如今&#xff0c;这些数字化的消费场景在个人生活中早已司空见惯。同时&#xff0c;在数字化浪潮下&#xff0c;越来越多的企业意识到大数据资产的价值&#xff0c;并试图推动其数字化转型。数据经济飞速发展&#xff0c;带来便捷和…

ETL数据抽取策略

ETL的抽取策略本文所提到的数据加载策略为OLTP系统作为源系统&#xff0c;并进行ETL数据加载到OLAP系统中所采用的一般数据加载策略。依循数据仓库的工作方式&#xff0c;原始资料由源数据库被抽取出来后&#xff0c;将在中间过程被写入到”Operational Data Store”(ODS)&…

iOS下拉tableView实现上面的图片放大效果

#import "ViewController.h" #define kScreenbounds [UIScreen mainScreen].bounds #define kScreenWidth [UIScreen mainScreen].bounds.size.width #define kScreenHeight [UIScreen mainScreen].bounds.size.height // 宏定义一个高度 #define pictureHeight 200…

在Windows7/10上通过VS2013编译FFmpeg 4.1.3源码操作步骤

多年前在https://blog.csdn.net/fengbingchun/article/details/40951403 中对FFmpeg在windows下的编译过程做过说明&#xff0c;那时FFmpeg版本用的2.4.3, VS是2010&#xff0c;现在FFmpeg最新稳定版为4.1.3&#xff0c;通过VS2013进行编译&#xff0c;较之前有了些不同&#x…

GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音

作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;本文中&#xff0c;Google 团队提出了一种文本语音合成&#xff08;text to speech&#xff09;神经系统&#xff0c;能通过少量样本学习到多个不同说话者&…

entity framework 使用Mysql配置文件

2019独角兽企业重金招聘Python工程师标准>>> <?xml version"1.0" encoding"utf-8"?> <configuration><configSections><section name"entityFramework" type"System.Data.Entity.Internal.ConfigFile.En…

UIWebView、WKWebView使用详解及性能分析

一、整体介绍 UIWebView自iOS2就有&#xff0c;WKWebView从iOS8才有&#xff0c;毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存&#xff0c;且内存峰值更是夸张。WKWebView网页加载速度也有提升&#xff0c;但是并不像内存那样提…

FFmpeg中libavutil库简介及测试代码

libavutil是一个实用库&#xff0c;用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。 以下是测试代码&#xff0c;包括base64, aes, des, …

区块链人才月均薪酬1.6万元?

在上周&#xff0c;我国宣布将重点推动区块链技术的发展&#xff0c;这个消息无疑是为区块链开发者们打了一直强心剂&#xff0c;简直是喜大普奔啊 &#xff01; 因为之前区块链这个技术虽然一直在圈内很火&#xff0c;但是却没有得到国家的全面认可和推广&#xff0c;所以很多…

用最少的时间学最多的数据挖掘知识(附教程数据源)| CSDN博文精选

作者 | 宋莹来源 | 数据派THU&#xff08;ID:DatapiTHU&#xff09;本文为你介绍数据挖掘的知识及应用。引言最近笔者学到了一个新词&#xff0c;叫做“认知折叠”。就是将复杂的事物包装成最简单的样子&#xff0c;让大家不用关心里面的细节就能方便使用。作为数据科学领域从业…

WKWebView 的使用简介

1. navigationDelegate [objc] view plaincopy print?- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { // 类似UIWebView的 -webViewDidStartLoad: NSLog("didStartProvisionalNavigation"); [UIAppli…

FFmpeg中libswscale库简介及测试代码

libswscale库功能主要包括高度优化的图像缩放、颜色空间和像素格式转换操作。 以下是测试代码(test_ffmpeg_libswscale.cpp)&#xff1a; #include "funset.hpp" #include <string.h> #include <iostream> #include <string> #include <memor…

FFmpeg中libswresample库简介及测试代码

libswresample库功能主要包括高度优化的音频重采样、rematrixing和样本格式转换操作。 以下是测试代码(test_ffmpeg_libswresample.cpp)&#xff0c;对音频了解较少&#xff0c;测试代码是参考examples中的&#xff1a; #include "funset.hpp" #include <iostre…

高德地图POI搜索,附近地图搜索,类似附近的人搜索

效果图&#xff1a; 首先导入道德地图的SDK&#xff0c;导入步骤不在这里介绍 2&#xff1a;包含头文件&#xff1a; [objc] view plaincopy #import <AMapSearchKit/AMapSearchAPI.h> 3&#xff1a;代码 [javascript] view plaincopy property(nonatomic,strong)AMap…

手把手教你实现PySpark机器学习项目——回归算法

作者 | hecongqing 来源 | AI算法之心&#xff08;ID:AIHeartForYou&#xff09;【导读】PySpark作为工业界常用于处理大数据以及分布式计算的工具&#xff0c;特别是在算法建模时起到了非常大的作用。PySpark如何建模呢&#xff1f;这篇文章手把手带你入门PySpark&#xff0c;…

mcDropdown使用方法

最近使用了mcDropdown插件&#xff0c;百度一查&#xff0c;资料较少&#xff0c;只看到了mcDropdown官网的英文说明文档&#xff0c;所以今天就写点&#xff0c;以便以后使用。 第一步&#xff1a;引用jquery库和css jQuery v1.2.6 (or higher)*jquery.mcdropdown.js Plug-inj…

Windows上通过VLC播放器搭建rtsp流媒体测试地址操作步骤

1. 从https://www.videolan.org/index.zh.html 下载最新的windows 64bit 3.0.6版本并安装&#xff1b; 2. 打开VLC media player&#xff0c;依次点击按钮&#xff1a;”媒体” --> “流”&#xff0c;如下图所示&#xff1a; 3. 点击”添加”按钮&#xff0c;选择一个视频…

Swift - AppDelegate.swift类中默认方法的介绍

项目创建后&#xff0c;AppDelegate类中默认带有如下几个方法&#xff0c;具体功能如下&#xff1a; 1&#xff0c;应用程序第一次运行时执行这个方法只有在App第一次运行的时候被执行过一次&#xff0c;每次App从后台激活时都不会再执行该方法。&#xff08;注&#xff1a;所有…

上热搜了!“学了Python6个月,竟然找不到工作!”

在编程界&#xff0c;Python是一种神奇的存在。有人认为&#xff0c;只有用Python才能优雅写代码&#xff0c;提高代码效率&#xff1b;但另一部分人恨不能把Python喷成筛子。那么&#xff0c;Python到底有没有用&#xff0c;为什么用Python找不到工作&#xff1f;CSDN小姐姐带…

Linux0.00内核为什么要自己设置0x80号陷阱门来调用write_char过程?

我一开始没注意这个问题&#xff0c;只是通过陷阱门觉得很绕弯子&#xff0c;为何不在3级用户代码里直接调用write_char&#xff0c;今天自己写程序想用call调用代码段&#xff0c;才发现了大问题。我写了个类似于write_char的过程&#xff0c;代码如下&#xff1a;dividing_li…

iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析

最近在项目中接入了微信支付和支付宝支付&#xff0c;总的来说没有那么坑&#xff0c;很多人都说文档不全什么的&#xff0c;确实没有面面 俱到&#xff0c;但是认真一步一步测试下还是妥妥的&#xff0c;再配合懂得后台&#xff0c;效率也是很高的&#xff0c;看了这篇文章&a…

LIVE555简介及在Windows上通过VS2013编译操作步骤

LIVE555是使用开放标准协议(RTP/RTCP, RTSP, SIP)形成的一组用于多媒体流C库。这些库支持的平台包括Unix(包括Linux和Mac OS X)、Windows和QNX(以及其它符号POSIX的系统)。这些库已经被用于实现的应用例如LIVE555媒体服务器、LIVE555代理服务器(RTSP服务器应用)以及vobStreamer…

GitHub App终于来了,iPhone用户可尝鲜,「同性交友」更加便捷

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】据外媒 VentureBeat 报道&#xff0c;在 11 月 13 日举行的 GitHub Universe 上&#xff0c;微软宣布了面向程序员和开发人员的一系列升级&#xff0c;包括针对 iOS 智能手机和 iPad 推出的 GitHub…

[NHibernate]代码生成器的使用

目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识&#xff0c;都是自己手敲的代码&#xff0c;有时候显得特别的麻烦&#xff0c;比如你必须编写持久化类&#xff0c;映射文件等等&#xff0c;举得例子比较简单&#xff0c;…

RapidJSON简介及使用

RapidJSON是腾讯开源的一个高效的C JSON解析器及生成器&#xff0c;它是只有头文件的C库。RapidJSON是跨平台的&#xff0c;支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/&#xff0c;稳定版本为2016年发布的1.1.0版本。 Rap…

高德地图关键字搜索oc版

.h文件 // MapSearchViewController.h // JMT // // Created by walker on 16/10/11. // Copyright © 2016年 BOOTCAMP. All rights reserved. // #import <UIKit/UIKit.h> #import <AMapNaviKit/MaMapKit.h> #import <AMapSearchKit/AMapSearchKit.h&…

同一个内容,对比Java、C、PHP、Python的代码量,结局意外了

为什么都说Python容易上手&#xff01;是真的吗&#xff1f;都说Python通俗易懂&#xff0c;容易上手&#xff0c;甚至不少网友表示「完成同一个任务&#xff0c;C 语言要写 1000 行代码&#xff0c;Java 只需要写 100 行&#xff0c;而 Python 可能只要 20 行」到底是真的还是…

图片存储思考:

http://blog.csdn.net/liuruhong/article/details/4072386