【原创】深刻体会wince 驱动中Sleep函数的作用

  作者:gooogleman      

  这段时间,一直在整2440 的摄像头,想用2440 C通道 YUV数据保存成图片,不过郁闷的是经常会不能获得正确的DMA通道数据地址,这样在应用程序中用memcpy就会异常了,多失败几次应用程序都崩溃了。经过几天的探索,发现正常的地址和不正常的地址有明显的区别,所以利用这个特点来是否返回给memcpy这样可以避免异常。

  开始我是在一次C通道中判断地址是否正常,否则就继续读取,后来觉得不合理,因为这明显是不应该在一帧里面多次读取,后来改为每次读取,直到等到符合的地址为止,这才是合理的思路。

  好了,这里说到其中的一个教训,我在CIS_IOControl函数的一个case 里面加入了如下一句话等待正确地址:

while(地址不正常);// 什么都不做,只是等待

结果发生了应用程序死机的事情,因为应用程序调用的case 一直没有返回,死在驱动了。这是操作系统里面比较容易犯的一个错误,就是没有让一个循环里面加入Sleep函数,这个函数会有延时+切换现成的作用,切换到另外一个线程,修改循环条件,那么就自动退出了。我后来加入Sleep(10)顺利解决应用程序挂死问题。不过Sleep不是到处都可以用的,在以前的6410 触摸屏驱动中我也说过,在一些硬件完成的等待动作里面,千万别用Sleep 去等待和延时,纯粹是浪费时间。因为sleep 是用来同步的,硬件的延时用while(等待硬件结束);就可以了。还是看看这个有用的函数的PB帮助吧。

This function suspends the execution of the current thread for a specified interval.

void Sleep(  DWORD dwMilliseconds); 

Parameters

dwMilliseconds
[in] Specifies the time, in milliseconds, for which to suspend execution.

A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If no other threads of equal priority are ready to run, the function returns immediately, and the thread continues execution.

A value of INFINITE causes an infinite delay.

  完工!

转载于:https://www.cnblogs.com/gooogleman/archive/2010/12/30/1922142.html

你可能感兴趣的:(【原创】深刻体会wince 驱动中Sleep函数的作用)