mcu flash 寿命 多次擦除acche 会不会变慢

flash擦除的问题 -
ARM Cortex-M系列产品 - 恩智浦技术社区
后使用快捷导航没有帐号?
查看: 1213|回复: 10
flash擦除的问题
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
运行环境K64+MQX,运行flash 的demo,出现一个问题,第一次运行能读能写,第二次运行只能读了,不能再写,可能原因,代码中没有擦除flash的操作,问一下,是否是这个原因,flash擦除是怎么操作的。
该用户从未签到主题帖子积分
高级会员, 积分 568, 距离下一级还需 432 积分
高级会员, 积分 568, 距离下一级还需 432 积分
mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...
恩,对的,问一下,对flash的一些操作函数的应用。
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...
我在代码flash_file = fopen(FLASH_NAME, NULL);之后加入
_io_flashx_erase_sector(flash_file);//想测试是否能擦除flash
结果&&就运行到
if (i == STRING_SIZE) {
& && &printf(&\nBytes are blank.&);
并且再也写不进去了
TA的每日心情开心3&小时前签到天数: 57 天[LV.5]常住居民I主题帖子积分
楼主代码上上来,看会有更多人帮你看的
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
楼主代码上上来,看会有更多人帮你看的
void flash_task
& && &uint_32 initial_data
& &MQX_FILE_PTR& &flash_
& &_mqx_int& && &
& &_mqx_int& && & len = 0;
& &uint_32& && &&&ioctl_
& &_int_install_unexpected_isr();
& &printf(&\n\nMQX Flash Example&);
& &buffer = (char_ptr)_mem_alloc_zero(BUFFER_SIZE);//啥意思?
& &//分配缓存区
& &if (buffer == NULL) {
& && &printf(&\nCan't allocate buffer&);
& && &_task_block();
& &/* Open the flash device */
& &//打开flash,扇区在前面已定义
& &flash_file = fopen(FLASH_NAME, NULL);
& & //_io_flashx_erase_sector(flash_file);
& &//测试是否能擦除flash,加了此句后,直接进入Bytes are blank
& &if (flash_file == NULL) {
& && &printf(&\nUnable to open file %s&, FLASH_NAME);
& && &_task_block();
& &} else {
& && &printf(&\nFlash file %s opened&, FLASH_NAME);
& &/* Get the size of the flash file */
& &//得到缓存区大小
& &fseek(flash_file, 0, IO_SEEK_END);
& &printf(&\nSize of the flash file: 0x%x Bytes&, ftell(flash_file));
& &/* Disable sector cache */
& &//使能缓存扇区
& &ioctl(flash_file, FLASH_IOCTL_ENABLE_SECTOR_CACHE, NULL);
& &printf(&\nFlash sector cache enabled.&);
& &/* Move STRING_SIZE Bytes back */
& &printf(&\nReading last %d Bytes.&, STRING_SIZE);
& &fseek(flash_file, -STRING_SIZE, IO_SEEK_END);
& &len = read(flash_file, buffer, STRING_SIZE);
& &//查看read原型
& &if (STRING_SIZE != len) {
& && &printf(&\nERROR! Could not read from flash. Exiting...&);
& && &goto example_
& &for (i = 0; i & STRING_SIZE; i++) {
& && &if (buffer != (char)0xFF)
& &if (i == STRING_SIZE) {
& && &printf(&\nBytes are blank.&);
& && &while ((buffer != 0) && (i & STRING_SIZE)) {
& && && &i++;
& && &if (i == STRING_SIZE) {
& && && &printf(&\nFound non-blank data, but not zero-ended string.&);
& && &else {
& && && &printf(&\nString found: %s&, buffer);
& && &printf(&\nType a string to be written to the end of file (%d chars max.):&, STRING_SIZE-1);
& && &fgets(buffer, BUFFER_SIZE, stdin);
& && &len = strlen(buffer);
& &} while (!len || len & STRING_SIZE-1);
& &/* Move STRING_SIZE Bytes back */
& &fseek(flash_file, -STRING_SIZE, IO_SEEK_END);
& &/* Unprotecting the the FLASH might be required */
& &ioctl_param = 0;//本来是0
& &ioctl(flash_file, FLASH_IOCTL_WRITE_PROTECT, &ioctl_param);
& &len = write(flash_file, buffer, STRING_SIZE);
& &if (len != STRING_SIZE) {
& && &printf(&\nError writing to the file. Error code: %d&, _io_ferror(flash_file));
& && &printf(&\nData written to the flash.\nNow you can power down and power up your device&);
& && &printf(&\nand then retry the test to see if the string was written correctly.&);
example_end:
& &fclose(flash_file);
& &printf(&\nFlash example finished.&);
& &_task_block();
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
mqx中有个例程的, C:\Freescale\Freescale_MQX_4_2\mqx\examples\flashx , 楼主跑的是这个例程吗 ...
现在那个demo的问题是:1当flash是空的时候,能进行读写,如图1所示。2.当flash被写入一个数据后,就再也写不进去了。我查看了一下代码,猜想可能是由于flash在写之前未进行擦除操作导致。
已尝试ioctl(flash_file, FLASH_IOCTL_ERASE_SECTOR, NULL);ioctl(flash_file, FLASH_IOCTL_ERASE_CHIP, NULL);放置于len = write(flash_file, buffer, STRING_SIZE);都不行。
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
问题得到解决,需要设置bank的地址&&如果选用了bank0 然后尽量从后往前读写
TA的每日心情郁闷 10:18签到天数: 1 天[LV.1]初来乍到主题帖子积分
问题得到解决,需要设置bank的地址&&如果选用了bank0 然后尽量从后往前读写
例程中都是从后往前写,这是一个bug,飞思卡尔的人都没有解决
TA的每日心情怒4&天前签到天数: 63 天[LV.6]常住居民II主题帖子积分
例程中都是从后往前写,这是一个bug,飞思卡尔的人都没有解决
K64得读写FLASH确实有点问题
Tel: 3-8069
版权所有@苏州灵动帧格网络科技有限公司
Powered by延长flash存储器使用寿命的研究_单片机_中国百科网
延长flash存储器使用寿命的研究
    引 言随着嵌入式系统在数码相机、数字摄像机、移动电话、mp3音乐播放器等移动中越来越广泛的应用,flash存储器已经逐步取代其他半导体存储元件,成为嵌入式系统中主要数据和程序载体。flash存储器又称闪存,是一种可在线多次擦除的非易失性存储器nvm(non-volatile memo-ry),即掉电后数据不会丢失。flash存储器还具有体积小、功耗低、抗振性强等优点,是嵌入式系统的首选存储。世面上常用的flash存储设备有两种:nor flash和nand flash。根据存储容量,nor一般为1~16 mb,而nand为8~512 mb,现在的大容量nand已经可以达到4 gb;读取速度nor较nand快,写入速度nor比nand慢一些;擦除速度nor需要2~5 s,而nand仅仅需要2~5 ms;nand的价格比nor低很多。由于种种原因,较常用的是nand flash。但是由于nandflash的工艺不能保证nand的存储阵列(memory ar-ray)在其生命周期中保持性能的可靠,因此,在nand的生产中及使用过程中会产生坏块。其表现是:当编程/擦除这个块时,不能将某些位拉高,这会造成页编程(page program)和块擦除(block erase)操作时的错误;相应地,反映到状态寄存器(status register)的相应位。总体上,坏块可以分为两大类:第一类为固有坏块,这是生产过程中产生的坏块,一般芯片原厂都会在出厂时将坏块第一个页的扩展区域(spare area)的第6个字节标记为不等于0xff的值;第二类为使用坏块,这是在nandflash使用过程中,如果块擦除或者页编程错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现坏块的第一个页的扩展区域的第6个字节标记为非0xff的值。由于flash写入数据的时候是先擦除块,这样这个块里面的数据将全部变成0xff,写入1时,该位不变;写入0时,该位由1变为0。如果将扩展区域的第6个字节标记为非0xff之后,将不可能再恢复为0xff,除非格式化有可能恢复。我们已经了解到,坏了的块是无法擦除和写人数据的,而在嵌入式系统中,启动的第一步就是将flash里面的前4kb数据自动复制到sram里面去运行。如果仅仅flash的第一块坏了,而导致引导程序无法下载进去,那么这个块不是不能读取数据,而是读不出我们想再要放入的数据,这样这个flash设备就报废了。本文就这个问题作了深入的讨论,用一种基于flash的地址重映射的方法解决这个问题。本文采用三星(samscrag)公司的s3c2440 arm处理器和nand flash存储设备k9f1208uom讨论地址重映射的思想。1 s3c2440使用nand flash引导系统的方法自动启动模式顺序:①复位完成;②当设置为自动启动模式,nand flash的开始4 kb被拷贝到steppingstone的4 kb内部缓冲器;③steppingstone映射到ngcs0;④cpu开始在steppingstone执行启动代码程序。由系统引导顺序看出,如果flash的第一块坏了,那么读出的数据不一定是引导程序,这样,系统将无法启动。而在这种情况下,就只能换一块完好的flash了,这样就造成了很大的浪费。2 flash存储器的内部结构k9f1208uom型flash芯片内部存储器结构如图1所示。典型的nand flash由4 096块组成,每一个块包含32页,而每页是512+16=528字节。对于一个页,0~511字节为主存储区,即通常所说的用户可设定地址区,用来存储数据;512~527共16字节为扩展存储区,用来存储页的信息。扩展区的16字节用于描述主存储区的512字节。而对于坏块,也仅仅是将这16字节的第6字节设置为不等于0xff,来标示坏块。在nandflash使用过程中可能会出现这样的问题:产生坏块或坏页、由此引发的数据丢失、对一些扇区或块的过分磨损导致nandflash寿命缩短等。为了能更好地使用nand flash,在其损坏时使损失最小化,需要一种方法,使用相同的地址可以屏蔽掉坏了的块,而指针指向好块。即使第一块坏了,还可以使用o地址去操作一个好块。3 flash存储器的读取方法k9f11208uom型flash芯片内部与外部引脚关系如图2所示。对于每一个块的访问,都需要一个固定的物理地址,基于这个固定的物理地址来操作flash存储器,在对块进行操作的时候,一个块地址对应一个块,如果这个块坏了,那么这个地址的存在就没有意义了。就像arm芯片在引导的时候,需要复制flash的前4 kb的数据,这样需要固定块的数据。如果这个块坏了,系统将无法引导。下面通过地址重映射的方法,即在flash固件里面加入一个地址重映射的区域来解决这一问题。4 基于地址重映射的读取方法在实现地址重映射的时候,可以从块逻辑地址o开始,查看相对应的物理块。如果损坏,将地址从最后一个开始向前指,而相应的逻辑块被标示为坏块。例如图3,物理块0损坏,逻辑块地址0指向物理块4095的地址,而逻辑块地址4095被标示为坏块。可以看出,即使块0掼坏,仍然可以通过逻辑地址o进行操作,其内部的变化,并不会影响外部的使用。唯一不同的是,flash的整体空间变小了。不过即使这样,也不会像以前那样,第一块坏了,就去换一个flash。5 性能分析很明显,在数据读取的时候增加了一步地址重映射的计算。这样使整体性能会略微下降。下面分析一下加入地址重映射之后的性能影响(这里仅仅分析数据的读取性能,因为对flash操作最多的是数据的读取,用户使用时也是读取最多)。地址重映射是根据输入的地址计算操作地址的。从图4可以看出,地址重映射的计算是加在地址a25输入之后的,因其在内部操作,延时相对很小。而这个地址重映射在整个块操作之中只操作一次,且其使用时间很短,故在这里可以忽略不计,其对数据的读取操作基本没有影响。加入地址重映射之后,坏块全部集中到了整个flash设备的最后。也就是说,即使这个flash中有1024个块坏了,仍然可以当其为一个32 mb的flash来使用,即其有效块为第0~1 023块;不像前面所描述的那样,就算只有第一个块坏了,这个flash也就报废了。经过加入地址重映射之后的flash,即使就剩下一块没有损坏的块了,这个flash仍然可以作为引导系统使用。6 结 论通过在flash内部加入地址重映射机制,对于使用flash将会有很大的方便,并且,即使第一个块坏了,仍可以继续使用这个flash,而无需厂家保证第一个块是好的。这样大大延长了flash的使用寿命,仅仅在坏块达到一定数量的时候才需要换一个。
收录时间:日 10:13:31 来源:dzsc 作者:不详
上一篇: &(&&)
创建分享人
喜欢此文章的还喜欢
Copyright by ;All rights reserved. 联系:QQ:提高 MSP430G 系列单片机的 Flash 擦写寿命的方法
 &>&&>&&>&&>&正文
在软件处理中,当成功保存Flash
数据后,再写入该子页的状态标志。单片机上电后,用户程序将查找最后一次写入的子页,再将该子页的数据内容并恢复到内存中的数据结构中。4. 系统可靠性设计4.1 时钟源的选择由于驱动Flash 的时钟源(ACLK、MCLK、SMCLK)和时钟频率可以设定,为了保证在将数据写入模拟EEPROM时的可靠性,建议在将Flash
的时钟频率降低后,再对其进行操作。例如将Flash 的时钟频率降低到1MHz
后,进行写入操作。需要注意,在降低了时钟频率后,若此时钟源也是定时器(Timer)的时钟源,则可能会影响到定时器的定时准确性,需要软件上做好处理。4.2 代码在RAM中运行由于向Flash 写入数据操作是通过执行Flash 中程序代码,对Flash 进行擦除和编程操作。由于对Flash 的编程需要mcu
内部执行一个升压操作,所以如果有足够的内存空间,建议将编程、擦除等关键代码拷贝到RAM中运行,可以使用关键字__ramfunc 指定,如下图七所示。
图七 使用关键字__ramfunc 将程序指定到Ram 中运行5. 总结本文从软件方面,以及安全性方面探讨了使用MSP430G 系列单片机在使用Flash
模拟EEPROM方面的应用,提供了两种不同的方式供选择。两种方式都可以大幅度提高模拟EEPROM的编写、擦除寿命,并且满足高可靠性的应用设计,用户可以结合具体的应用进行选择。
&&&&第3页&&http://www.autooo.net/autooo/mu/moni//104736.html1148人阅读
bootloader中关于flash擦除写和ram初始化的问题。
最近在做飞思卡尔16位单片机的在线升级bootloader程序。有2个问题不太清楚,请教下论坛里的高人。
1.bootloader程序中,对存放应用程序的flash空间进行擦除和写入新的应用程序以完成升级。比较特别的是,需要将flash操作代码拷贝到ram中执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会误擦除,而且运行到哪个函数自然会把函数压栈到RAM里执行吧?为什么还要特地拷贝到RAM里呢?
2.单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?每次程序都是从bootloader的main函数开始执行,确定不是升级状态后跳转到应用程序重映射的reset中断向量地址(flash地址)执行。bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?会在跳转后重新初始化RAM吗?
哪位大侠帮帮忙,先行谢过!!
------解决方案--------------------
每个运行时态应该都有自己的startup,进行本运行时态所必须的初始化工作,包括块定位搬移、ZI等等。一般都可以在相应的配置文件中进行指定的。
16位的不太熟,CF的通过MEM CFG配置配置就行。&
------解决方案--------------------
我们用的Freescale的9s12g128做的bootloader,通讯和诊断协议用的ISO15765-3,不知道你用的自定义通讯协议还是什么?
(1) Flash操作的那部分,也就是Flash的读写驱动程序是必须放到RAM中执行,原因是当进行Flash擦写时,Flash中的程序就不可以被执行了,这是硬件的限制。这是Freescale单片机的情况,我不清楚其它单片机会不会有这个限制。
你说的“运行到哪个函数自然会把函数压栈到RAM里执行吧”,不可能把函数压到堆栈里面的,只是在函数调用和函数被中断打断,一些寄存器和一些局部变量等会被压倒堆栈里面。默认情况下,16位freescale单片机在prm中配置的堆栈大小是0x100字节,很多函数都要比它大。
(2)&单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?& 这是个很好的问题,全局变量和静态变量的初始化值是保存在Flash中的Const段里的,新建一个工程的时候默认有个startup的汇编程序文件,它负责将const段中的初始值付给这些全部变量。这些事情是发生在你的main函数之前的。
(3)&bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?&,没有影响,bootloader和你的应用程序是分时复用RAM的,上电程序就跑到bootloader,如果有合法的应用程序就跑到应用程序,应用程序里面会再次初始化变量的,也就是上面2说到的。&
------解决方案--------------------
flash不能同时读写,所以升级程序的时候要把程序拷贝到ram,防止写flash的过程中因为“读”程序而访问到flash
第二个问题属于编译原理方面的,数据初始化是在main之前的,如果你直接跳转到main,那就不会初始化。如果你是跳转到app程序烧写的位置(一般都是这样),那自然会再初始化一次。
而且,变量是否初始化也不是绝对的,有的编译器对未赋值的变量是不做初始化的
楼主不如自己写个程序验证下就知道了。这种问题,自己动手验证远比问人能学到更多。&
------解决方案--------------------
liangboone君,还有个地方没弄明白,请教下。
“全局变量和静态变量的初始化值是保存在Flash中的Const段里的”:
这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中应用的s19文件只把中断向量表的地址重映射了,const段地址应该没有变动,这样const段不会……
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:335283次
积分:2656
积分:2656
排名:第11146名
原创:25篇
转载:94篇
评论:81条
(1)(1)(1)(1)(1)(4)(2)(1)(1)(6)(15)(3)(4)(1)(2)(8)(2)(50)(10)(5)403 Forbidden
403 Forbidden}

我要回帖

更多关于 光盘擦除软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信