IST wird nicht mehr gefeuert nach Programmabbruch

  • Hallo!


    Ich habe folgendes Problem: wenn ich einen IST anmelde:


    Code
    1. dwIRQ = 6;
    2. DeviceIoControl( hDIO, IOCTL_DIO_REQUEST_SYSINTR, &dwIRQ, sizeof(DWORD), &dwSysIntr, sizeof(DWORD), NULL, NULL );
    3. InterruptInitialize( dwSysIntr,hIsrEvent, NULL, 0 );
    4. .....
    5. DeviceIoControl( hDIO, IOCTL_DIO_RELEASE_SYSINTR, &dwSysIntr, sizeof(DWORD), NULL, 0, NULL, NULL );



    Das Programm läuft einwandfrei, meine Interrupts werden von der ISR an meinen IST weitergegeben - alles wie erwartet.


    Wenn ich jedoch das Programm abbreche (Debug Modus beenden od. mit dem Remote Process Viewer Task beenden) OHNE daß mein Programm die Chance hat den IST wieder freizugeben (IOCTL_DIO_RELEASE_SYSINTR), dann wird beim nächsten Programmstart mein IST nicht mehr von der ISR gefeuert, obwohl ich einen neuen dwSysIntr bekomme.


    Ich habe dann vor jedem Programmstart den alten dwSysIntr wieder freigegeben, da bei mir für dwSysIntr immer 28 zurückgeliefert wird. Dies funktioniert einwandfrei, auch wenn der IST noch nicht angemeldet wurde.


    Jetzt meine Fragen:
    - gibt es eine bessere Methode um vor dem Anmelden eines IST festzustellen, ob mit seiner Interrupt ID bereits ein IST verbunden ist?
    - kann man vorhersagen welche dwSysIntr ein (IOCTL_DIO_REQUEST_SYSINTR) zurückliefert od. ist dies zufällig?


    Vielen Dank!

    Code
  • Hmm, das Problem ist nicht so einfach. Im Prinzip wird bei einem Treiber, der in einer Applikation geöffnet ist, die vorzeitig abgebrochen wird, kurz vor dem Abbruch nochmal DeviceIoControl() mit IOCTL_PSL_NOTIFY aufgerufen. Das könnte der Treiber entsprechend nutzen, solche Dinge wie den hier allozierten Interrupt wieder freizugeben. Leider scheint dies bei dem DIO-Treiber nicht so implementiert zu sein.


    Insofern ist die von Ihnen genannte Methode zwar nicht so wirklich befriedigend, aber zumindest für die Testphase praktikabel. Ich denke dass bei gleicher Ausgangskonfiguration auch immer der gleiche SYS_INTR zurückgeliefert wird. Die 28 müsste insoweit eigentlich passen. Die Zahl kann sich aber ändern, wenn Sie z.B. einen weiteren Treiber benutzen und dort zuvor auch einen Request für einen Interrupt machen.


    Ich vermute am Ende wird Ihre Applikation ja sowieso dauerhaft laufen, vom Einschalten bis zum Ausschalten des Boards. Da gibt es dieses Problem dann ja nicht mehr.


    Mit freundlichen Grüßen,


    H. Keller

    F&S Elektronik Systeme GmbH
    As this is an international forum, please try to post in English.
    Da dies ein internationales Forum ist, bitten wir darum, Beiträge möglichst in Englisch zu verfassen.