我们的产品是基于linux的,设备非正常掉电后,修改的数据不会被保存,请问怎么办?

犇犇犇程序猿 2011-02-11 09:58:29
我是买的开发板做的产品,用yaffs文件系统,ramdisk是内存文件系统,可能是运行过程中内存中修改的数据没有直接存储起来,直接掉电后,内存中修改的数据丢失了。而reboot这样的重启指令是可以保存数据的,请问有什么办法能够直接每次修改数据都保存起来。而不会照成数据丢失。
...全文
495 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yong_f 2011-02-21
  • 打赏
  • 举报
回复
我用的就是Sqlite3没有发现你的这样问题,文件系统和你提供也相同。
犇犇犇程序猿 2011-02-21
  • 打赏
  • 举报
回复
不好意思最近比较忙没有看回帖:

TO 10楼:事实是我每次写数据都关闭了sqlite3,但是依然不行,

TO 12楼:我们做的是无线网络优化监控设备,一次就上几百上千套,当然是无人值守的。但是掉电情况是很有可能发生的,例如小区停电什么的。linux当掉,除非自己程序弄的(例如无限fork),否则我做这么久都没有见过。

TO 13楼:我现在的想法是在服务器做同步,这样会比较好。
犇犇犇程序猿 2011-02-21
  • 打赏
  • 举报
回复
TO 15: 哪可能是采购的核心板的问题了,呵呵!
chenbin200818 2011-02-18
  • 打赏
  • 举报
回复
首先 存储应选用yaffs系统

其次,修改数据后应立即写回硬盘,sync 或者 flush
幽饮烛 2011-02-13
  • 打赏
  • 举报
回复
要赚钱,没有 UPS 怎么行呢?

直接断电?谁那么清闲去拔电源。。。。

非人为断电?重要的机器都会用 UPS
fzc115100 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 leeyiqun 的回复:]
应该掉电是随机性的,系统不知道一下子就当掉了,而运行reboot命令是已经告知了系统要重启,让系统可以先进行一些必要的工作。比如保存ramdisk的数据到flash上。
对于掉电,可以
1. 程序上可以每隔一段时间把需要备份的数据保存到flash上,这种方案好处是不用增加成本,缺点是最后一次成功备份后,后面更新的数据会丢失。
2. 还可以在硬件上加一个小电池,当开发板断电后,可以利用小电池短……
[/Quote]

貌似可行~~
犇犇犇程序猿 2011-02-11
  • 打赏
  • 举报
回复
sqlite3 数据库。
linsen_519 2011-02-11
  • 打赏
  • 举报
回复
数据存在哪里啊?数据库?文件?
犇犇犇程序猿 2011-02-11
  • 打赏
  • 举报
回复
yaffs基于flash的文件系统,按道理应该是直接操作在flash上的,应该是及时修改的。
犇犇犇程序猿 2011-02-11
  • 打赏
  • 举报
回复
查了很多资料没有遇到过类似的问题。很奇怪。用的是yaffs文件系统,不是ramdisk.
linsen_519 2011-02-11
  • 打赏
  • 举报
回复
sqlite3 数据库我不了解,可就你这问题来看,一定是事务没有处理好。
数据库事务的开始是第一个DML语句的执行
数据库事务的结束是遇到以下事务之一
1.执行commit或rollback
2.执行一条DEL或DDL语句(自动commit)
3.正常退出数据库
4.数据库系统关闭
每次正常关机前,数据库肯定要现正常退出。所以事务肯定处理完毕,数据保存了。
而断电会导致期间的数据全部丢失,肯定是由于始终没有结束事务导致的(也期间的动作始终没有commit)
leeyiqun 2011-02-11
  • 打赏
  • 举报
回复
应该掉电是随机性的,系统不知道一下子就当掉了,而运行reboot命令是已经告知了系统要重启,让系统可以先进行一些必要的工作。比如保存ramdisk的数据到flash上。
对于掉电,可以
1. 程序上可以每隔一段时间把需要备份的数据保存到flash上,这种方案好处是不用增加成本,缺点是最后一次成功备份后,后面更新的数据会丢失。
2. 还可以在硬件上加一个小电池,当开发板断电后,可以利用小电池短暂的电源供应维持系统运行到数据备份成功。这种会增加成本。
l2y3n2 2011-02-11
  • 打赏
  • 举报
回复
sync,强制同步文件系统
bluesky12312388 2011-02-11
  • 打赏
  • 举报
回复
不清楚!
犇犇犇程序猿 2011-02-11
  • 打赏
  • 举报
回复
坐等有同样经历的呵呵。不行就换核心板了。
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机科学领域,编译原理是研究如何将编程语言转化为机器可执行代码的理论基础。其中,三地址代码(Three-Address Code,TAC)作为一种中间表示形式,在编译器设计中经常被使用,尤其是在生成目标代码的阶段。本文将深入探讨三地址代码的概念、生成器的工作原理及其在编译过程中的作用。 三地址代码是一种简单的低级抽象语法树(AST)表示,每条指令涉及三个操作数,通常包括两个源操作数和一个目的操作数。这种格式简化了代码优化和目标代码生成的复杂性。例如,一个简单的算术表达式“x = y + z”在三地址代码中可能表示为: 在这个例子中,“t1”是一个临时变量,存储了“y + z”的结果,然后这个结果被赋值给“x”。 生成三地址代码的过程通常发生在编译器的中间阶段,即语法分析之后,语义分析之前。这个阶段称为“代码生成”或“中间代码生成”。编译器通过词法分析器处理源代码,将其转化为标记流;接着,语法分析器根据上下文无关文法将标记流解析成抽象语法树。三地址代码生成器就是在这个阶段介入,它遍历AST,为每个节点生成对应的三地址指令。 在Turbo C3.0这样的编译器环境下,开发者可以实现自己的三地址代码生成器。虽然Turbo C3.0是一款较老的编译器,但其C语言编译器设计原理依然适用于现代编译器开发。开发过程中,我们需要考虑如下关键点: 符号表管理:符号表记录了程序中所有标识符的类型、作用域和关联地址,对于生成三地址代码至关重要,因为它提供了关于操作数的类型信息。 数据类型转换:编译器必须处理不同数据类型的运算,确保它们在三地址代码中正确表示。例如,整型与浮点型之间的转换需要特别处理。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