Spinlock
-
ziel ist es einen zeitkritischen code moeglichst in realtime auszufuehren!
ich will windows ist da nicht gerade ein real time system:)
und wie du ja weisst kann mein zeitkritischer teil ja von einem anderen thread unterbrochen werden, und dann kann man keine aussage mehr treffen wie lange die ausfuehrungszeit des zeitkritischen codes ist....
deshalb war die idee da den scheduler fuer eine kurze zeit zu blocken...
-
Naja, ohne weiter zu wissen um *was* für eine Art Code es dabei geht, und daher ohne abschätzen zu können wie zeitkritisch der nun wirklich ist, sehe ich 3 Möglichkeiten:
- Nicht Windows nehmen
- Das ganze in einen Treiber packen, und KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql() drumrum packen
- Einfach im Usermode REALTIME_PRIORITY_CLASS + höchste Thread Priorität verwenden und hoffen dass es reicht
Und nochwas: den SMI kannst du sowieso nicht ausschalten - bzw. nicht auf "hardware unabhängigen" Weg. Und solltest du auch nicht, sonst kanns sein dass irgendwas auf einmal nichtmehr so geht wie es sollte

-
kann man einen treiber aus einer normalen win32 applikation starten?
was heisst KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql drumrum packen?
-
Nochmals zur ursprünglichen Fragen:
Ein Spinlock in Win32 (User-Mode) wird mit InitializeCriticalSectionAndSpinCount erstellt.
Und ja: Es ist eine Critical-Section die wartet ohne den Prozessor abzugeben... macht somit auch nur auf Multi-Prozessor-Systemen Sinn.
-
wie waere es mit sowas:
In contrast to RTX, INtime from TenAsys runs both the real-time applications
and the non real-time applications in user-mode. There is still the
possibility to write a real-time application as a driver, which will run in
kernel-mode[16, 28]. Running applications in user-mode protects the system
from crashing because of programming errors such as null pointers, and page
faults. However, applications still have the ability to gain direct access to
physical memory if that is deemed necessary by the developer[28].
INtime installs a number of components in Windows. The most important
includes a Windows kernel driver and a Windows service. The kernel
driver manages communication between the INtime and the Windows environment.
The service handles the actual loading of the INtime kernel into
the system. A context switch then occurs to make the system go into the
INtime kernel. In this state all real-time activity is handled before any Windows
activity. XP eectively becomes the idle-task of the INtime kernel.
When running in the INtime kernel, all Windows interrupts are masked. A
real-time interrupt (both software and hardware) is handled directly. Thanks
to monitoring of the HAL, Windows kernel is unable to mask real-time interrupts.
This means that even badly designed device drivers, masking interrupts
running in the Windows kernel, cannot aect the performance of
the real-time kernel[28]quelle: http://www.idt.mdh.se/utbildning/exjobb/files/TR0470.pdf
zahlt sich aber nicht wirklich aus einen eigenen realtime kernel zu entwickeln:)
-
spinne schrieb:
kann man einen treiber aus einer normalen win32 applikation starten?
was heisst KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql drumrum packen?
-
Du kannst einen Treiber aus einer normalen Win32 Applikation Installieren, starten und ansprechen (DeviceIoControl, ReadFile, WriteFile, ...). Zum Installieren braucht man aber auf jeden Fall Admin Rechte.
-
Das heisst:
KIRQL oldIrql; KeRaiseIrql(SYNCH_LEVEL, &oldIrql); MachWas(); KeLowerIrql(oldIrql);Geht aber wie gesagt nur in einem Treiber. Der "IRQL" ist im Übrigen der "Interrupt Request Level" -- kein Interrupt der nicht einen höheren als den aktuellen IRQL hat kann auf dem aktuellen Prozessor (Hardware Thread) ausgeführt werden. Setzt mal also den IRQL hoch verbietet man quasi Interrupts.
-
-
Ich rate dringend von ab, denke aber sowieso, dass das nur auf Kernel-Ebene möglich ist. Das heißt, du musst einen Treiber schreiben und laden... vielleicht solltest du lieber ein Echtzeitsystem benutzen, anstatt Windows zu verpfuschen. :xmas1:
-
ich hab' mal vor langer zeit zum spass den timer beschleunigt. windowz schien rein gefühlsmässig etwas schneller zu laufen (was natürlich nicht so ist - je mehr rechenzeit der scheduler kriegt, desto weniger bleibt für die threads), das caret blinkte mit der doppelten frequenz, das fenstersystem lief flüssiger usw. hätt' ich das mal als ultimativen win beschleuniger aus fernost verkaufen sollen (mit toller verpackung und so). die ganzen great game coder und ähnliche windows-fans hätten mich reich gemacht

-
@net: willst du uns deinen trick nicht zeigen?
-
spinne schrieb:
@net: willst du uns deinen trick nicht zeigen?
na, hab's doch schon beschrieben wie's geht.
den timer in der RTC manipulieren, so dass der schneller läuft...
-
Wenn Du das Scheduling schneller machen willst musst Du nur "timeBeginPeriod(1)" aufrufen.
Wenn Du die Uhrzeit schneller/langsamer laufen lassen willst musst Du nur "SetSystemTimeAdjustment" aufrufen.
-
wie viele timer hat eigentlich ein motherboard?