Chinaunix

标题: 嵌入式sd卡只读解决办法 [打印本页]

作者: sss0213    时间: 2009-03-31 14:22
标题: 嵌入式sd卡只读解决办法

LINUX环境下使用C语言能够实现原子操作吗?
   

   

[无满意答案结帖,结帖人:kingboy1982]

  
  
   
        

加为好友
发送私信
在线聊天
   
        
  
  
  
  发表于:2009-02-08 23:29:18 楼主
  在我做的一个项目中,需要对音视频数据进行转码(fork一个子进程excel一个程序来将音频数据和视频数据转换为ASF格式文件)和存盘(写
  
入SD卡),这里偶尔会出现SD卡变成只读导致数据无法写入的情况。为解决只读的问题,我在这个地方将只读的情况(多个相关标志位)写入
  
一个文件,重启后备份数据格式化只读分区的方法来保证原有数据不会丢失。
  
但是压力测试情况下在这个地方,程序偶尔会被Killed,如果刚好出现了只读现象,我那个只读标记处理函数往往是执行了一部分系统就重启了
  
,结果导致写入文件的标记位不一致,开机处理后数据会丢失。
  
最主要是要能解决那个Killed的问题就好了,通过GDB调试,分析生成的Core文件也始终无法查找到Killed的原因,现在就是想能不能通过原子
  
操作的办法来规避这个问题:那个只读标记处理函数要么完全执行完毕,要么完全不执行,最后是能够完全执行,那我那些数据就不会丢失了
  

  
  
使用的操作系统是LINUX,CPU为ARM9,编程语言为C语言。希望哪位高人能够指点一下,小生不胜感激!
  
另外我想请教一个问题是:SD卡在什么情况下会变成只读?正常读写情况下会发生只读现象吗?只读是因为程序中存在非法操作还是SD卡本身的硬件质量问题?
虽然发生的几率比较小,但这个问题困扰我很久了,一直无法根除。我一个朋友说他们也使用SD卡也存在大量的数据读写操作却没有只读现象,难道是因为我们的
应用程序中存在Bug的原因引起的吗?
  
  
  
  问题点数:30 回复次数:5
  显示所有回复显示星级回复显示楼主回复  
修改
删除
举报
引用
回复

   




加为好友
发送私信
在线聊天

   
  发表于:2009-02-14 13:16:251楼 得分:0
  其实你提到的这些问题中, 最critical的还是那个只读问题,被Kill掉也算是个问题, 但你有机制可以work around, 所以事实上没有只读问题严重。原子操作问题是你自己制作出来的, 根本可以避免, 也无法实现, 至少对硬件断电这种情况。
  
关于SD卡的只读问题, 首先, 你是如何断定“出现SD卡变成只读导致数据无法写入”?
也就是说SD卡有没有被umount再mount成只读的可能? 如果没有, 那数据无法写入不是由于只读引起的。 那是由什么引起的吗? 很简单,
打印出errno, 再驱动里跟踪一下应该就知道原因。及时由于硬件问题造成暂时无法写入, 也有很多其他解决方法, 比如放后台任务来做。
  预留的文字链广告位
//-->

修改
删除
举报
引用
回复
  




加为好友
发送私信
在线聊天

   
  发表于:2009-02-14 15:33:002楼 得分:0
  解决被kill掉的问题是治标不治本啊,关键是为何你的SD卡有时候会变成只读状态呢?

  预留的文字链广告位
//-->

修改
删除
举报
引用
回复
  




加为好友
发送私信
在线聊天

   
  发表于:2009-02-14 17:01:083楼 得分:0
  目
前只读的检测方法是往SD卡里写入一个文件,如果写入失败,就认为是只读了。采用了多个分区来备份数据,如果认为本分区只读了,我就设置相关标志位,重启
机器,重启后交换数据分区,将只读分区数据拷贝到另一个分区后格式化只读分区,只要我那个设置标志都正确的话,就不会出现数据丢失的问题,只是在重启前的
那个数据没有写入。现在就是希望能够保证我那个标识位设置没有问题就可以了。
  
在程序整个运行过程中,不会MOUNT和UNMOUNT SD卡,只是在机器启动是加载。
  预留的文字链广告位
//-->

修改
删除
举报
引用
回复
  





加为好友
发送私信
在线聊天

   
  发表于:2009-03-28 00:04:144楼 得分:0
  哈哈, 我终于解决了这个问题,采用了一定的方法来规避这个问题,就是开机时我会去同时检查只读标志位和分区标志位,还有备份分区下是否有数据,用一种很笨但有效的方法解决了这个问题!


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50685/showart_1886170.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2