打印

关于eeprom和ram的问题

[复制链接]
3012|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huandaczq|  楼主 | 2017-12-31 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先提前祝大家元旦快乐。
之前用pic16f72芯片,然后用mplab的时候发现program 和data space不够,所以去物色大一些的芯片,目前锁定在pic18f45k20和22两款上。

把【16f72】【18f45k20后称20】【18f45k22后称22】进行比较,有一点不是很清楚,就是18f45多了eeprom space。
16f72的datasheet上没有eeprom space,mplab编译的时候系统也说没有。(这些是前提背景)

eeprom看名字,电可擦出可编程+只可读取储存.
看资料flash是广义上的eeprom。前者大块的擦出写入,后者可以单字节。(知乎上有人后者属于狭义上rom)

问题来了:programme type是flash,无论是20的64k还是22点32k其data eeprom只有1024和256bytes,和flash起来小太多了,那存在的意义是什么?

个人猜测推理:
16f72程序那些if while等程序(时序)放在program space里,然而其他变量或者常数都放ram里。
同理:20或者22if while等程序(时序)放在program space里,但是一些变量比如温度什么的还是放在ram里,但是不变的常数放在rom里?

举个例子:满档的电机可以运行10cm/s(个别因素比如打滑什么的不考虑先)那么变量时间t_run是否是存放在ram里,但是speed_ful存放在eeprom里。如何让小车满档运行的等条件,通过program space也存放在ram里还是说直接存放在program space里?

相关帖子

沙发
chunyang| | 2017-12-31 18:48 | 只看该作者
这里的EEPROM特指非易失的数据存储器,而非程序存储器,FLASH是程序存储器。FLASH确实是一种EEPROM,但要注意语境。单讲器件或非易失存储器技术,FLASH是一种EEPROM,其完整的正式名称也是Flash EEPROM,但在MCU片内语境下,二者位于不同的存储空间,EEPROM在数据空间,FLASH在程序空间。支持IAP的MCU原则上都可以利用程序FLASH来实现非易失数据存储,但操作麻烦,而EEPROM就简单多了,而且EEPROM的写循环寿命也比FLASH长很多。
在应用方面,不变的常数应放在FLASH内,需要掉电保存的可更改的数据,放在EEPROM中,而运行时才需用到的无须保存的临时数据,当然应该放在RAM里。

使用特权

评论回复
板凳
huandaczq|  楼主 | 2018-1-2 00:00 | 只看该作者
chunyang 发表于 2017-12-31 18:48
这里的EEPROM特指非易失的数据存储器,而非程序存储器,FLASH是程序存储器。FLASH确实是一种EEPROM,但要注 ...

感谢大神的即使回复,不过我的回复有点晚。
专业的回答听的有点云里雾里,对于第二段的解释,大神可以给一个简单的例子吗?
比如说自己设定的满格速度v=10是放在flash里?什么放在eeprom里?(意思是举个简单的例子方便分析,因为我可能会认为,上面我说的速度10cm/s这个数据既可以认为是不变常数也可以说是点点保存,但是可以更改的数据)
最后追问3个小问题:看你楼层左上角的图标,你应该是管理员,我想追问之前问过的一个小问题,你可以看过,现在还有点糊涂:我们平时看都说,寿命100万次擦写是指【1,程序写好以后,烧录到芯片里的eeprom和flash里的次数吗?2,平时做一些逻辑运算或者说和其他芯片交流也是一个读一个写或者说ad转换都是存到ram里,这些应该都是默认为无限大的次数吧。】

使用特权

评论回复
地板
chunyang| | 2018-1-2 15:49 | 只看该作者
huandaczq 发表于 2018-1-2 00:00
感谢大神的即使回复,不过我的回复有点晚。
专业的回答听的有点云里雾里,对于第二段的解释,大神可以给 ...

听不懂说明你对MCU体系结构还没弄明白,赶快去看教材,而你的“举例”没有意义,因为你的基本概念都不对。另外,我非管理员。是不是管理员,一方面多看看ID本身的含义和ID信息,另一方面从发帖回帖的内容也该看出。你得出此结论,说明你没有耐心细致观察和分析,喜欢随便下结论,这是非常不好的习惯,尤其是技术人的大忌。关于擦写寿命,FLASH和EEPROM是不同的,FLASH以擦除次数计,EEPROM以写入次数计,RAM的读写周期是没有寿命限制的。

使用特权

评论回复
5
huandaczq|  楼主 | 2018-1-2 21:10 | 只看该作者
chunyang 发表于 2018-1-2 15:49
听不懂说明你对MCU体系结构还没弄明白,赶快去看教材,而你的“举例”没有意义,因为你的基本概念都不对 ...

首先解释2点。
第一点:关于云里雾里,我指的是你原话“支持IAP的MCU原则上都可以利用程序FLASH来实现非易失数据存储”IAP开始不懂,百度了下懂了。我主要的意思是,把字都拆开,那么懂,组成了句子,有点拗口,有点云里雾里的感觉。
第二点:我没有下结论,我本身是想打一个问好的。问下是不是管理员,本身我的本意不是说定义你就是管理员,而是看到你的图标【坛主】所以问是不是管理员的意思,因为是反问句,加上没有问好,所以你误会了。

