Сб сен 01, 2012 22:06:18
Откройте диспетчер задач и там увидите.Ariadna-on-Line писал(а):Буду очень признателен, если кто уточнит, что такое загрузка процессора. В процентах наверно, но от чего?
Чем имеющаяся не подошла?Ariadna-on-Line писал(а):И как, например, в Дельфи или в Визуал Бейсике накатать соответствующую программулину?
Сб сен 22, 2012 20:50:00
Сб сен 22, 2012 23:35:25
Не хотите DLL в несколько кило? Ладно вот исходник функции CpuUsage().Ariadna-on-Line писал(а):Так что уж лучше назвали бы API-функцию Виндоуса. Вы ведь ими воспользовались? Здесь ведь всё-таки форум, а не торговый центр.
;----------
;----------
;
; CPU monitor for Win9x/ME + NT/2k/XP
;
;----------
;----------
;
;----------
; INCLUDE ;
;----------
;%INCLUDE "macros.asm"
;----------
; EXPORTS ;
;----------
GLOBAL PB_InitCPUmonitor
GLOBAL PB_CloseCPUmonitor
GLOBAL PB_CpuUsage
;----------
; CONSTANTS ;
;----------
; WinNT/2k/XP
SYSTEM_BASICINFORMATION equ 0h
SYSTEM_PERFORMANCEINFORMATION equ 2h
SYSTEM_TIMEINFORMATION equ 3h
NO_ERROR equ 0h
; Win9x/ME
STANDARD_RIGHTS_ALL equ 1F0000h
KEY_QUERY_VALUE equ 1h
KEY_SET_VALUE equ 2h
KEY_CREATE_SUB_KEY equ 4h
KEY_ENUMERATE_SUB_KEYS equ 8h
KEY_NOTIFY equ 10h
KEY_CREATE_LINK equ 20h
SYNCHRONIZE equ 100000h
READ_CONTROL equ 20000h
STANDARD_RIGHTS_READ equ READ_CONTROL
HKEY_DYN_DATA equ 80000006h
;#KEY_ALL_ACCESS = (#STANDARD_RIGHTS_ALL|#KEY_QUERY_VALUE|#KEY_SET_VALUE|#KEY_CREATE_SUB_KEY|#KEY_ENUMERATE_SUB_KEYS|#KEY_NOTIFY|#KEY_CREATE_LINK) & (~#SYNCHRONIZE)
;#KEY_READ = (#STANDARD_RIGHTS_READ|#KEY_QUERY_VALUE|#KEY_ENUMERATE_SUB_KEYS|#KEY_NOTIFY) & (~#SYNCHRONIZE)
KEY_ALL_ACCESS equ 0F003Fh
KEY_READ equ 20019h
ERROR_SUCCESS equ 0h
;----------
; MACROS ;
;----------
%macro BEEP 2
EXTERN _Beep@8
PUSH dword %2
PUSH dword %1
CALL _Beep@8
%endmacro
%macro ProcedureReturn 1
MOV dword EAX, %1
RET
%endmacro
%macro NtQuerySystemInformation 4
PUSH dword %4
PUSH dword %3
PUSH dword %2
PUSH dword %1
CALL [adr_NtQuerySystemInformation]
%endmacro
%macro RegOpenKeyEx 5
PUSH dword %5
PUSH dword %4
PUSH dword %3
PUSH dword %2
PUSH dword %1
CALL [adr_RegOpenKeyEx]
%endmacro
%macro RegQueryValueEx 6
PUSH dword %6
PUSH dword %5
PUSH dword %4
PUSH dword %3
PUSH dword %2
PUSH dword %1
CALL [adr_RegQueryValueEx]
%endmacro
%macro RegCloseKey 1
PUSH dword %1
CALL [adr_RegCloseKey]
%endmacro
%macro INVOKE 2-9 ;Macro INVOKE, same as stdcall
%define _j %1
%rep %0-1
%rotate -1
push dword %1 ; added DWORD for Win32
%endrep
call _j
%endmacro
;----------
; IMPORTS ;
;----------
;EXTERN PB_StringBase
EXTERN _GetVersionExA@4 ; KERNEL32
EXTERN _LoadLibraryA@4 ; KERNEL32
EXTERN _FreeLibrary@4 ; KERNEL32
EXTERN _GetProcAddress@8 ; KERNEL32
SEGMENT .text USE32 CLASS=CODE
;----------
; InitCPUmonitor() ;
;----------
PB_InitCPUmonitor:
.IsWinNT:
MOV dword [OSVERSIONINFO.dwOSVersionInfoSize], 148 ; SizeOf(OSVERSIONINFO)
INVOKE _GetVersionExA@4, OSVERSIONINFO
CMP dword [OSVERSIONINFO.dwPlatformId], 2 ; 2 = WinNT
JNE .NTchecked
MOV dword [IsWinNT], 1 ; IsWinNT = 1 = WinNT
.NTchecked:
CMP dword [IsWinNT], 1
JNE NEAR _Win9x
.WinNT: ; WinNT
INVOKE _LoadLibraryA@4, _ntdll
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _LoadLib ; EAX = 0:
ret ; Return if LoadLibrary failed
_LoadLib:
MOV dword [DLL_HANDLE], EAX
INVOKE _GetProcAddress@8, EAX, _NtQuerySystemInformation
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _ProcAdr ; EAX = 0:
ret ; Return if GetProcAddress failed
_ProcAdr:
MOV dword [adr_NtQuerySystemInformation], EAX
NtQuerySystemInformation SYSTEM_TIMEINFORMATION, SYSTEM_TIME_INFORMATION, 32, 0
OR dword EAX,EAX ; Is EAX = 0 ??
JZ _OK1
;MessageRequester("ERROR", "Error While initializing the system's time!", 0)
BEEP 1400, 5000
ProcedureReturn 0
_OK1:
NtQuerySystemInformation SYSTEM_PERFORMANCEINFORMATION, SYSTEM_PERFORMANCE_INFORMATION, 312, 0
OR dword EAX,EAX ; Is EAX = 0 ??
JZ _OK2
;MessageRequester("ERROR", "Error While initializing the CPU's idle time!", 0)
BEEP 1000, 5000
ProcedureReturn 0
_OK2:
; store new CPU's idle And system time
MOV dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwLow]
MOV dword [liOldIdleTime_dwLow],EAX
MOV dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwHigh]
MOV dword [liOldIdleTime_dwHigh], EAX
MOV dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwLow]
MOV dword [liOldSystemTime_dwLow],EAX
MOV dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwHigh]
MOV dword [liOldSystemTime_dwHigh], EAX
ProcedureReturn 1
_Win9x: ; Win9x
; Win9x/ME
; start the counter by reading the value of the 'StartStat' key
INVOKE _LoadLibraryA@4, _advapi32
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _LoadLibOK ; EAX = 0:
ret ; Return if LoadLibrary failed
_LoadLibOK:
MOV dword [DLL_HANDLE], EAX
INVOKE _GetProcAddress@8, EAX, _RegOpenKeyEx
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _ProcAdr01 ; EAX = 0:
ret ; Return if GetProcAddress failed
_ProcAdr01:
MOV dword [adr_RegOpenKeyEx], EAX
INVOKE _GetProcAddress@8, [DLL_HANDLE], _RegQueryValueEx
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _ProcAdr02 ; EAX = 0:
ret ; Return if GetProcAddress failed
_ProcAdr02:
MOV dword [adr_RegQueryValueEx], EAX
INVOKE _GetProcAddress@8, [DLL_HANDLE], _RegCloseKey
OR dword EAX,EAX ; Is EAX = 0 ??
JNZ _ProcAdr03 ; EAX = 0:
ret ; Return if GetProcAddress failed
_ProcAdr03:
MOV dword [adr_RegCloseKey], EAX
RegOpenKeyEx HKEY_DYN_DATA, _string01, 0, KEY_ALL_ACCESS, hKey
OR dword EAX,EAX ; Is EAX = 0 ??
JZ _DONE01 ; EAX = 0:
;MessageRequester("ERROR", "Error While initializing counter",0)
ProcedureReturn 0
_DONE01:
MOV dword [dwDataSize], 4 ;'Length of Long
RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
RegCloseKey [hKey]
; get current counter's value
RegOpenKeyEx HKEY_DYN_DATA, _string03, 0, KEY_READ, hKey
OR dword EAX,EAX ; Is EAX = 0 ??
JZ _DONE02 ; EAX = 0:
;MessageRequester("ERROR", "Error While opening counter key", 0)
ProcedureReturn 0
_DONE02:
ProcedureReturn 1
RET
;----------
; CloseCPUmonitor() ;
;----------
PB_CloseCPUmonitor:
CMP dword [IsWinNT], 1
JNE NEAR .Win9x
.WinNT: ; WinNT
INVOKE _FreeLibrary@4, [DLL_HANDLE]
ProcedureReturn 1
.Win9x: ; Win9x
RegCloseKey [hKey]
;'stopping the counter
RegOpenKeyEx HKEY_DYN_DATA, _string04, 0, KEY_ALL_ACCESS, hKey
OR dword EAX,EAX ; Is EAX = 0 ??
JZ _DONE_01 ; EAX = 0:
;MessageRequester("ERROR", "Error While stopping counter", 0)
ProcedureReturn 0
_DONE_01:
MOV dword [dwDataSize], 4 ;'length of Long
RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
RegCloseKey [hKey]
ProcedureReturn 1
RET
;----------
; CpuUsage() ;
;----------
PB_CpuUsage:
CMP dword [IsWinNT], 1
JNE NEAR _Win95
.WinNT: ; WinNT
NtQuerySystemInformation SYSTEM_BASICINFORMATION, SYSTEM_BASIC_INFORMATION, 44, 0
OR dword EAX,EAX ; Is EAX = 0 ??
JZ .OK1
;MessageRequester("ERROR", "Error While retrieving the number of processors!", 0)
ProcedureReturn -1
.OK1:
; get new system time
NtQuerySystemInformation SYSTEM_TIMEINFORMATION, SYSTEM_TIME_INFORMATION, 32, 0
OR dword EAX,EAX ; Is EAX = 0 ??
JZ .OK2
;MessageRequester("ERROR", "Error While retrieving the system's time!", 0)
ProcedureReturn -1
.OK2:
; get new CPU's idle time
NtQuerySystemInformation SYSTEM_PERFORMANCEINFORMATION, SYSTEM_PERFORMANCE_INFORMATION, 312, 0
OR dword EAX,EAX ; Is EAX = 0 ??
JZ .OK3
;MessageRequester("ERROR", "Error While retrieving the CPU's idle time!", 0)
ProcedureReturn -1
.OK3:
;dbIdleTime = LI2Currency(SysPerfInfo.liIdleTime) - LI2Currency(liOldIdleTime)
FILD qword [liOldIdleTime_dwLow]
FILD qword [SYSTEM_PERFORMANCE_INFORMATION]
FSUB ST0,ST1
FSTP dword [dbIdleTime]
FSTP dword [dbTemp]
;dbSystemTime = LI2Currency(SysTimeInfo.liKeSystemTime) - LI2Currency(liOldSystemTime)
FILD qword [liOldSystemTime_dwLow]
FILD qword [SYSTEM_TIME_INFORMATION+8]
FSUB ST0,ST1
FSTP dword [dbSystemTime]
FSTP dword [dbTemp]
; CurrentCpuIdle = IdleTime / SystemTime
; If proc_CPUmonitor_dbSystemTime <> 0.0
FLD dword [dbSystemTime]
MOV dword [dbTemp],0
FCOMP dword [dbTemp]
FNSTSW ax ; FNSTSW ; Status Word
TEST ah,40h
JNE .Weiter_01
; proc_CPUmonitor_dbIdleTime = proc_CPUmonitor_dbIdleTime / proc_CPUmonitor_dbSystemTime
FLD dword [dbIdleTime]
FDIV dword [dbSystemTime]
FSTP dword [dbIdleTime]
.Weiter_01:
; CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
; proc_CPUmonitor_dbIdleTime = 100 - (proc_CPUmonitor_dbIdleTime *100) / proc_CPUmonitor_SysBaseInfo\bKeNumberProcessors + 0.5
FLD dword [dbIdleTime]
MOV dword [dbTemp],1120403456
FMUL dword [dbTemp]
;MOV dword [dbTemp],100
;FIMUL dword [dbTemp]
XOR dword EAX, EAX
MOV byte AL, [SYSTEM_BASIC_INFORMATION.bKeNumberProcessors]
MOV dword [dbTemp], eax
FIDIV dword [dbTemp]
FCHS
MOV dword [dbTemp],1120468992
FADD dword [dbTemp]
;MOV dword [dbTemp],100
;FIADD dword [dbTemp]
FSTP dword [dbIdleTime]
; store new CPU's idle And system time
MOV dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwLow]
MOV dword [liOldIdleTime_dwLow],EAX
MOV dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwHigh]
MOV dword [liOldIdleTime_dwHigh], EAX
MOV dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwLow]
MOV dword [liOldSystemTime_dwLow],EAX
MOV dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwHigh]
MOV dword [liOldSystemTime_dwHigh], EAX
; FLOAT -> INTEGER
; because Result is Integer
FLD dword [dbIdleTime]
FISTP dword [dbIdleTime]
ProcedureReturn [dbIdleTime]
_Win95: ; Win9x
MOV dword [dwDataSize], 4 ;'size of Long
; Query the counter
RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
ProcedureReturn [dwCpuUsage]
RET
[section .data]
ALIGN 4
_ntdll: db "ntdll.dll",0
_advapi32: db "advapi32.dll",0
_NtQuerySystemInformation: db "NtQuerySystemInformation",0
_RegOpenKeyEx: db "RegOpenKeyExA",0
_RegQueryValueEx: db "RegQueryValueExA",0
_RegCloseKey: db "RegCloseKey",0
_string01: db "PerfStats\StartStat",0
_string02: db "KERNEL\CPUUsage",0
_string03: db "PerfStats\StatData",0
_string04: db "PerfStats\StopStat",0
IsWinNT: dd 0
[section .bss]
ALIGN 4
; Variables for DLL-Functions
DLL_HANDLE: RESD 1
adr_NtQuerySystemInformation: RESD 1
adr_RegOpenKeyEx: RESD 1
adr_RegQueryValueEx: RESD 1
adr_RegCloseKey: RESD 1
; winNT/2k/XP
liOldIdleTime_dwLow: RESD 1
liOldIdleTime_dwHigh: RESD 1
liOldSystemTime_dwLow: RESD 1
liOldSystemTime_dwHigh: RESD 1
dbIdleTime: RESD 1
dbSystemTime: RESD 1
dbTemp: RESD 1
; win9x/ME
hKey RESD 1
dwDataSize RESD 1
dwCpuUsage RESD 1
dwType RESD 1
; Structures
OSVERSIONINFO: ; SIZE 148
.dwOSVersionInfoSize: RESD 1
.dwMajorVersion: RESD 1
.dwMinorVersion: RESD 1
.dwBuildNumber: RESD 1
.dwPlatformId: RESD 1
.szCSDVersion: times 128 RESB 1
SYSTEM_TIME_INFORMATION: ; SIZE 32
.liKeBootTime_dwLow: RESD 1 ; liKeBootTime.myLARGE_INTEGER
.liKeBootTime_dwHigh: RESD 1
.liKeSystemTime_dwLow: RESD 1 ; liKeSystemTime.myLARGE_INTEGER
.liKeSystemTime_dwHigh: RESD 1
.liExpTimeZoneBias_dwLow: RESD 1 ; liExpTimeZoneBias.myLARGE_INTEGER
.liExpTimeZoneBias_dwHigh: RESD 1
.uCurrentTimeZoneId: RESD 1
.dwReserved: RESD 1
SYSTEM_PERFORMANCE_INFORMATION: ; SIZE 312
.liIdleTime_dwLow: RESD 1 ; liIdleTime.myLARGE_INTEGER
.liIdleTime_dwHigh: RESD 1
.dwSpare: times 76 RESD 1 ; dwSpare.l[76] ; (0 To 75) As Long
SYSTEM_BASIC_INFORMATION: ; SIZE 44
.dwUnknown1 RESD 1
.uKeMaximumIncrement RESD 1
.uPageSize RESD 1
.uMmNumberOfPhysicalPages RESD 1
.uMmLowestPhysicalPage RESD 1
.uMmHighestPhysicalPage RESD 1
.uAllocationGranularity RESD 1
.pLowestUserAddress RESD 1
.pMmHighestUserAddress RESD 1
.uKeActiveProcessors RESD 1
.bKeNumberProcessors RESB 1
.bUnknown2 RESB 1
.wUnknown3 RESW 1 ; INTEGER
Пн сен 24, 2012 13:16:36
Пн сен 24, 2012 19:07:34
Вт сен 25, 2012 22:32:35
Вт сен 25, 2012 23:47:10
Ср сен 26, 2012 15:22:19
Мурик писал(а):Есть ли у PIC или AVR инструкция типа HLT?
А смысл? В многозадачных системах степень загрузки процессора одной задачей косвенно отражает, сколько ещё таких задач процессор может исполнять. В МК нет ни ОС, ни задач, и смысла в показателе "загрузка процессора" нет никакого. Хотите меньшего энергопотребления? Вводите периодически МК в SLEEP в основном цикле, если остаётся свободное время. А если МК в реалтайме занят вычислениями и выводом на индикатор, то о какой "загрузке" будет идти речь? Там всегда будет 100%Ariadna-on-Line писал(а):Написать программу для PICа там или AVRа, чтобы он сам посчитал степень своей загрузки.
Чт окт 04, 2012 23:56:44
Сб окт 13, 2012 22:05:58
Вс окт 14, 2012 05:49:33
Вс окт 14, 2012 09:55:32
Вс окт 14, 2012 17:57:13
Вс окт 14, 2012 18:14:08
Вс окт 14, 2012 19:27:11
Вс окт 14, 2012 19:35:55
Вс окт 14, 2012 20:03:29
Пн окт 15, 2012 01:39:49
Вт окт 16, 2012 18:57:28
Пт окт 19, 2012 19:48:03
pioneer1234 писал(а):буду разбиратся