SD卡IO

这一年在做公司的项目,从软件工程师华丽便身为嵌入式工程师=0=。项目有个需求需要将编码好的h264数据和aac数据合成mp4写到SD卡中。
使用mpv2很快的搞定了,但是仔细看,发现合成的SD卡每隔一段时间就会卡一次。一开始以为是时间戳问题,dump了所有数据的时间戳,感觉一切OK啊。再仔细看,卡一下是丢了几帧,但是将h264数据通过网络直播出去却不回卡顿,于是察觉是写SD卡数据问题。但是总觉的不合理,因为买的是告诉SD卡,几十M的读写速度啊!
后来将编码的数据按照时间戳排好放到缓冲区里面,一个线程专门写数据,也就是采用了生产者-消费者模型,彻底解决了卡顿的问题。

吐槽:嵌入式果然出处是坑啊,这种bug完全就是经验问题嘛

过了一段时间,我们牛逼的测试组竟然发现写完MP4立刻拔出SD卡,MP4是损坏的!必须等待几秒到几十秒后,拔出SD卡,MP4才没有问题。当时我就想到了内核I/O缓冲区没有写到SD卡中,拔出SD卡导致数据丢失,然后通过特别暴力的方法mount -o remount解决这个问题。后来寻找更优雅的解决方案,发现可以使用sync内核调用,将内核I/O写到磁盘。记得在看UNIX环境高级编程的时候,讲到了sync、fsync这些函数,当时作为上层开发人员一笑而至:谁会用这些鸟函数啊。没想到确栽在这里了。

吐槽:任何细小的只是都是有用的。

你可能感兴趣的:(SD卡IO)