关于擦写寿命,十分感谢你对我这方面知识的整理与解析。

最后关于举例问题。是我比较愚笨,一句话可能读很多遍都未必理解,需要做个比喻来帮助自己理解。何为程序空间,何为数据空间,字面理解很简单,但是从最简答的if (a==1), b=2来看,if可以做为程序,那么a呢?b呢?或者说flash帮你在微观上布置电子的“移动方式”,eeprom单纯的就是记录数据也就是上面的1-2。

很多东西可以无限展开来说,对于一把梳子,2根之间即使存在20%的距离误差也不影响我们梳头,但是对于一座大桥来说,如果存在1%的误差,你都无法对接。本身我就是对应用这块比较感兴趣,加上自身资质,我可能就只适合做那把梳子,对于v=10怎么如何来归类,其实对于我帮助或许不大,因为编译器都会告诉你多大多大了,我只是想稍微简练的理清下逻辑和构架思路。举个不恰当的例子【我又要举例了】:学的高数未必在需要算法的时候都用到,即使最简的1+2+..+n都不会,只要我在需要用的时候,能拿过来用就好了。这话有点小长,可以忽略不看!前面的问题是关键。

使用特权

评论回复
6
chunyang| | 2018-1-3 13:32 | 只看该作者
huandaczq 发表于 2018-1-2 21:10
首先解释2点。
第一点:关于云里雾里,我指的是你原话“支持IAP的MCU原则上都可以利用程序FLASH来实现非 ...

都说了,建议你去看教材,基本概念宜看教材。

使用特权

评论回复
7
Ansersion| | 2018-1-3 22:50 | 只看该作者
首先来说说“if while”、“变量”、“常量”的存储位置:全部都在flash中。

接着来说说,eeprom相较flash的意义:重要的事说三遍,寿命长,寿命长,寿命长。

然后来说说ram的事:
举个例子,假如你写了一个函数
int func()
{
int a;
a = 1;
return a;
}
如果这个函数被调用了10次,那么flash中是不是存了10个变量a呢?
答案是:flash中只存了1次"int a"的命令,这个命令会在ram中分配1块存储a的空间。这就是ram的角色,也就是存放临时变量。

最后来说说rom,掉电不丢数据的统称为rom,flash和eeprom都算是rom。flash和eeprom都是可写的,rom(read only memory)这个名字开始渐渐失去意义了。

注:临时变量在程序运行时,被存储在ram中,全局变量和静态变量是被存储在flash中,这些内容和编译过程有关,背景知识较多,以上为粗略描述,希望对你有用。

使用特权

评论回复
8
Ansersion| | 2018-1-3 23:00 | 只看该作者
首先来说说“if while”、“变量”、“常量”的存储位置:全部都存储在flash中。
接着来说说eeprom相较flash的意义:重要的事说三遍,寿命长,寿命长,寿命长。
然后来说说ram,举个例子,假如你写一个函数
int func()
{
int a;
a = 1;
return a;
}
这个函数被调用了10次,那么flash中是不是存放着10个变量a呢?
答案是:flash中只存了1次“int a”命令,但是每执行这个命令一次,都会在ram中分配一块空间存储a,这就是ram的角色,用于临时存放数据。

注:临时变量在程序运行时,被存放在ram中,全局变量、静态变量、常量被存放在flash中,这些内容和编译过程有关,以上为粗略描述,希望对你有所帮助。

使用特权

评论回复
9
huandaczq|  楼主 | 2018-1-5 10:18 | 只看该作者
Ansersion 发表于 2018-1-3 23:00
首先来说说“if while”、“变量”、“常量”的存储位置:全部都存储在flash中。
接着来说说eeprom相较flas ...

多谢你的回答。
刚刚看到,帅哥,你回复了2次。哈哈。
调用10次存1个变量这个是肯定的,否则不说m级,就是k级别始终也可以把你刷爆了。
我主要的问题是存放在哪。
比如a=a+1;按照你的说法,在被调用的时候a=1,2,3,4...是存在ram中的。但是int a是在flash中。这样理解应该没错吧?

那么eeprom掉电保护的数据是什么?比如初值a=456?还是说什么数据?

使用特权

评论回复
10
Ansersion| | 2018-1-5 22:42 | 只看该作者
huandaczq 发表于 2018-1-5 10:18
多谢你的回答。
刚刚看到,帅哥,你回复了2次。哈哈。
调用10次存1个变量这个是肯定的,否则不说m级,就 ...

除非明确调用读写eeprom的函数,否则不会有数据进出eeprom,这些函数一般都是一些专用函数库。
再来说说
a = 456;
如果a是一个函数的临时变量,则这个值存在ram中,
如果a是一个全局变量,则这个值是存在flash中。

这和编译过程有关,如果是全局变量,在编译的时候,flash中就在给定的区别设定了这个数值;
如果是临时变量,则先分配一个ram空间,之后把数据存进去。

使用特权

