安全存储和访问 EEPROM

2024-03-02

我最近发现需要将不经常更新的配置变量存储在微控制器的 EEPROM 中。向程序添加状态会立即让人担心

  • 检测 EEPROM 中未初始化的数据(即首次启动),
  • 转换旧固件版本的数据或使其无效,以及
  • 多个结构的寻址,每个结构都可能在固件更新中增长。

广泛的谷歌搜索只找到了一篇文章来解决通过固件更新保持 EEPROM 数据有效 http://embeddedgurus.com/stack-overflow/2009/11/keeping-your-eeprom-data-valid-through-firmware-updates/。有人使用过那篇文章中讨论的方法吗?有更好的替代方法吗?


就我个人而言,我更喜欢“标记表”格式。

在这种格式中,您的数据被分成一系列“表”。每个表格都有一个遵循可预测格式的标题和一个可以根据需要更改的正文。

以下是其中一张表的示例:

Byte 0: Table Length   (in 16-bit words)
Byte 1: Table ID       (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum       (simple sum-to-zero checksum)
Byte 4: Start of body
...
Byte N: End of body

我没有存储大量数据,因此我为标头中的每个字段使用一个字节。您可以使用任何您需要的尺寸,只要您不改变它即可。数据表被依次写入EEPROM中。

当您的固件需要从 EEPROM 中读取数据时,它会从第一个表开始读取。如果固件识别表 ID 并支持列出的表版本,则会从表主体中加载数据(当然,在验证校验和之后)。如果 ID、版本或校验和未签出,则直接跳过该表。长度字段用于定位链中的下一个表。当固件看到长度为零的表时,它知道它已到达数据末尾,并且没有更多的表需要处理。

我发现这种格式灵活(我可以将任何类型的数据添加到表主体中)并且强大(保持标头格式不变,并且数据表将向前和向后兼容)。

有一些警告,尽管它们并不是太繁重。首先,您需要确保您的固件可以处理重要数据不在表中或使用不受支持的格式版本的情况。您还需要将 EEPROM 存储区域的第一个字节初始化为零(这样在第一次启动时,您就不会开始加载垃圾并认为它是数据)。由于每个表都知道其长度,因此可以扩展或缩小表;但是,您必须移动表存储区域的其余部分,以确保没有“漏洞”(如果整个表链无法放入您的设备内存中,那么此过程可能会很烦人)。就我个人而言,我认为这些都不是大问题,而且使用其他一些数据存储方法省去的麻烦是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全存储和访问 EEPROM 的相关文章

  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 如何使用Task.WhenAny并实现重试

    我有一个创建多个基于 I O 的任务的解决方案 我正在使用Task WhenAny 来管理这些任务 但通常许多任务会由于网络问题或请求限制等原因而失败 我似乎找不到一个解决方案 使我能够在使用时成功重试失败的任务Task WhenAny 方
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 在 C++ 中,严格别名规则中的“访问”是什么意思?

    3 10 10 说 如果一个程序试图access通过除以下类型之一之外的泛左值存储对象的值 行为未定义 然而 术语 访问 并没有在任何地方定义 在这种情况下这意味着read or 读取或修改 在 C 标准中 它被明确定义为读取或修改 然而在
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 如何使用包含的转换的排名来比较两个标准转换序列

    include
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • 为 git log 这样的两个字命令创建别名?

    有时我有两个词的命令 例如git log or apt get install我想添加一个默认参数 例如 大多数时候我想添加 abbrev commit参数给我的git log 以及 y参数为apt get install git log
  • 如何动态地将 标签附加到

    标签的特定位置?

    本质上 我正在尝试实现一个在选择时突出显示某些文本的功能 这仅适用于 Google Chrome 浏览器 例如 选型前 p sample text p 从 示例文本 中选择 文本 后 p sample span class state hi
  • oozie Sqoop 操作无法将数据导入到 hive

    我在执行 oozie sqoop 操作时遇到问题 在日志中我可以看到 sqoop 能够将数据导入到临时目录 然后 sqoop 创建 hive 脚本来导入数据 将临时数据导入配置单元时失败 在日志中我没有收到任何异常 下面是我正在使用的 sq
  • MVC 路由捕获文件名作为参数

    我正在尝试使用 MVC 生成一个简单的 WebDAV 服务器 并且我终于达到了需要向用户提供请求的文件的阶段 我设置了一条用于遍历目录结构的路线 webdav path 工作正常 直到该路径以文件名结束为止 此时 IIS 似乎确定它是静态文
  • 带有 php 和 ssl 的本地主机服务器

    我正在寻找允许使用 ssl 启动 php 文件的服务器 我尝试过例如 python 简单服务器 import BaseHTTPServer SimpleHTTPServer import ssl httpd BaseHTTPServer H
  • 如何在Python中创建随机的圆数组而不重叠?

    我想知道如何在Python中创建一些不重叠的圆圈 Let me share a part of my script 在第 55 56 和 57 行中 我打印了坐标 见证了重叠 在每个 for 语句中 我认为我避免了重叠执行诸如二分法 求根方
  • Git - 如何在 Windows 上使用 .netrc 文件保存用户和密码

    当我使用 Git 通过 HTTP 和用户密码克隆远程存储库时 是否可以在 Windows 上使用 netrc 文件 是否可以使用 netrcWindows 上的文件 是的 您必须 定义环境变量 HOME Git 2 0 之前的版本 Git
  • Windows批处理脚本url解码

    我有一个批处理脚本可以在我的网络上触发 vlc 问题是它根据浏览器中的 URL 打开 浏览器会自动添加 20 来代替常规空格 在将文件路径发送到 vlc 之前 我需要在批处理脚本中再次将其替换为常规空格 这是我的代码 echo off se
  • 如果Python中用户输入为空,如何定义默认值?

    如果用户从键盘输入值 我必须设置默认值 这是用户可以输入值的代码 input int raw input Enter the inputs Here the value will be assigned to a variable inpu
  • 如何在没有 Kerberos 的情况下启动 Spark 3.0.0 kubernetes 工作负载?

    似乎在 Spark 3 0 0 上 当我使用 kubernetes 进行 Spark 提交时 它需要 kerberos 我使用在 2 4 5 中运行良好的相同 Spark 提交 我收到此错误 Using Spark s default lo
  • 如何在 Perl 中用子函数重写父类函数?

    我想替换子类中的父函数 Somefunc 所以当我调用 Main 过程时它应该失败 在 Perl 中可以吗 Code package Test use strict use warnings sub Main SomeFunc or die
  • 使用nodejs预编译Emberjs Handlebar模板的简单方法?

    我非常喜欢 emberjs 并且希望在我的几个小型移动应用程序中采取下一步 并预编译我的 Ember Handlebars 模板作为我的构建过程的一部分 我宁愿远离 Ruby 而希望使用 node js 因为我更喜欢使用它 我相信我想使用的
  • TFS 2013(更新 2)团队警报不发送电子邮件

    我关注了讨论here https stackoverflow com questions 14566315 tfs 2012 team alerts not sending emails我也有类似的案例就在我将 Update 2 应用到 T
  • 如果未获取唤醒锁并且设备进入睡眠状态,具体哪些功能会停止工作?

    在过去的几天里 我一直试图找出当设备在没有唤醒锁的情况下进入睡眠状态时 服务 后台和前台 中的哪些功能停止工作 所有文档都只说唤醒锁 防止 CPU 关闭 但如果我关闭屏幕并拔掉设备插头 我测试过的每一项功能都可以在没有唤醒锁的情况下继续工作
  • 无法确定 Electron 版本。请指定 Electron 版本

    我试图创建可执行文件electron app但面临这个问题 无法确定 Electron 版本 请指定 Electron 版本 虽然我有electron全球安装在我的机器上 但仍然给我错误 Install electron as dev de
  • 如何将 UPC-A 转换为 UPC-E?

    我们想要将 12 位 UPC A 转换为 8 位 UPC E 您能告诉我哪种方法是最好的方法 而无需使用我自己的代码进行转换 我有很多将 8 位 UCC E 转换为 12 位 UPC A 的公式 但不能反转 从以下模式映射可以最清楚地看出在
  • 捕获错误:损坏的 JPEG 数据:数据段过早结束

    当使用损坏 不完整的 JPEG 数据创建 UIImage 时 控制台将打印出
  • 带有向下钻取/可点击饼图部分的 jquery 饼图

    我正在寻找一个 JQuery 插件来制作饼图 我可以根据饼图楔形的值单击其楔形或切片以转到另一个页面 我有一个饼图 其中包含班级成绩 A F 如果有人点击 A 楔形 我想重定向到显示 A 学生的页面 我用 jQuery 并打开 flash
  • Python从列表中删除特定的重复项

    我想从列表中删除特定的重复项 使用 Perl 我将使用以下代码完成任务 my list a1 a1 b1 b1 my seen list grep a d seen list 想要的结果是这样的 list a1 b1 b1 我如何在 Pyt
  • 安全存储和访问 EEPROM

    我最近发现需要将不经常更新的配置变量存储在微控制器的 EEPROM 中 向程序添加状态会立即让人担心 检测 EEPROM 中未初始化的数据 即首次启动 转换旧固件版本的数据或使其无效 以及 多个结构的寻址 每个结构都可能在固件更新中增长 广