-
Interruption en Delphi
Bonjour à tous,
J'utilise Delphi 2005 et je me demandais, bien que je pense que c'est impossible, s'il était possible de récupérer les interruptions matérielles, plus précisément celle du Timer0 sous Delphi... J'ai trouvé cet article sur ce site :
http://pascal.developpez.com/cours/artint/
Mais il ne s'applique pas au Delphi...
Si quelqu'un connait la méthode en Delphi se serait super...
Sinon si c'est impossible, j'ai pensé à mettre au point une dll en C qui s'occuperait de détourner l'interruption... Pour ça je me demandais comment faire ça proprement? deux méthode, une premiere qui se présente sous la forme d'une fonction que j'appel depuis mon programme en Delphi et qui ne renvoie sa valeur que lorsqu'une interruption a été générée... (Pour ça, je créée en Delphi un nouveau thread)... Problème, il est évident que dans le but de récupéré les interruptions du timer0 c'est que je veux travailler en temps réel et qu'ici j'ajoute des taches qui ne vont que ralentir le systeme.
Deuxieme possiblité, que la dll envoie un message au programme en Delphi a chaque interruption, mais là je ne sais pas du tout comment faire...
Voilà, si quelqu'un sait un peu m'éclaircir se serait génial
Merci à tous de m'avoir lu
Benjamin
-
interuption !
ouïe ouïe ouïe !
Quasiment impossible, quoi que...
Autant que je sache, toutes les interruptions matérièles sont détournées par le système d'exploitation WINDOWS. Il est quasiment impossible d'y accéder directement. Cependant il existe un composant qui fonctionnait sous WIN95 et qui permettait d'accéder aux interruptions système. Mais WIN95 est un système coopératif s'appuyant sur un mode DOS.
Si quelqu'un pense pouvoir me corriger, il est le bienvenue.
Les versions NT (NT4, NT5 ou 2000, XP) fonctionnent en mode préemptif.
C'est pour cela qu'il n'est pas possible d'accéder à une zone particulière de la mémoire ou au BUS de données sans demander l'autorisation au noyau du système. Il existe une DLL (très connue et gratuite) qui permet d'accéder au BUS de données. Pour les interruptions, je ne sais pas.
Cette DLL "input32.dll" tu la trouveras facilement en faisant une recherche sur le web, avec en plus des exemples d'utilisation.
Mais attention, jouer à manipuler les interrutions systèmes peuvent tout simplement conduire au plantage de l'ordinateur. J'ai parcouru la faq que tu indiques dans ton message, mais elle s'applique uniquement au mode DOS. L'instruction Interrupt par exemple en Delphi consiste à provoquer l'interruption du programme en mode débbuger.
Tu as intéret à chercher à résoudre ton problème en utilisant la gestion des événements. Cherche dans les faqs Delphi.
Bon courrage.
-
De l'avis de Philippe, je pense que tu devrais utiliser l'API Windows GetTickCount en conjonction avec les threads et la classe TEvent. je pense que ça fera l'affaire dans ton cas.
A tout hasard, tu peux toujours jeter un oeil sur la structure d'une procedure de callback de TimerProc.
Quelque soit les méthodes que tu utiliseras tu aura du mal à tomber sous une résolution de 10 millisecondes.
Bon courage.
-
Bonjour,
Un code intéressant sur le sujet :
"How to use DPMI calls to service hardware interrupts v.1.0"
http://www.torry.ru/samples/samples/hard/K-Keyboard.zip
En fait, lorsque qu'une interrupt N se produit, le processeur se branche à l'adresse T[n] où T est à une adresse fixe de l'espace mémoire. On peut donc détourner l'adresse, mais avant de se rebrancher sur la procédure interceptée, il faut faire attention à :
- sauvegarder/restaurer toute modification d'un registre,
- faire un traitement court, juste un minimum d'instructions.
-
Bonsoir,
Comme je vois je ne suis pas sorti de l'auberge et mon application risque de devoir tourner sous DOS, vu que je dois avoir des bases de temps de l'ordre de 10µs
Pour inpout32.dll je la connais tres bien, mais le probleme reste de détourner l'interruption
Pour GetTickCOunt, comme tu le dis je saurais pas descendre en dessous de 10 millisencodes
Enfin je vais continuer a chercher, merci à tous