一种提高FLASH参数保存次数的实现方法与流程

文档序号:11707316阅读:581来源:国知局
一种提高FLASH参数保存次数的实现方法与流程

本发明属于电子技术领域,具体涉及一种提高flash参数保存次数的实现方法。



背景技术:

flash存储器(可编程只读存储器,以下简称flash)是intel公司于1988年推出的一种新型半导体存储器,具有非挥发存储特性,简称闪存,该类只读存储器具有集成度高、读取速度快、单一供电、再编程次数多等显著优点,flash存储器作为非易失数据存储设备,被广泛地应用于嵌入式系统中。单片机片内的flash可以在线编程,也可以存储程序运行时的数据。

由于flash在写入时,只能把其位由1变为0,每位写之前必须先变为1,也即是进行擦除;且flash擦除由最小区域限制,即一次至多要擦除一个扇区,如fm28335的flash容量为256k,分8个扇区,每次至多擦除32k;因此,基于这些特点,flash芯片在使用时,需要进行多次擦除,但是,flash芯片的寿命是由擦除次数限制,如fm28335可承受的擦除次数为10万次,那么,当擦写次数过多时,会导致整个flash芯片损坏掉,进而降低flash芯片的使用寿命。

随着电子技术的发展,dsp本身自带的flash容量也越做越大,除保存程序代码外往往还能剩很大空间,为了避免在flash存储器并未存满,仍然进行一次擦除,因擦写次数过多而导致falsh芯片损坏,寿命降低的问题,急需一种提高flash芯片的使用寿命的方法。



技术实现要素:

本发明的目的在于提供一种提高flash参数保存次数的实现方法,用以解决现有flash因并未存满而仍然进行多次擦写而导致flash芯片损坏的问题。

为实现上述目的,本发明采用一种提高flash参数保存次数的实现方法,包括以下步骤:

(1)在flash保存区划分出至少2个虚拟分区;

(2)通过查看flash保存区起始地址的寄存器中的数值,判断虚拟分区是否已写过;若数值为0xffff,则虚拟分区未写过,否则已写过;

(3)若虚拟分区未写过,则将数值为0xffff写进以flash保存区起始地址为地址的寄存器中;

(4)若虚拟分区已写过,则判断虚拟分区是否已写完;若所有虚拟分区已写完毕,则一次性擦除整个flash保存区,并将数值为0xffff写进以flash保存区起始地址为地址的寄存器中;若虚拟分区未写完,则继续写入参数,并将参数按顺序地保存在与最近一次保存虚拟分区相连的一个虚拟分区内。

所述步骤(4)中:比较当前参数起始地址与最后一个虚拟分区的起始地址,若当前参数起始地址大于等于最后一个虚拟分区的起始地址,则flash虚拟区已写完毕,否则虚拟分区还未写完。

所述的当前参数起始地址和最后一个虚拟分区的起始地址分别为:

pst=fps

pfp=fps+floor((fps-fpn)/spl)

其中fps指flash的起始地址,初始设定为fps=0x*******,fpn指flash尾或结束地址,初始设定为fpn=0x******,spl指所要保存的参数个数,floor指取小于或等于给定实数的最大整数。

在flash中的零虚拟分区建立索引区,所述索引区包括索引地址。

当虚拟分区未写过或已写完且虚拟分区中的参数已擦拭完毕,则执行

pst=fps+spl

indexl=0

indexr=0;

并把0xfffe写进以flash起始地址为地址的寄存器中,然后把参数写入以当前参数起始地址为首地址的寄存器里面;

其中,pst为当前参数起始地址,fps指flash起始地址,spl指所要保存的参数个数,indexl指行索引,indexr指列索引。

若虚拟分区还未写完,则判断列索引的指向,若列索引指向sml-1位,执行

indexr=0

indexl++

tempt=0xfffe;

则计算虚拟分区首地址,执行

pst=fps+(indexl*sml+indexr+1)*spl

