一场由SD卡引发的灾难
 
注:此文章转自“https://user.qzone.qq.com/63915185/blog/1512562541”。
 
Flash里面的数据在使用过程中莫名改变或不翼而飞?程序丢失可能无法正常运行,从而造成整个系统崩溃。Flash,说好的数据去哪了?

今天,笔者要为大家分享一个由SD引发的灾难,以及该灾难被我们项目组攻克的技术案例。

去年上半年,我们公司承接了某大型广告公司的电梯广告显示屏的项目,该产品使用了飞思卡尔的IMX6系列芯片作为主控CPU,具备媒体人机触摸互动、媒体投放、远程升级、录像监控等功能。其中很重要的一项功能就是监控和保存功能,因客户的报价较低,我们理所当然的选择了SD卡作为录像数据的保存介质。

没想到,灾难半年后就降临了,半年前发货的10K机器,每个月都有10%的损坏率,损坏的机器90%都是SD卡损坏了!关键的监控视频信息全部丢失,客户不但要求我们赔偿SD卡的损失,延长质保期,而且威胁一个月内不解决将终止合作,客户是老板的唯一大客户,丢失这个客户我们离解散就不远。老板甚至放下狠话:一个月内不解决,你们跳槽,我跳楼。

项目组首先从客户的使用的电梯的场景入手,场景的特点如下:

1、电梯内部布满各种通信线、音视频线、电力线,互相之间的干扰非常严重

2、电梯内的广告机每天晚上12点至早上6点回自动断电,白天自动上电

3、广告机只要开机就需要一直录像,保存到本地的SD卡中。

于是我们首先模拟现场的应用场景,第一个场景公司内部无法模拟,于是先模拟第二和第三个场景,事设备上电10分钟,掉电5分钟,只要一上电就开始录像,提高上下电的频率。样本数量使用了50台。

实验第一天,SD卡损坏0张;

实验第二天,SD卡损坏1张;

实验第三天SD卡损坏3张,一直到实验到第6天,SD卡一共损坏8张。

我们基本找到SD卡损坏的原因:就是设备上下电导致的。于是大家分头行动,从硬件和软件、驱动着手,分析掉电可能引起的原因。

首先是驱动工程师查阅MMC的规范“JESD84-B45”时有发现,如下图1所示

图1 :JESD84-B45规范中掉电的要求。

文中大概的意思就是,主机在掉电关闭设备前,应该通知SD卡控制,由控制判断掉电的紧迫性,从而进入对本身设备的保护模式,并且在这之前,应该保持设备的电源处于工作范围之内。

继续查阅SD卡2.0规范中,SD卡的标准只保证在读数据过程中,意外断电和移除可以对数据进行保护,对写和擦除过程中的掉电的,完全没有把握保护数据,也就是SD卡内部的本身固件、用户数据都是有可能丢失的。

图2:SD 2.0标准中对SD卡的保护阐述

通过查阅相关的规范,我们知道了原因的所在,就是我们的设备在断电的时候,还在录像保存数据,进行不断的写和擦除SD卡的操作。

经过讨论,我们采用了如下的方案。.其中,方案的核心主要有3个

第一:掉电检测电路;

第二:超级电容继续供电电路

第三:掉电后软件处理机制。

图3:SD卡掉电保护的处理过程

下图4是掉电检测电路,可以精准的检测一旦电压跌落至10V(电源为12V供电),马上送掉电信号给CPU。

图4:掉电检测电路

下图5是超级电容的充放电电路,增加该电路可以使掉电后继续维持2秒钟的时间,使CPU完成掉电后的保护处理工作。

图5:超级电容充放电电路

经过了上述的整改,我们生产了50台设备,进行连续7天24小时,10分钟一个循环的上下电测试,没有一台设备的SD卡损坏,证明了上述方案可行。老板的楼,终于不用跳了。

经验总结,其实CPU原厂提供的DEMO参考设计,基本都是处在能用的状态,离真正的高可靠应用,还有很大的距离,需要我们工程人员的不断挖掘和积累。才能设计出高可靠性的产品。

创易栈小编点评:

上述案例Flash的损坏是供电系统不稳定造成,电源电压的异常可能会导致系统单片机系统工作异常的现象,如输出电压小于单片机系统工作所需的最小电压,输出电压不干净,噪音严重等,这些很容易引起单片机内部电路的逻辑紊乱。

Flash的读写信号处于不稳定状态,可能产生满足Flash的写操作,从而给系统带来严重的损害。针对以上情况,可以在系统中加入电源监控芯片或使能MCU本身的电源监控电路,在电源异常的情况下禁止对Flash区域操作。

除了电源失效,会造成Flash损坏的常见原因还有以下几种:

