往写SD卡写数据, 调用sync()之后被阻塞!

briertang 2014-09-11 04:46:45
各位大侠,
我在做一个项目,往SD卡上写录像文件, SD卡是透过USB转SD扩展而来, 数据量大概是5Mbit/s左右 但是在写之后需要及时的同步到SD卡上去.因此,在写之后每间隔500ms进行一个sync()的动作,现在的问题是有时在做sync()之后,程序阻塞了很长一段时间,导致中间丢失数据!,同步的时间间隔有做调整,但是都可能被阻塞住!
请问各位大侠, 这可能是什么原因引起的?!有没有可能是系统的bug或者是底层驱动问题
...全文
808 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Heaven_Redsky 2014-10-30
  • 打赏
  • 举报
回复
sync和write在一个线程里,sync的时候,write不是一样写不了东西吗?
briertang 2014-10-27
  • 打赏
  • 举报
回复
引用 5 楼 Heaven_Redsky 的回复:
这个问题我是这么看的哈。你在缓存里写了很多数据,在做sync的时候,你的程序把这段时间间隔的数据写到SD卡里。相对比直接写缓存,这是一个超级慢的操作。而sync在写SD卡的这段时间,写缓存的程序可能就被挂住了。 那么我想是不是可以这么做,你把你的缓存分成若干个,数量你自己把握,组成一个环形缓冲区也行。然后写缓存的数据就只管一个个的往缓冲区里头写,写完了把这个缓冲区给做个标记,而sync的任务呢,一旦发现有准备好的缓冲区,就也一个个的把准备好的缓冲区数据写到SD卡里头去。 可以做成多任务,sync是一直监控或者各一段时间扫描一次都行。这样试试看行不行。
现在就是这么做的, sync和write是在同一个线程里面做的,如果分两个线程,sync阻塞之后,会把write()的那个线程给阻塞住!
briertang 2014-10-27
  • 打赏
  • 举报
回复
引用 6 楼 xuweiwei1860 的回复:
可以测下速 看看写入时间 3.0.X的是有bug无法跑到hs模式的 低于25M的速度的 再有可能就是读写的dma模式试试看吧
内核是2.6.24的, 内核部分由于是SOC的芯片,所以内核部分无法升级! SD卡是透过一个USB->SD的芯片接到系统的,您所讲的DMA模式能不能讲的详细点,该如何实现?
fly 100% 2014-10-17
  • 打赏
  • 举报
回复
可以测下速 看看写入时间 3.0.X的是有bug无法跑到hs模式的 低于25M的速度的 再有可能就是读写的dma模式试试看吧
Heaven_Redsky 2014-10-16
  • 打赏
  • 举报
回复
这个问题我是这么看的哈。你在缓存里写了很多数据,在做sync的时候,你的程序把这段时间间隔的数据写到SD卡里。相对比直接写缓存,这是一个超级慢的操作。而sync在写SD卡的这段时间,写缓存的程序可能就被挂住了。 那么我想是不是可以这么做,你把你的缓存分成若干个,数量你自己把握,组成一个环形缓冲区也行。然后写缓存的数据就只管一个个的往缓冲区里头写,写完了把这个缓冲区给做个标记,而sync的任务呢,一旦发现有准备好的缓冲区,就也一个个的把准备好的缓冲区数据写到SD卡里头去。 可以做成多任务,sync是一直监控或者各一段时间扫描一次都行。这样试试看行不行。
Heaven_Redsky 2014-10-15
  • 打赏
  • 举报
回复
“在写之后需要及时的同步到SD卡上去” 这里的写 是往哪写?
briertang 2014-10-15
  • 打赏
  • 举报
回复
引用 3 楼 Heaven_Redsky 的回复:
“在写之后需要及时的同步到SD卡上去” 这里的写 是往哪写?
写是指, 调用write接口写入到缓存中...之后调用sync同步到SD里面...
briertang 2014-10-14
  • 打赏
  • 举报
回复
引用 1 楼 kklaa 的回复:
起一个新线程专门sync()
,kklaa,我现在做Sync的线程也没有做什么其他事情,新起一个线程会有帮助吗?!
kklga 2014-09-14
  • 打赏
  • 举报
回复
起一个新线程专门sync()

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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