阅读:2541回复:19
写硬盘的速度到底有多少?
我做一个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 如果答的好,我舍得给分。 |
|
最新喜欢:![]() |
沙发#
发布于:2003-06-19 19:53
用内存映射式式看吧!
它可以提高速度10倍 还有就是每次写的数据用64K |
|
板凳#
发布于:2003-06-19 09:24
用WINDRIVER的暂时就不要考虑实时性了. 你需要自己真正在KERNEL MODE干点事情, 而不是等WINDRIVER POST EVENT过来. 使用ISR+SYSTEM CRITICAL QUEUE可以解决问题.
|
|
|
地板#
发布于:2003-06-17 20:55
虽然1年多过去了。。。。。
建议改成写硬盘时要一次写入大于64K字节的数据,这和WINDOWS簇的分配有关。 |
|
地下室#
发布于:2002-05-25 22:02
八成是程序bug.
你确认过dbgprint能够正确的打印出所有的结果吗? |
|
5楼#
发布于:2002-05-25 21:46
关硬盘速度什么事啊,只要内存中的数据还在,你让他写完怎么会丢数据呢
|
|
|
6楼#
发布于:2002-05-25 16:36
在内存中开多个缓存,填满一个就写盘,就不会丢数据。但丢不丢数据与硬盘本身的速度有关系
|
|
7楼#
发布于:2002-05-25 13:29
你的硬盘是20MB/S应该是传输速度,写硬盘时还要有寻道时间,延迟时间等等。这样的话,硬盘的实际速度没你想象的那么快。
数据丢失可能是因为异步访问引起的,就是在写完硬盘之前有新数据把老数据覆盖掉了,你可以设置pv操作试一下。不过最好是分配2块内存区轮流工作。 |
|
|
8楼#
发布于:2002-05-25 09:29
为什么不试试在驱动里直接调用zwCreateFile、zwWriteFile和zwReadFile直接写硬盘呢
另外既然是在用户态写盘,可以申请一个足够大的内存,做一个队列缓冲几秒钟的数据,这样应该也可以解决你的问题 [编辑 - 5/25/02 by bingjie] |
|
9楼#
发布于:2002-05-24 21:25
我用fwrite()函数,在用户态的中断处理函数中一次性写完8kbyte数据; 写盘立即执行可以考虑fwrite后加个fflush(),不过你8k就flush一次肯定不行.这个中断是pci卡触发的吧?你的采集卡每传8k就中断一次吗?如果中断的时候pci卡不工作的话,那么应该尽量缩短中断处理需要的时间.我也遇到类似的问题,需要你的帮助,不过不是丢数,是数据有错误. |
|
|
10楼#
发布于:2002-05-24 21:14
\"2。中断方式,中断服务中存盘,中断没有丢\"
中断服务应该是一个单独线程吧?建议把存盘动作放到主线程中,接收到的数据放入两个线程共用的缓冲区数组里,通过事件来同步. 应该不丢数,但是数据也许会出错.如果你试验成功,给我回个信儿. |
|
|
11楼#
发布于:2002-05-24 18:44
感谢大家帮忙,大家多提宝贵意见。我很着急,谢谢了。
|
|
12楼#
发布于:2002-05-24 18:40
我用fwrite()函数,在用户态的中断处理函数中一次性写完8kbyte数据;
也曾尝试过用createfile()和writefile(),但结果是一样的。 需要说明的是:并不是每次中断都不能存完,事实上,大多数 时候都能够及时存盘。 我想原因是三方面的, 一:在windows98下(FAT32),磁盘操作被文件系统接管,我不能实现物理上的顺序写磁盘,在这种情况下,要不停的更换磁道和扇区,那么这种操作的延时就很大,一般数个毫秒,这样就会导致期间的数据丢失。 二:磁盘的写速度不平均,在速度低时,会丢数。 三:从执行写磁盘那条指令到真正开始物理写磁盘,有延时,而且延时不定,也会丢数。 当我(外部)缓存8秒数据时,就不会丢数据了。 但现实是,我的缓存只有8kbyte, 即1毫秒时间。 |
|
13楼#
发布于:2002-05-23 08:39
现在还有不支持DMA的硬盘吗?
ata66,就是DMA66啦。 除非你直接向硬盘写,而不是用什么函数的话,否则我想,不需要考虑是不是DMA吧?有人在后台偷偷做了吧? |
|
14楼#
发布于:2002-05-22 22:12
你是用什么函数写盘的啊?
|
|
15楼#
发布于:2002-05-22 21:51
DMA方式?好注意,我原以为它本来就工作在DMA方式下.
1.不知道我的硬盘支持不支持DMA方式,我不知道我的硬盘是什么型号的,标签上没有显示;数据线上显示ATA66; 2.如果支持,应该怎么设置? 体现在程序上又是怎样体现? |
|
16楼#
发布于:2002-05-21 15:56
改变一下控制方式:
写盘时用DMA方式,这样一来用的不是CPU的资源. 写盘用中断会影响从AD接受数据的. |
|
|
17楼#
发布于:2002-05-21 09:33
硬盘不应该这么慢吧
|
|
18楼#
发布于:2002-05-20 20:03
事实上,我用的是同步写,设置CREATEFILE()参数OVERLAP=NULL;但系统看起来并没有工作在同步方式下.另外用其他函数如WRITEFILE(),也不行.
如果真是这样,那么如何控制是硬盘写操作立即执行. 另一个问题是丢数并不是每个周期都丢,也就是说,有时候是同步写,有时候是\"异步写\"了. |
|
19楼#
发布于:2002-05-18 11:56
这个问题可能是因为你在写盘的时候没有进行同步写导致的,你不应该通过提高写盘速度来解决这个问题!
|
|