0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如果有几个设置参数需要存储到Flash中,我们一般会怎么存储呢?

GReq_mcu168 来源:未知 作者:李倩 2018-05-14 16:15 次阅读

如果有几个设置参数需要存储到Flash中,我们一般会怎么存储呢?将不同的参数都存储到不同的页中,还是将这几个参数捆绑成一种结构体,每次修改都同时写入一次呢?

将参数存储到固定的地址,则每个参数都将占用Flash的一个块。而将全部参数捆绑一起存入Flash块中,那么只有一个参数修改时,也需要将全部参数一起存一遍。那么有什么更好的方法吗?

前段时间学习Msos,看到其中使用的参数存储的方法设计的很好,它将参数的变量地址与值,一同存储入Flash中。出彩之处是使用参数的变量地址来标记不同的变量。

一、数据结构

这种存储方式使用两个数据结构:

typedef struct

{

uint Address; //参数变量的地址

uint Data; //参数变量的值

}CellStruct;

要存储某个变量,需要将这个变量的地址和它的值一同存储到存储区。这种存储方式的核心就是这个数据结构。这样就可以使用*((uint *)(Address)) = Data直接将存储值赋值给对应的变量。简单的说就是根据地址值来标记各个不同的参数。

2.存储区的数据结构

typedefstruct{

二、代码解析

这种存储方式的使用两个函数:

读取存储区中的变量值并更新变量的值

变量的存储函数

2.1 参数的读取

流程图如上,主要步骤如下:

根据Flash中存写的变量地址,更新变量的值;

将Flash中存写的地址值存入临时数组中,并根据地址值判断是否存在重复存储的无效数据,并将无效数组失效;

清空Flash存储区,将临时数组中有效的变量重新存入Flash中。

通过这些步骤,将存储区中存储的变量读出,并将存储区中的重复的无效数据清除。下面是源代码:

#definepUint(address)*((uint*)(address))#definePageSize1024//Stm32F103R8T61Page=1024Byte#defineParameterAddress(FLASH_BASE+(63*1024))#defineParameterSpacePageSize/4/2staticvoidReadAllParameter(void){boolCleanFlag;inti,j;

2.2 参数的写入

参数的写入就很简单了,根据数据结构中的写入点,将变量的地址与值写入Flash中。

staticboolWriteParameter(void*dataPointer){

2.3 使用方法

使用方法:

每次上电启动时,调用读取全部变量的函数;

修改某个参数的时候,调用写参数函数;

三、注意事项

在读取参数时,需要在RAM中建立一个ParameterSpace大小的数组,如果这个值太大,会超过栈的大小,使得内存溢出。因此存储区不能开辟的太大。四、

总结

这种方式使用简便,尤其是在更新变量值时,根据存储的变量地址更新相应的值。其实其本质与我们使用变量名来标记不同的变量是一样的。不过也有缺点:

首先其同时存储变量的地址与变量的值,相当于多使用一倍的存储空间;

像上面的注意事项中说的,存储区不能开辟的过大,否则会使临时数组超过栈的大小。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4296

    浏览量

    85801
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28360

原文标题:技术干货:嵌入式中参数存储的一种方式

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CS SD NAND在打猎相机存储应用

    如果有猎物出现,立刻唤醒机器以极快的速度进行抓拍。为什么说这样的款产品会用到SD NAND?1、产品要求启动速度非常快,猎物出现,
    发表于 04-26 18:40

    MCU产品开发实现参数存储功能

    在工作,凡是涉及产品开发几乎都会实现参数存储功能,一般参数
    发表于 11-10 07:39

    嵌入式软件如何利用内部flash存储参数

    01前言嵌入式软件中经常要存储些非易失参数,例如用户设置、校准参数、设备运行参数等,通常情况下
    发表于 11-25 08:52

    关于CH573的存储映射结构

    ,常用的些代码参数可以放在DataFlash内,共有32KB的存储空间。系统Bootlader和配置信息InfoFlash内的数据一般是不操作,InfoFlash内的数据可通过工具进
    发表于 04-07 11:46

    嵌入式参数存储种方式

    如果有几个设置参数需要存储
    发表于 04-20 09:57 724次阅读

    招教你如何使用嵌入式参数代码,入门必懂知识

    如果有几个设置参数需要存储
    发表于 04-30 07:50 2713次阅读

    嵌入式的参数存储诀窍分享

    分享:标签:嵌入式 工业4.0 如果有几个设置参数需要存储
    发表于 10-13 20:24 0次下载
    嵌入式的<b class='flag-5'>参数</b><b class='flag-5'>存储</b>诀窍分享

    干货:嵌入式参数存储种方式详细教程

    如果有几个设置参数需要存储
    发表于 05-18 16:33 2013次阅读

    如何处理嵌入式参数存储

    如果有几个设置参数需要存储
    的头像 发表于 10-03 10:49 3324次阅读

    pcb布线线宽一般设置多少

    PCB布线是pcb设计很关键的环,有些小伙伴不知道pcb布线线宽一般设置多少,下面我们就来
    的头像 发表于 08-17 15:07 6.7w次阅读

    关于MCU产品开发参数存储的几种方案(开源项目持续收集整理)

    在工作,凡是涉及产品开发几乎都会实现参数存储功能,一般参数
    发表于 11-05 18:50 10次下载
    关于MCU产品开发<b class='flag-5'>参数</b><b class='flag-5'>存储</b>的几种方案(开源项目持续收集整理<b class='flag-5'>中</b>)

    如果有人用半的数据速率为你提供同样的视频质量,你接受吗?

    如果有人用半的数据速率为你提供同样的视频质量,你接受吗?
    发表于 11-04 09:50 0次下载
    <b class='flag-5'>如果有</b>人用<b class='flag-5'>一</b>半的数据速率为你提供同样的视频质量,你<b class='flag-5'>会</b>接受吗?

    如果有精确的时间基准,为什么还需要锁相环

    如果有精确的时间基准,为什么还需要锁相环?  随着时代的不断进步,人类对于时间的精确度与准确性要求越来越高,在许多领域,如通信技术、电力系统、精密仪器等等都需要
    的头像 发表于 09-20 16:28 602次阅读

    如何使用Flash模拟EEPROM存储参数

    在MCU的使用,经常遇到需要存储参数或掉电保持数据等功能。其中,Flash和EEPROM是常见的非易失性
    的头像 发表于 09-21 09:14 1424次阅读

    嵌入式软件如何利用内部flash存储参数

    嵌入式软件中经常要存储些非易失参数,例如用户设置、校准参数、设备运行参数等,通常情况下
    的头像 发表于 10-27 14:12 1400次阅读
    嵌入式软件<b class='flag-5'>中</b>如何利用内部<b class='flag-5'>flash</b><b class='flag-5'>存储</b><b class='flag-5'>参数</b><b class='flag-5'>呢</b>?