把tempt值写进地址为fps+indexl的寄存器,然后把参数写入以当前参数起始地址为首地址的寄存器里面;

若列索引未指向sml-1位,执行

indexr++

tempt=1

tempt=*(fps+indexl)-(tempt<<indexr);

则计算虚拟分区首地址,执行

pst=fps+(indexl*sml+indexr+1)*spl

把tempt值写进地址为fps+indexl的寄存器,然后把参数写入以当前参数起始地址为首地址的寄存器里面;

其中,indexl指行索引,indexr指列索引,tempt指无标识位的16位进制数,*指取内容,<<indexr指左移列索引位,pst为当前参数起始地址,fps指flash的起始地址,初始设定为fps=0x*******,sml指单个寄存器所包含的位数,spl指所要保存的参数个数,fps+indexl指从flash的起始地址向下数indexl个的地址。

本发明提出一种提高flash参数保存次数的实现方法,其不需要任何硬件变更,参数保存次数由原来的flash的可擦写次数提高到虚拟分区的个数乘以flash可擦写次数,在参数保存次数不变的前提下,大大的延长了flash使用寿命。

本发明还通过零虚拟分区的索引地址可以快速的查找到参数保存的寄存器首地址,提高了设备运行速率,同时,便于在虚拟分区未写完时,继续写入。

附图说明

图1是本发明中flash参数保存次数的实现方法示意图;

图2是本发明中flash参数保存次数的实现方法流程图。

具体实施方式

下面将结合附图及实施例对本发明作进一步说明。

本发明提出了一种提高flash参数保存次数的实现方法,包括如下步骤:

(1)在flash保存区划分出至少2个虚拟分区;

(2)通过查看flash保存区起始地址的寄存器中的数值,判断虚拟分区是否已写过;若数值为0xffff,则虚拟分区未写过,否则已写过;

(3)若虚拟分区未写过,则将数值为0xffff写进以flash保存区起始地址为地址的寄存器中;

(4)若虚拟分区已写过,则判断虚拟分区是否已写完;若所有虚拟分区已写完毕,则一次性擦除整个flash保存区,并将数值为0xffff写进以flash保存区起始地址为地址的寄存器中;若虚拟分区未写完,则继续写入参数,并将参数按顺序地保存在与最近一次保存虚拟分区相连的一个虚拟分区内。

本发明在保存参数次数不变的前提下,可以有效的延长flash使用寿命。

本发明中包括初始参数的设定、flash初次写的识别、虚拟分区已写完的识别、索引地址的计算、虚拟分区首地址的计算。

首先,初始参数的设定为:

fps=0x*******

fpn=0x*******

sml=0x**

spl=0x**

pst=fps

pfp=fps+floor((fps-fpn)/spl)

其中fps指flash起始(或首)地址,fpn指flash结束(或尾)地址,sml指单个寄存器所包含的位数(默认为16位),spl指所要保存的参数个数,floor指取小于或等于给定实数的最大整数,pfp指所保存参数最后一个虚拟分区起始地址。

其次,通过查看地址为flash起始地址fps的寄存器中的数值,若此数值为

0xffff,则flash寄存器未写过,若此数值不为0xffff,则flash寄存器已写过;同时,通过对比当前参数起始地址pst与最后一个虚拟分区的起始地址pfp,若

pst>=pfp,则flash虚拟区已写完毕,擦除flash参数所在的扇区,否则虚拟分区还未写完。

当flash未写过或flash虚拟分区已写完且参数所在的扇区已擦拭完毕,并令

pst=fps+spl

indexl=0

indexr=0

把0xfffe写进以flash起始地址fps为地址的寄存器中,然后就可以将参数数据写入以当前参数起始地址pst为首地址的寄存器里面;

其中,pst为当前参数起始地址,fps指flash起始地址,spl指所要保存的参数个数,indexl指行索引,indexr指列索引。

若flash虚拟分区未写完,则判断列索引的指向。若列索引指向sml-1位,执行

indexr=0

indexl++

