logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa przerwań zegara systemowego w Delphi/C++ - książki i źródła

Karollo_82 04 Kwi 2006 13:58 2760 16
REKLAMA
  • #1 2491817
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    Poszukuję informacji jak obsługiwać przerwania sprzętowe i programowe w Delphi lub C++. Czy są na ten temat jakieś książki lub dobre witryny opisujące to zagadnienie?

    Potrzebuję informacji jak się dostać do przerwań zegara systemowego, aby możliwe było wywołanie przerwania np 1000 razy na sekundę (po odmierzeniu 1ms zegar wywołuje przerwanie, które obsługuje moja aplikacja w Delphi lub C++)

    Jak coś takiego wykonać?
  • REKLAMA
  • #2 2491896
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Witam.
    Rozwiazanie jest i nazywa sie Assembler.
  • REKLAMA
  • #3 2491921
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    No tak, ale jak do tego się zabrać? Wiem tylko tyle że muszę wykorzystać przerwanie 1C, ale nigdy nie wykorzystywałem przerwać systemowych, nie wiem jak to się robi. Jak w takim przerwaniu określić częstotliwość przerwań?
  • #4 2491997
    Sam Sung
    Poziom 33  
    Posty: 2001
    Pomógł: 227
    Ocena: 570
    To się uda tylko pod DOS'em. Powinieneś przejąć przerwanie IRQ0 (czyli 08h) i przeprogramować dzielnik zegara sprzętowego. Jeśli Cię to dalej interesuje, to mogę przeszukać moje stare programiki i napisać, jak to się robi, ale jeśli piszesz pod windows, to musisz inaczej podejść do problemu.
  • REKLAMA
  • #5 2492005
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    Na dzis polecam Google :).

    Na jutro postaram sie wrzucic troche kodu ASM na ten temat.

    Pozdrawiam.
  • #6 2492069
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    Sam Sung napisał:
    To się uda tylko pod DOS'em.... ale jeśli piszesz pod windows, to musisz inaczej podejść do problemu.

    Koniecznie musi to być zrobione pod Windowsem 2000/XP. Inaczej podejść do problemu czyli jak??

    ZeeWolf napisał:
    Na dzis polecam Google :).

    Na jutro postaram sie wrzucic troche kodu ASM na ten temat.

    Pozdrawiam.


    Ciągle Googluje, dużo jest materiałów w języku angielskim, a to niestety dla mnie nie mała bariera :/ Czekam na obiecany kod.

    Pozdrawiam
  • #7 2492856
    GoAway
    Poziom 13  
    Posty: 80
    Pomógł: 10
    Ocena: 2
    nie zrobisz tego pod XP bo nie ma dosa
  • #8 2492951
    Sam Sung
    Poziom 33  
    Posty: 2001
    Pomógł: 227
    Ocena: 570
    Karollo_82 napisał:
    Sam Sung napisał:
    To się uda tylko pod DOS'em.... ale jeśli piszesz pod windows, to musisz inaczej podejść do problemu.

    Koniecznie musi to być zrobione pod Windowsem 2000/XP. Inaczej podejść do problemu czyli jak??

    Co tak naprawdę chcesz osiągnąć?
  • #9 2493291
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    Sorry że trochę niedokładnie opisałem problem, otóż muszę wygenerować przebieg prostokątny na jednym z pinów portu LPT przy zastosowaniu przerwań. Nigdy nie programowałem obsługi przerwań, więc nie wiem jak to zrobić.

    Wyobrażam to sobie tak: Skorzystać z timera systemowego lub zegara RTC, w jakiś sposób określić częstotliwość przerwań (np co 0,5ms), a w procedurze obsługi przerwania zmieniać stan na pinie portu LPT.

    Jak to wszystko "przetłumaczyć" na język C++ lub Delphi?
  • REKLAMA
  • #10 2495022
    Konto nie istnieje
    Konto nie istnieje  
  • #11 2501850
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    A jeżeli chodzi ci tylko o timing (wywolanie czegos co okreslony interwał czasowy) nie lepszy (i prostszy będzie Timer? Albo wrecz PreciseTimer?
  • #12 2502377
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    No właśnie. Interwał czasowy znamy: 1ms. A jaka musi być dokładność??
  • #13 2502419
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    Niestety interwał czasy 1ms to za mało :( Ja potrzebuję wyższej częstotliwości rzędu 1kHz (czyli interwał 0,5ms aby uzyskać przebieg prostokątny). Próbowałem zrobić to na Performance Counter i wysokim priorytecie wątku, ale niestety na oscyloskopie przebieg "pływa" - czas nie jest dokładnie odmierzany - w końcu procesor uznaje wyższość jakiegoś innego wątku nad moim...

    Myślę że moim rozwiązaniem będzie napisanie sterownika kernelowego, ale... Nie mam pojęcia od czego mam zacząć :/ Może ktoś mi podrzuci jakiś kod prostego sterownika żebym zobaczył w ogóle jak to się robi i jak z tego się korzysta
  • #14 2502464
    Konto nie istnieje
    Konto nie istnieje  
  • #15 2502701
    ZeeWolf
    Poziom 28  
    Posty: 989
    Pomógł: 115
    Ocena: 58
    A to w takim razie odradzam w ogóle systemy multitaskowe (threadowe) typu windows. Sa zbyt niestabilne (timing) i nie pozwalaja w pelni kontrolowac sprzetu - nalepiej czysty DOS i assembler (bedzie szybciej i latwiej).
    Pozdrawiam.
  • #16 2502840
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    Dokładnie. ZeeWolf ma rację. Komputer PC z Windows nie do tego służy. Z resztą od fal najróżniejszych jest karta dzwiękowa :P
  • #17 2516070
    nightman
    Poziom 13  
    Posty: 60
    Pomógł: 2
    Ocena: 7
    ZeeWolf napisał:
    A to w takim razie odradzam w ogóle systemy multitaskowe (threadowe) typu windows. Sa zbyt niestabilne (timing) i nie pozwalaja w pelni kontrolowac sprzetu - nalepiej czysty DOS i assembler (bedzie szybciej i latwiej).
    Pozdrawiam.

    Zgadzam się z powyższym a do tego dokładam że konstrukcji windy zakłada że zdarzenia pochodzące od timerów kolejnowane są bardziej na końcu za innymi niż by się to wydawało ( np: za wygaszaczem heheh ) i nawet program napisany całkiem poprawnie w threacie, stosujący eventsy timera wykazuje duże odchyły od normy np: w przypadku włącznia się w/w

Podsumowanie tematu

✨ Dyskusja dotyczy możliwości obsługi przerwań sprzętowych i programowych w Delphi lub C++ pod systemami Windows 2000/XP, ze szczególnym naciskiem na przerwania zegara systemowego o wysokiej częstotliwości (np. 1000 razy na sekundę). Wskazano, że bezpośrednia obsługa przerwań sprzętowych (np. IRQ0, przerwanie 08h) i modyfikacja tablicy IDT jest możliwa jedynie w systemach DOS lub Windows 9x, natomiast w Windows 2000/XP jest to zablokowane ze względów bezpieczeństwa i stabilności systemu. Propozycją jest napisanie sterownika kernelowego, który działałby w trybie uprzywilejowanym, jednak wymaga to zaawansowanej wiedzy i doświadczenia. Alternatywnie sugerowano użycie timerów systemowych lub bibliotek takich jak WinIO, które poprzez sterownik mogą umożliwić dostęp do pamięci operacyjnej i potencjalnie modyfikację IDT, choć z ograniczeniami. Zwrócono uwagę, że systemy multitaskowe Windows nie gwarantują precyzyjnego timingu na poziomie 0,5 ms ze względu na zarządzanie wątkami i priorytetami, co powoduje niestabilność sygnału. Najprostszym i najbardziej stabilnym rozwiązaniem jest użycie czystego DOS-a i asemblera do bezpośredniej obsługi przerwań sprzętowych. Autor poszukuje przykładów kodu sterownika kernelowego oraz wskazówek, jak rozpocząć jego tworzenie w Delphi lub C++.
Wygenerowane przez model językowy.
REKLAMA