首页 > 编程语言 >mcu程序中的存储模块

mcu程序中的存储模块

时间:2024-10-31 13:08:51浏览次数:1  
标签:const 程序 Param 存储模块 num param1 mcu buf size

硬件知识

基于成本与需求的考虑,铁电已经很少使用,最常用的是eeprom与flash
eeprom 相对于 flash的优势是 寿命长(100万次 1万次),且可以按字节操作
所以一般嵌入式系统中 eeprom存储运行时参数(掉电需保存的参数或者频繁需要修改的数据),flash存储写次数较少但数据量较大的数据(日志或者记录)

软件方面

分析

  • linux读写的系统调用
size_t write(int fildes,const void *buf,size_t nbytes);
size_t read(int fildes,void *buf,size_t nbytes);
  • mcu驱动层提供的函数形式大致如下
xxx_read(uint8_t* const buf, size_t addr, size_t len);
xxx_write(const uint8_t* buf, size_t addr, size_t len);

对比可以看出,linux操作系统里的文件系统通过文件句柄对接了应用层和底层,应用层并不关心实际的某个"文件"的实际存储地址和存储方式,这部分工作由内核文件系统处理
可以按照这样的思路设计简单的存储系统(不考虑运行中增加参数的需求,也不考虑多进程多线程的继承关系和锁的设计)

简单设计

  1. 分配参数的地址

#define LEN_param1 2
#define LEN_param2 5

#define ADDR_param1 0
#define ADDR_param2 (ADDR_param1 + LEN_param1)

  1. 利用enum自增的机制与数组索引配合
enum
{
	param1,
	param2,
	param_num,
} E_PARAM
//限制作用域,存储在rom中
static const struct
{
	size_t addr;
	size_t len;
} Param[param_num] = 
{
	{ADDR_param1, LEN_param1},
	{ADDR_param2, LEN_param2},
}
  1. 封装
//这是比较简单的表现形式
read_param(E_PARAM num,uint8_t* const buf)
{
	//......
	xxx_read(buf,Param[num].addr, Param[num].len);
	//......
}
write_param(E_PARAM num,const uint8_t* buf)
{
	//......
	xxx_write(buf,Param[num].addr, Param[num].len);
	//......
}

优化

  1. 对于结构体成员的读写
    一组相关的数据最好用结构体组织
//用来计算结构体成员相较于结构体起始地址的偏移量
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

typedef struct __attribute__((packed))
{
	uint8_t hight;
	uint8_t weight;
	uint32_t birthday;
} person_t;

person_t person1 = {170,70,20001119};
xxx_write(buf,Param[num].addr+offsetof(person_t,birthday),sizeof(person1.birthday));
  1. 对于一些特殊的数据
    • 重要的数据:双备份,crc校验,可以用查表法减少计算量
    • 读写次数巨多的数据还要考虑磨损均衡,防止被写坏
    • 频繁写偶尔读的数据,可以模拟cache,写n次写内存,读的时候再固化到存储器中
  2. 性能上的优化
    • 模拟pc删除文件的过程,建立索引,删除只清索引,提高系统响应表现
    • 写长数据时可以按扇区或者块写(数据手册提供)
    • 考虑存储器的特性,划分数据地址的的时候注意跨页
    • 一些掉电需要存储的数据注意电容给的电压与时间够不够某些极限场景下的要求

标签:const,程序,Param,存储模块,num,param1,mcu,buf,size
From: https://www.cnblogs.com/gxjbky/p/18517514

相关文章

  • 安全见闻(2)web程序基本构成(B站 泷羽sec
    什么是软件程序代码软件程序是一种计算机程序,用于计算机计算和其它可编程设备。其实就是我们常说的代码,不论是什么软件程序都是由代码组成的,以后我们会见到很多类型的软件程序,比如网页设计,网站开发,软件开发,软件工程,其实本质上都是代码,不需要去刻意区分;以后很多的专业名词......
  • 基于node.js+vue基于Android的中学生成绩管理系统前(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于中学生成绩管理系统的研究,现有研究主要以传统的桌面应用或网页端应用为主,专门针对Android平台的中学生成绩管理系统的研究较少。在国内外,教育信息化......
  • 基于node.js+vue基于Android平台的上门诊疗app前(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着移动互联网技术的飞速发展,智能手机在人们生活中的普及程度越来越高。在医疗领域,利用移动平台改善医疗服务的需求日益增长。关于医疗服务的信息化研......
  • 微信小程序 video 组件高度自适应实现
    偶然发现微信小程序的video无法像Image对象那样设置mode='widthFix'实现宽度100%高度自适应尝试了各种网上的方案都不可行。要实现高度自适应需要2个条件:知道视频的真实宽,高设置css的aspect-ratio与height在小程序内上传视频调用wx.chooseMedia获取视频......
  • 【java】java的基本程序设计结构03-char&&boolean
    char类型代表字符--符号---几何图形大小由编码类型决定。char是基本类型,但String不是。String是Java中的一个类,属于引用类型;char中只能放一个字符。        chara=‘a’;//任意单个字符,加单引号。        chara=‘中’;//任意单个中文字,加单引号 ......
  • 游戏陪玩系统线上线下陪玩系统源码交付支持二开陪玩系统可打包APP小程序H5
    关于游戏陪玩系统,特别是线上线下陪玩系统源码交付并支持二次开发(二开)的方面,以下是一些关键信息和说明:一、游戏陪玩系统概述游戏陪玩系统是一种为游戏玩家提供线上线下陪玩服务的平台。它结合了游戏文化与社交元素,为玩家提供了个性化、专业化的游戏陪伴体验。这种系统不仅满足......
  • 婚介管理系统源码交友软件代码交友平台源码婚恋交友系统社交源码相亲交友小程序源码
    关于婚介管理系统、交友软件、相亲交友小程序等源码,这些通常涉及多个技术领域和复杂的开发过程。以下是根据当前可获得的信息,整理出的一些相关源码和开发建议:一、婚介管理系统源码技术栈:后端:Python(Django、Flask等框架)、Java(SpringBoot等框架)前端:Vue.js、React.js、Angula......
  • 织梦 DedeCMS 自定义表单出现“数据校验证不对,程序返回”的解决方案
    问题:自定义表单提交时提示“数据校验不对,程序返回”。解决方法:找到新的 dede_fieldshash 值:打开后台-核心-频道模型-自定义表单。找到设置好的自定义表单,点击“前台预览”。如果提示前台预览关闭,点击“修改”,将“前台列表和内容也公开”选项勾选为“完全公开”......
  • springboot影院购票小程序-计算机毕业设计源码08726
    摘要随着互联网的普及以及发展,在网上出售、购买东西变得越来越日常,出于对社会发展的考虑,在很多社会上都实现了各式各样的影院购票小程序,提高了社会资源的利用效率。然而,搭建大部分的网站所需要花费的人力和财力普遍较高,部署高能硬件也是一道坎,使得大部分影院购票小程序都没有......
  • NodeJS实现咖啡点餐小程序-计算机毕业设计源码09149
     目 录摘要1绪论1.1研究背景1.2 研究意义1.3研究方法1.4论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4用例分析2.5本章小结3 系统总体设计3......