whenme
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2540回复:19

写硬盘的速度到底有多少?

楼主#
更多 发布于:2002-05-18 02:35
   我做一个pci数据采集卡,每1ms有来自AD的8kByte数据,周期性的。把8kByte数据缓存起来,通过pci总线集中传向计算机内存区,
这需要30us时间。那么剩下970us用来把接受到的计算机内存中的8kByte数据写入硬盘,则硬盘速度须大于8MByte/s,而我的硬盘有20MByte/s的速度,为什么现在总会丢数?一丢就是一个周期。
   1。驱动  WinDriver 5。03
   2。中断方式,中断服务中存盘,中断没有丢。
   3。如果不存盘,那么就不会丢数。
   我想原因会不会是windows下磁盘写不是顺序写,如果是这样的话,磁盘的速度就很低了。另一个方面
   请高手出招。
   my Email: whenme2000@163.com
如果答的好,我舍得给分。

最新喜欢:

chenerchener
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-18 11:56
这个问题可能是因为你在写盘的时候没有进行同步写导致的,你不应该通过提高写盘速度来解决这个问题!
whenme
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-20 20:03
   事实上,我用的是同步写,设置CREATEFILE()参数OVERLAP=NULL;但系统看起来并没有工作在同步方式下.另外用其他函数如WRITEFILE(),也不行.
   如果真是这样,那么如何控制是硬盘写操作立即执行.
   另一个问题是丢数并不是每个周期都丢,也就是说,有时候是同步写,有时候是\"异步写\"了.
yzhgry
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-21 09:33
硬盘不应该这么慢吧
dshuwen
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-21 15:56
改变一下控制方式:
写盘时用DMA方式,这样一来用的不是CPU的资源.
写盘用中断会影响从AD接受数据的.
dshuwen
whenme
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-22 21:51
 DMA方式?好注意,我原以为它本来就工作在DMA方式下.
     1.不知道我的硬盘支持不支持DMA方式,我不知道我的硬盘是什么型号的,标签上没有显示;数据线上显示ATA66;
          2.如果支持,应该怎么设置?
体现在程序上又是怎样体现?
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-22 22:12
你是用什么函数写盘的啊?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-23 08:39
现在还有不支持DMA的硬盘吗?
ata66,就是DMA66啦。
除非你直接向硬盘写,而不是用什么函数的话,否则我想,不需要考虑是不是DMA吧?有人在后台偷偷做了吧?
whenme
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-24 18:40
   我用fwrite()函数,在用户态的中断处理函数中一次性写完8kbyte数据;
   也曾尝试过用createfile()和writefile(),但结果是一样的。
  
   需要说明的是:并不是每次中断都不能存完,事实上,大多数  时候都能够及时存盘。

  我想原因是三方面的,
  一:在windows98下(FAT32),磁盘操作被文件系统接管,我不能实现物理上的顺序写磁盘,在这种情况下,要不停的更换磁道和扇区,那么这种操作的延时就很大,一般数个毫秒,这样就会导致期间的数据丢失。
  二:磁盘的写速度不平均,在速度低时,会丢数。
  三:从执行写磁盘那条指令到真正开始物理写磁盘,有延时,而且延时不定,也会丢数。

    当我(外部)缓存8秒数据时,就不会丢数据了。
   但现实是,我的缓存只有8kbyte, 即1毫秒时间。
whenme
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2004-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-24 18:44
   感谢大家帮忙,大家多提宝贵意见。我很着急,谢谢了。
Over
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-24 21:14
\"2。中断方式,中断服务中存盘,中断没有丢\"

中断服务应该是一个单独线程吧?建议把存盘动作放到主线程中,接收到的数据放入两个线程共用的缓冲区数组里,通过事件来同步.
应该不丢数,但是数据也许会出错.如果你试验成功,给我回个信儿.
当我们仰望星空,其实是在回顾历史
Over
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-05-24 21:25
  我用fwrite()函数,在用户态的中断处理函数中一次性写完8kbyte数据;
  二:磁盘的写速度不平均,在速度低时,会丢数。
  三:从执行写磁盘那条指令到真正开始物理写磁盘,有延时,而且延时不定,也会丢数。


写盘立即执行可以考虑fwrite后加个fflush(),不过你8k就flush一次肯定不行.这个中断是pci卡触发的吧?你的采集卡每传8k就中断一次吗?如果中断的时候pci卡不工作的话,那么应该尽量缩短中断处理需要的时间.我也遇到类似的问题,需要你的帮助,不过不是丢数,是数据有错误.
当我们仰望星空,其实是在回顾历史
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-05-25 09:29
为什么不试试在驱动里直接调用zwCreateFile、zwWriteFile和zwReadFile直接写硬盘呢
另外既然是在用户态写盘,可以申请一个足够大的内存,做一个队列缓冲几秒钟的数据,这样应该也可以解决你的问题

[编辑 -  5/25/02 by  bingjie]
chener
驱动牛犊
驱动牛犊
  • 注册日期2001-10-15
  • 最后登录2003-05-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-05-25 13:29
    你的硬盘是20MB/S应该是传输速度,写硬盘时还要有寻道时间,延迟时间等等。这样的话,硬盘的实际速度没你想象的那么快。
    数据丢失可能是因为异步访问引起的,就是在写完硬盘之前有新数据把老数据覆盖掉了,你可以设置pv操作试一下。不过最好是分配2块内存区轮流工作。
chener
panxi
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望101点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-25 16:36
在内存中开多个缓存,填满一个就写盘,就不会丢数据。但丢不丢数据与硬盘本身的速度有关系
spooling
驱动牛犊
驱动牛犊
  • 注册日期2002-05-25
  • 最后登录2002-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-05-25 21:46
关硬盘速度什么事啊,只要内存中的数据还在,你让他写完怎么会丢数据呢
如果你认为对你有用,请给分!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-05-25 22:02
八成是程序bug.
你确认过dbgprint能够正确的打印出所有的结果吗?
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-17 20:55
虽然1年多过去了。。。。。

建议改成写硬盘时要一次写入大于64K字节的数据,这和WINDOWS簇的分配有关。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-19 09:24
用WINDRIVER的暂时就不要考虑实时性了. 你需要自己真正在KERNEL MODE干点事情, 而不是等WINDRIVER POST EVENT过来. 使用ISR+SYSTEM CRITICAL QUEUE可以解决问题.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
yilan
驱动牛犊
驱动牛犊
  • 注册日期2002-06-09
  • 最后登录2003-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-19 19:53
用内存映射式式看吧!
它可以提高速度10倍
还有就是每次写的数据用64K
游客

返回顶部