Spinlock



  • 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:

    1. Nicht Windows nehmen
    2. Das ganze in einen Treiber packen, und KeRaiseIrql(SYNCH_LEVEL) (oder HIGH_LEVEL) + KeLowerIrql() drumrum packen
    3. 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 🙂

    http://en.wikipedia.org/wiki/System_Management_Mode



  • 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?

    1. 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.

    2. 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?


Anmelden zum Antworten