阅读:1307回复:3
我的驱动程序中为什么不让使用double类型?
我在驱动程序中声明double类型的数据,
但是系统总报错,请问为什么,应该如何使用? |
|
沙发#
发布于:2002-11-05 17:02
Microsoft建议,除非必要,应避免在内核模式驱动程序中使用浮点运算。
可用FLOAT_LONG.参看DDK DOCUMENT中data types |
|
|
板凳#
发布于:2002-11-06 08:19
看看这个, 详细资料查DDK:
Using Floating Point or MMX in a WDM Driver Kernel-mode WDM drivers for Windows Me, Windows 98, Windows 98 SE, and Windows 2000 and later must follow certain guidelines for using floating-point operations, MMX, 3DNOW!, or Intel\'s SSE extensions. Kernel-mode WDM drivers must wrap use of the floating-point unit (FPU) between calls to KeSaveFloatingPointState and KeRestoreFloatingPointState. Failure to use these routines can cause calculation errors in concurrent user-mode applications. KeSaveFloatingPointState saves the FPU state of the currently running application in a system-provided buffer and reinitializes the FPU for the driver. The routine takes a single parameter, a driver-allocated buffer, which provides support for nested calls. If KeSaveFloatingPointState is called twice at the same IRQL without an intervening call to KeRestoreFloatingPointState, the nonvolatile FPU state is saved in the driver-allocated buffer. (The caller must save volatile state from ST0-ST7, MMX0-MMX7, and XMM0-XMM7.) If the system is low on memory, KeSaveFloatingPointState can fail. Drivers must check the returned status and, if a failure occurs, must not access the FPU. When a driver has finished using the FPU, it calls KeRestoreFloatingPointState to restore the previous application state. The following example shows how a WDM driver should wrap its FPU access: KFLOATING_SAVE saveData; NTSTATUS status; double floatValue; status = KeSaveFloatingPointState(&saveData); if (NT_SUCCESS(status)) { floatValue = 1.0; KeRestoreFloatingPointState(&saveData); } In the example, the assignment to the floating-point variable occurs between calls to KeSaveFloatingPointState and KeRestoreFloatingPointState. Because any assignment to a floating-point variable uses the FPU, drivers must ensure that KeSaveFloatingPointState has returned without error before initializing such a variable. WDM drivers can call KeSaveFloatingPointState at IRQL <= DISPATCH_LEVEL. However, use of floating-point operations is not supported in interrupt service routines (ISRs). On NT-based systems, the FPU is set to long real precision (that is, double or 53-bit), with all exceptions masked, upon return from KeSaveFloatingPointState. On Windows Me, Windows 98, and Windows 98 SE, drivers that use the FPU must adhere to the following guidelines: Access the FPU only from passive-level work items or worker threads. Do not call KeSaveFloatingPointState or attempt to use the FPU or MMX from a DPC, from an IOCTL handler, or from any other handler called from user mode. Do not try to circumvent this rule; drivers cannot implement a workaround that is guaranteed to operate correctly on all processors. Reload the FPU control word with 0x27F after KeSaveFloatingPointState returns. Doing so ensures that the FPU is set to long real precision (double or 53-bit), with all exceptions masked, as on NT-based systems. For Windows 98 and Windows 98 SE only, always call KeSaveFloatingPointState at IRQL PASSIVE_LEVEL. Calling this routine at IRQL DISPATCH_LEVEL can cause a system crash. |
|
|
地板#
发布于:2002-11-06 10:53
搜索一下吧,这样的贴子太多了。
|
|