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

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

3天内不再提示

如何处理嵌入式中参数的存储?

5RJg_mcuworld 来源:未知 作者:易水寒 2018-10-03 10:49 次阅读

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

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

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

一、数据结构

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

typedef struct

{

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

uint Data; //参数变量的值

}CellStruct;

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

二、代码解析

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

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

变量的存储函数

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大小的数组,如果这个值太大,会超过栈的大小,使得内存溢出。因此存储区不能开辟的太大。

总结

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

首先其同时存储变量的地址与变量的值,相当于多使用一倍的存储空间;像上面的注意事项中说的,存储区不能开辟的过大,否则会使临时数组超过栈的大小。

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

    关注

    4963

    文章

    18160

    浏览量

    286539
  • FlaSh
    +关注

    关注

    10

    文章

    1536

    浏览量

    146591
  • 数据结构
    +关注

    关注

    3

    文章

    557

    浏览量

    39872

原文标题:嵌入式中参数的存储,你是怎么处理的?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是嵌入式系统和嵌入式微处理

    扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。4)嵌入式微处理器必须功耗很低,尤其是用于便携的无线及移动的计算和通信设备
    发表于 08-12 14:35

    嵌入式定义

    及移动的计算和通信设备靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至μW级。四、嵌入式系统的组成 (1)硬件层硬件层包含嵌入式微处理
    发表于 04-17 23:00

    嵌入式开发,你是如何理解嵌入式C编程的?

    ,需要设计强大的存储区保护功能,同时也有利于软件诊断。 3.可扩展的处理器结构,以便能最迅速地开发出满足应用的最高性能的嵌入式微处理器。 4.嵌入式微处理器必须功耗很低,尤其是用于便携
    发表于 03-22 09:38

    嵌入式相关的资料

    的功能越来越强大,应用接口更加丰富,根据实际应用的需要设计出特定的嵌入式最小系统和应用系统,是嵌入式系统设计的关键。目前在嵌入式系统开发的过程,开发者往往把大量精力投入到
    发表于 02-09 20:38

    嵌入式参数存储处理

    嵌入式参数存储,你是怎么处理的?
    发表于 03-30 08:29

    【原创分享】如何学好嵌入式系统的C语言编程

    的可执行文件下载到嵌入式系统开发板(一般称为目标系统)的存储,并通过一定的机制控制和观测目标系统的寄存器、存储器等。这个开发过程往往需要使用多种不同的工具,对此初学者很容易感到困惑
    发表于 09-28 20:37

    嵌入式处理器有哪些分类

    学习嵌入式的同学都知道嵌入式系统硬件的组成部分是以嵌入式处理器为中心,由存储器、I/O设备、通信模块以及电源等必要的辅助接口组成的。可以说
    发表于 11-08 07:46

    嵌入式处理器组成

    组成嵌入式系统嵌入式处理器是系统的核心部件。代表ARM MIPS PowerPC MC68000外设存储SRAM RAM Flash通信RS232 SPI 以太网显示LCD调试等
    发表于 11-08 09:12

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

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

    嵌入式系统的数据存储和管理的相关资料分享

    【功能】: 嵌入式系统的数据存储和管理 数据查询【定义】:嵌入式数据库系统是指支持移动计算或某种特定计算模式的数据库管理系统,它通常与操作系统和具体应用集成在一起,运行在智能型
    发表于 12-17 07:15

    如何调试嵌入式代码?

    、CMSIS-DAP 等硬件调试器在嵌入式开发调试过程扮演了怎样的角色呢?目标芯片内部是如何处理Debug and Trace 信号的?我们如何借助VS Code Cortex-Debug 或IDE 实现可视化
    发表于 12-17 06:32

    嵌入式硬件系统与存储体系

    慕课电子科技大学.嵌入式系统.第二章.嵌入式硬件系统(第一部分.嵌入式系统存储体系0 目录2 嵌入式硬件系统(第一部分)2.5
    发表于 12-17 08:08

    嵌入式系统的EEPROM和FRAM是什么

    一定空间用于存储应用代码、非易失性数据和配置信息。EEPROM往往是开发人员最先、最常考虑用于嵌入式系统的存储器件。在嵌入式应用,这类非易
    发表于 12-22 07:33

    嵌入式平台中参数的思考与设计相关资料下载

    的部分。在上层应用可以使用基于文件的ini、json、xml等参数功能接口,非常灵活方便。可在嵌入式环境,由于资源的限制无法使用这些功能接口,需要另行设计,是一项有挑战的任务。
    发表于 12-23 06:05

    何处理存储在非易失性设备的内存数据集损坏

    保护您的嵌入式软件免受内存损坏本文的目的是提供一种软件方法,解释如何处理存储在非易失性设备(如小型 EEPROM 或闪存)的内存数据集损坏。在微型
    发表于 12-24 07:27