评论回复
11
huandaczq|  楼主 | 2018-1-9 13:51 | 只看该作者
Ansersion 发表于 2018-1-5 22:42
除非明确调用读写eeprom的函数,否则不会有数据进出eeprom,这些函数一般都是一些专用函数库。
再来说说
...

非常感谢回复,可否最后问一个问题:哪样的数或者函数才可以被写入eeprom里面,因为编译的时候这些都自动帮你规划好哪个属于哪个!if while在flash中,临时变量ram,全局变量flash 那么eeprom是???

使用特权

评论回复
12
ningling_21| | 2018-1-9 14:31 | 只看该作者
huandaczq 发表于 2018-1-9 13:51
非常感谢回复,可否最后问一个问题:哪样的数或者函数才可以被写入eeprom里面,因为编译的时候这些都自动 ...

例如电子秤,校准的参数(或产品序列号,软件版本等)需要保存在EEPROM里,其它不需要

使用特权

评论回复
13
huandaczq|  楼主 | 2018-1-9 16:01 | 只看该作者
本帖最后由 huandaczq 于 2018-1-9 16:10 编辑
ningling_21 发表于 2018-1-9 14:31
例如电子秤,校准的参数(或产品序列号,软件版本等)需要保存在EEPROM里,其它不需要 ...

谢谢,产品序列号,软件版本等,这几个听起来感觉有些“上档次”“正规军”的感觉,
可以再再再问一个问题吗
编译的时候如何让某个数据被选择为eeprom而不是flash。因为之前我用的是picc编译器,芯片是pic16,算是比较低端。都是自动告诉你program和data space多少,eeprom直接就没有的。
因为我正在看pic18f45k20的config bit,最下面正好有个设置版本位的寄存器。这个位设置了,应该就是你所说的eeprom的大小了。
那么eeprom是否是都是系统给你的一些空间让你来设置。举个例子:寄存器device的3210位是版本id位置那么1024byte大小是否可以理解为剩余1023.5的空间,而这所有的1024byte大小所对应的寄存器都是已经存在的。而不是我们自己去设置的比如a=xx;b=yy?还是说应该这么理解?

使用特权

评论回复
14
ningling_21| | 2018-1-9 16:09 | 只看该作者
huandaczq 发表于 2018-1-9 16:01
谢谢,产品序列号,软件版本等,这几个听起来感觉有些“上档次”“正规军”的感觉,
可以再再再问一个问 ...

首先要知道,使用的是芯片内部的EEPROM还是外置的(如24C02等)?

如果有片内的EEPROM,编译器是否支持把数据放置在EEPROM?

使用特权

评论回复
15
huandaczq|  楼主 | 2018-1-9 16:16 | 只看该作者
ningling_21 发表于 2018-1-9 16:09
首先要知道,使用的是芯片内部的EEPROM还是外置的(如24C02等)?

如果有片内的EEPROM,编译器是否支持把 ...

对的,忘记说了,之前使用的pic16f72内部没有eeprom,现在准备使用的18f45k20有1024byte大小的eeprom

编译器如果支持,是否是有专门的一个代码(语言)可能为说的不是很专业,意思就是,就好像switch case一样,写了这样一个代码,就代表要把该数据写入eeprom。之前使用的是picc,现在使用c18,刚刚开始,因为p18f45k20有eeprom空间,所以c18应该是支持把数据放入eeprom的,不过是不是需要拓展包,或者说收费项目等,这些我可能还不是很了解。

最后,感谢大神连续2个回复,上一个回复我没有说清楚,也没想到你会这么快回复,所以在上面有重新编写了一段,也就是最后一段。麻烦你看一下,我不知道退出后是否会重新打字,所以我先回复你了,然后把上一次回复的最后一段(后来添加的)给复制到最后
上一次回复的最后一段:
那么eeprom是否是都是系统给你的一些空间让你来设置。举个例子:寄存器device的3210位是版本id位置那么1024byte大小是否可以理解为剩余1023.5的空间,而这所有的1024byte大小所对应的寄存器都是已经存在的。而不是我们自己去设置的比如a=xx;b=yy?还是说应该这么理解?

使用特权

评论回复
16
ningling_21| | 2018-1-9 16:36 | 只看该作者
huandaczq 发表于 2018-1-9 16:16
对的,忘记说了,之前使用的pic16f72内部没有eeprom,现在准备使用的18f45k20有1024byte大小的eeprom

编 ...

C18不熟悉
芯片内部的EEPROM,一般都是独立区域,需要专门的指令去访问(如STC等)。
编译器一般也不会支持把数据编译进EEPROM.
EEPROM是一块独立存储空间,用来存数据,一般必须用专门的寄存器和指令去访问(例如AVR或STC)

使用特权

评论回复
17
huandaczq|  楼主 | 2018-1-9 17:24 | 只看该作者
ningling_21 发表于 2018-1-9 16:36
C18不熟悉
芯片内部的EEPROM,一般都是独立区域,需要专门的指令去访问(如STC等)。
编译器一般也不会支 ...

好的,非常感谢感知的指点迷经,虽然依旧是小白,但是也算“豁然开朗”了。

真的十分感谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

186

帖子

0

粉丝