1、用户代码对Flash的误操作不当引起程序丢失或被错误改写

例如,在有对Flash写入或擦除操作的代码中,如果用户误调用了写入或擦除函数或者由于程序跑飞而恰好执行了Flash擦除或写入函数,这自然会导致数据丢失或改变。

针对以上情况,可以在程序中设置多个允许操作的变量,当执行写入或擦除操作时,对这些变量进行判断,只有条件全部满足时,才执行相应的操作。

在一些不需要进行擦除或写入操作的系统中,对存储区进行写保护或擦除保护设置,能有效的防止数据被意外修改。做到了写入或擦除的可控性,基本可以避免此种情况发生。

2、系统时钟不稳定

无论对于内部Flash还是外部Flash,系统时钟的不稳定,都将导致MCU得不到可靠的工作时序信号,从而在读写Flash时产生不可预料的后果。

3、环境干扰

环境干扰的可能原因很多,如生产过程中的高温焊接、静电、使用环境的温湿度,强磁场等,都可能影响到Flash或整个系统的稳定。环境干扰的因素很多,在此不展开讨论。

(笔记)一场由SD卡引发的灾难的更多相关文章

  1. 一场由SD卡引发的灾难_转

      注:此文章转自“https://user.qzone.qq.com/63915185/blog/1512562541”.   Flash里面的数据在使用过程中莫名改变或不翼而飞?程序丢失可能无法正 ...

  2. Android(java)学习笔记183:判断SD卡状态和存储空间大小

    当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String status = Environment.g ...

  3. Android(java)学习笔记126:判断SD卡状态和SD卡容量

    1. 判断SD卡状态和SD卡存储空间大小 当我们在使用SD卡时候,如果我们想往SD卡里读写数据,我们必须在这之前进行一个逻辑判断,那就是判断SD卡状态和SD存储空间大小: 核心代码: String s ...

  4. [笔记]SD卡相关资料

    ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...

  5. Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

    /*********************************************************************************** * * linux 3.5,U ...

  6. android学习笔记47——读写SD卡上的文件

    读写SD卡上的文件 通过Context的openFileInput.openFileOutput来打开文件输入流.输出流时,程序打开的都是应用程序的数据文件夹里的文件,其存储的文件大小可能都比较有限- ...

  7. Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab

    ================================================================================Ye.完美切换内部存储卡和SD卡成功.v ...

  8. Android(java)学习笔记182:保存数据到SD卡 (附加:保存数据到内存)

    1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...

  9. CubieTruck使用笔记--SD卡中使用lubuntu

    http://docs.cubieboard.org/tutorials/ct1/installation/install_lubuntu_desktop_server_to_sd_card 按照上面 ...

随机推荐

  1. [ZOJ1482]Partitions

    [ZOJ1482]Partitions 题目大意: 给定一个\(n\times n(n\le3000)\)的\(\texttt 0/\texttt1\)矩阵,求去掉所有的\(1\)以后,矩阵被分成几个 ...

  2. 元素 "context:component-scan" 的前缀 "context" 未绑定。

    是因为没有导入context的命名空间

  3. token和盐

    // 盐,加密后密码获取    Map<String, String> map = new HashMap<String, String>();    map.put(&quo ...

  4. redis的主从服务器配置

    1. redis的主从配置: (1)把redis的配置文件(reids.conf)拷贝2份 [root@192 redis]# cp redis.conf redis6380.conf [root@1 ...

  5. vue要点记录(待更新)

    Vue实例 每个 Vue 实例都会代理其 data 对象里所有的属性:vm.a===data.a //true 注意只有这些被代理的属性是响应的. 如果在实例创建之后添加新的属性到实例上,它不会触发视 ...

  6. 关于实现udev/mdev自动挂载与卸载

    在网上有很多关于讲mdev的自动挂载基本上都是一个版本,经过测试自动挂载确实可行,但是关于自动卸载mdev似乎不能很好的支持,经过修改已经可以做到与udev的效果相似.不能在挂载的目录中进行热插拔,否 ...

  7. GMA Round 1 最大值

    传送门 最大值 求$f(x)=cos(x)+\sqrt{cos^2(x)-4\sqrt{3}cos(x)+4\sqrt{2}sin(x)+10}$的最大值.保留到小数点后3位. $f(x)+\sqrt ...

  8. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  9. 更新 app 操作过期提示

    增加的操作过期提示,再让用户选择是否登录,登录成功后自动返回上一次操作的面页

  10. Unity中调用DLL库

    DLL -- Dynamic Link Library(动态链接库文件),这里以Window平台为例. Unity支持的两种语言生成的DLL库(C++.C#),这里以C#为例,C++网上可以搜索很详细 ...