tempt=0xfffe

若列索引未指向sml-1位,执行

indexr++

tempt=1

tempt=*(fps+indexl)-(tempt<<indexr)

其中,indexl指行索引,indexr指列索引,tempt指无标识位的16位进制数,*指取内容,<<indexr指左移indexr位;

最后,计算虚拟分区首地址,执行

pst=fps+(indexl*sml+indexr+1)*spl

并把tempt值写进地址为fps+indexl的寄存器中,然后将把参数写入以pst为首地址的寄存器里面。其中,pst为当前参数起始地址,fps指flash的起始地址,初始设定为fps=0x*******,sml指单个寄存器所包含的位数,spl指所要保存的参数个数,fps+indexl指从flash的起始地址向下数indexl个的地址。

下面对本发明的工作过程作详细说明,所述工作过程以本发明技术方案为前提进行实施,给出了具体的实施方式和操作过程。

如图1所示,本方法根据参数长度大小,自动在flash保存区划分出n+1个虚拟分区,包括索引区和数据保存区,其中零虚拟分区即为索引区,数据保存区依次分为第一虚拟分区、第二虚拟分区…第n虚拟分区。

本方法中每次参数按顺序地保存在与最近一次保存虚拟分区相连的一个虚拟分区内,直到所有虚拟分区用完,一次性的擦除整个flash保存区,重新从第一虚拟分区开始顺序地往虚拟分区中保存参数。另外,本方法在零虚拟分区建立索引区,通过索引区中的索引地址能够快速的查找到当前参数要保存的寄存器的起始地址。

具体的实现过程,如图2所示,包括初始参数设定、flash初次写的识别、虚拟分区已写完的识别、索引地址的计算、虚拟分区首地址的计算等10个模块。

在初始参数设定模块1中,不但要设定flash起始(或首)地址fps,flash尾(或结束)地址fpn,单个寄存器所包含的位数(默认为16位)sml,所要保存的参数个数spl,而且要通过以下公式计算出所保存参数最后一个虚拟分区起始地址pfp

pfp=fps+floor((fps-fpn)/spl)

在以上完成后进入模块2。

通过查看地址为fps的寄存器中的数值完成flash初次写识别模块2,若此数值为0xffff,则flash寄存器未写过,若此数值不为0xffff,则flash寄存器已写过。

若flash已写过,则进入虚拟分区已写完的识别模块3中。通过对比当前参数起始地址pst与最后一个虚拟分区的起始地址pfp,若大于等于,则flash参数区已写完毕,并进入模块4擦除flash参数所在的扇区,否则虚拟分区还未写完。

若flash寄存器未写过或模块4已执行完成,则进入模块5。令

pst=fps+spl

indexl=0

indexr=0

并把0xfffe写进以fps为地址的寄存器中,也即进行初始化后,把零虚拟分区(索引区)跳过,写数据时会自动在第一个虚拟分区写入。

若模块3判断虚拟分区未写完,则进入模块6判断列索引的指向。若列索引指向sml-1位,则进入模块8,执行

indexr=0

indexl++

tempt=0xfffe

若列索引未指向sml-1位,则进入模块7,执行

indexr++

tempt=1

tempt=*(fps+indexl)-(tempt<<indexr)

其中tempt指无标识位的16位进制数,*指取内容,<<indexr指左移indexr位。

若执行完模块7或模块8,则进入模块9计算虚拟分区首地址,执行

pst=fps+(indexl*sml+indexr+1)*spl

若模块5或模块9执行完毕,则进入模块10,把参数写进以pst为首地址的寄存器里面。

若模块10执行完毕,则进入下一个周期,重新从模块2开始执行。

本发明通过增加参数可写次数达到延长flash使用寿命的目的,本领域技术人员应当明白,在不脱离本发明范围的情况下,还可以对本发明进行各种变换及等同替代。因此,本发明不局限于所公开的具体实施例和示意图,而应当包括落入本发明权利要求范围内的全部实施方式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1