D'exploitation en temps réel via Python
Donc je suis un inexpérimenté Python codeur, avec ce que j'ai recueillies peut être assez compliqué besoin. Je suis un spécialiste en sciences cognitives, et j'ai besoin précis de stimulation de l'écran et appuyez sur le bouton de détection. J'ai été dit que la meilleure façon de le faire est par l'utilisation d'exploitation en temps réel, mais n'ont aucune idée de comment aller à ce sujet. Idéalement, à chaque essai, le programme fonctionne en temps réel, et puis une fois le procès terminé, le système d'exploitation peut revenir en arrière pour ne pas être aussi méticuleux. Il y aurait environ 56 essais. Pourrait-il y avoir un moyen de code de mon script python?
(Là encore, je n'ai besoin de savoir, c'est quand un stimulus est réellement affiché. Cette méthode permettrait de m'assurer que le stimulus s'affiche lorsque je veux qu'il soit, une approche top-down. Sur l'autre main, je pouvais prendre une approche plus ascendante s'il est plus facile de savoir à enregistrer lorsque l'ordinateur est en fait une chance pour l'afficher.)
Ouais, j'en suis sûr. Les effets que je m'attends à voir sont en vol stationnaire à 45 ms. Bien sûr, chaque petite chose est "assez rapide", mais assez "rapide enoughs" peut compiler pour créer ou masque un effet.
D'autres choses qui se passent dans le même temps, il peut causer des multiples ms de latence de la gigue, qui pourrait être trop pour de nombreuses raisons, même lors de la mesure de l'homme des réponses (car ils réduisent la précision de trop). Malheureusement, cela ne peut pas être résolu à partir de l'espace utilisateur, regarde dans linux, pour un OS qui est (relativement) facile à utiliser et facile-les capacités en temps réel. Encore, sans doute pas quelque chose que vous pouvez entreprendre vous-même, malheureusement. Utiliser un CS étudiant diplômé.
Si GUI événements et les systèmes d'exploitation courants sont trop lents ou peu fiable pour vos besoins, Python peut-être le mauvais langage de programmation pour commencer.
OriginalL'auteur Jenna Zeigen | 2011-08-16
Vous devez vous connecter pour publier un commentaire.
Quand les gens parlent d'informatique en temps réel, ce qu'ils veulent dire, c'est que le temps de latence d'une interruption (le plus souvent mis en valeur par une minuterie) pour l'application du code de la manipulation d'interruption en cours d'exécution, est à la fois petite et prévisible. Ensuite, cela signifie qu'un processus de contrôle peut être exécuté à plusieurs reprises à très précise des intervalles de temps ou, comme dans votre cas, d'événements externes peuvent être programmés de manière très précise. La variation dans le temps de latence est généralement appelé "jitter" - 1 ms maximum de gigue signifie qu'une interruption d'arriver à plusieurs reprises pour avoir un temps de latence de réponse qui varie au plus de 1ms.
"Petit" et "prévisible" sont à la fois en termes relatifs et quand les gens parlent de la performance en temps réel qu'elles représentent 1µs maximum de gigue (des gens qui construisent des onduleurs pour la transmission de puissance se soucient de ce genre de performances, par exemple) ou qu'ils pourraient dire quelques millisecondes maximum de gigue. Tout dépend des exigences de l'application.
En tout cas, Python n'est pas susceptible d'être le bon outil pour ce travail, pour quelques raisons:
malloc
ou C++new
) parce que la quantité de temps qu'ils prennent n'est pas prévisible. Python soigneusement cache ce que vous, ce qui rend très difficile le contrôle de la latence. Encore une fois, à l'aide de beaucoup de ces belles off-the-shelf bibliothèques ne fait qu'aggraver la situation.mlockall
en quelque part, mais toute nouvelle allocation va bouleverser les choses).J'ai une question plus fondamentale. Vous ne dites pas si votre bouton est un bouton physique ou de l'une sur l'écran. Si c'est l'écran, le système d'exploitation va imposer une imprévisibles temps de latence entre le physique bouton de la souris de la presse et de l'événement d'arriver à votre application en Python. Comment allez-vous ce phénomène? Sans plus de précision de la mesure, comment allez-vous vous même de savoir si elle est là?
Ce sera peut-être moi malentendu
mlockall()
- je pense qu'il y a une option pour verrouiller à la fois actuelles et futures allocations de RAM physique, auquel cas les allocations futures ne serait pas bouleversé (comme beaucoup - l'allocation dynamique est toujours non-déterministe, et devient pire que la RAM se remplit).OriginalL'auteur Tom
Python n'est pas, en puriste, un langage en temps réel - qu'il a trop de bibliothèques et des fonctions de bare-bones rapide. Si vous êtes déjà passer par un OS bien que, par opposition à un système embarqué, vous avez déjà perdu beaucoup de vrai temps réel. (Quand j'entends des "temps réel" je pense que le temps qu'il faut un code VHDL à l'écoulement à travers les fils d'un FPGA. D'autres personnes l'utilisent pour dire "j'ai frappé un bouton et il fait quelque chose qui est, de mon lent point de vue humain, instantanée". Je vais supposer que vous êtes à l'aide de la dernière interprétation en temps réel.)
Par stimulation de l'écran et appuyez sur le bouton de détection, je suppose que vous voulez dire que vous avez quelque chose (par exemple) comme un procès où vous montrez une personne d'une image et de leur demander de cliquer sur un bouton pour identifier l'image ou de confirmer qu'ils ont vu - peut-être pour tester la vitesse de réaction. Sauf si vous êtes inquiet au sujet de précision à la milliseconde (qui doit être négligeable par rapport au temps pour la réaction de l'homme), vous devriez être en mesure de faire un test comme ceci en utilisant python. Pour travailler sur l'interface graphique, regarder dans Tkinter: http://www.pythonware.com/library/tkinter/introduction/. Pour travailler sur la synchronisation entre le stimulus et d'appuyer sur un bouton, regarder l'heure, docs: http://docs.python.org/library/time.html
Bonne chance!
Vous pouvez le profil de votre code (docs.python.org/library/profile.html) pour voir ce que votre gal. Je pense que vous voulez compiler des statistiques sur le temps de latence de votre logiciel à intégrer dans les marges d'erreur des résultats.
Ici, les mots, les boues, les eaux de nouveau: "bare bones rapide". En temps réel n'implique pas rapide, mais seulement qu'il est une stricte temps de réponse maximum pour un événement donné. De nombreux systèmes sont rapides et beaucoup de non-systèmes temps réel sont plus rapides que la plupart des systèmes en temps réel et encore peut/va rencontrer des retards inacceptables.
OriginalL'auteur
Parce que vous essayez d'obtenir une mesure scientifique sur un temps de retard dans la précision à la milliseconde, je ne peux pas recommander un processus est soumis à des tranches de temps sur un ordinateur universel. Si implémenté en C ou Java ou Python, si elle s'exécute dans un temps en mode partagé, alors comment pouvons-le résultat sera-t-elle vérifiable? Vous pourriez être mis au défi de prouver que le CPU ne jamais interrompu le processus lors d'une mesure, ce qui fausse les résultats.
On dirait que vous devez construire un dispositif dédié à cet effet, avec un circuit d'horloge que les tiques à un taux connu et peut mesurer le nombre discret de tiques qui se produisent entre le stimulus et la réponse. Cet appareil peut être contrôlé par un logiciel qui n'a pas de telles contraintes temporelles. Peut-être que vous devriez poster cette question à la Génie Électrique échange.
Sans un dispositif dédié, vous aurez à développer réellement des logiciels en temps réel, en termes de systèmes d'exploitation modernes, s'exécute dans le noyau et n'est pas sujet à changement de tâche. Ce n'est pas facile à faire, et il faut beaucoup d'efforts pour obtenir ce droit. Plus de temps, je suppose, que vous passez à la construction d'un logiciel dédié contrôlable par l'appareil pour votre but.
OriginalL'auteur wberry
Plupart des systèmes d'exploitation' interruptions sont variables assez pour ruiner le moment dans votre expérience, quel que soit votre langage de programmation. Python ajoute son propre manque de fiabilité. Windows interruptions sont particulièrement mauvais. Dans Windows, la plupart des interruptions sont accessibles en environ 4 millisecondes, mais il interrompt dernier, plus de 35 millisecondes! (Windows 7).
Je vous recommande d'essayer le PsycoPy application pour voir si va travailler pour vous. Il aborde le problème en essayant de faire la carte graphique ne le travail en openGL, cependant, certains de il code s'exécute toujours en dehors de la carte graphique et est soumis à l'exploitation du système d'interruptions. Votre code python peut ne pas être compatible avec PsycoPy, mais au moins vous restez en Python. PsycoPy est particulièrement bon à montrer visual stimulations sans les problèmes de synchronisation. Voir cette page dans leur documentation pour voir comment vous permettrait de gérer l'appui sur un bouton: http://www.psychopy.org/api/event.html
Pour résoudre votre problème de la bonne façon, vous avez besoin d'un système d'exploitation temps réel, tels que LinuxRT ou QNX. Vous pourriez essayer votre application python dans un de ces pour voir si l'exécution de python en temps réel de l'environnement est assez bon, mais même python introduit la variabilité. Si python décide de collecter les ordures, vous aurez un problème. Python lui-même n'est pas en temps réel.
National Instruments vend une installation, qui permet de programmer en temps réel dans un très facile à utiliser un langage de programmation appelé LabviewRT. LabviewRT pousser votre code dans un FPGA de la carte fille qui fonctionne en temps réel. Il est cher.
Je vous suggère fortement de ne pas simplement réduire ce problème, mais résoudre, sinon, votre évaluateurs devront être mal à l'aise.
OriginalL'auteur lee
Si vous exécutez le code Python sur la machine Linux, rendre le noyau basse latence (préemptif).
Il y a un drapeau pour elle lors de la compilation du noyau.
Assurez-vous que les autres processus en cours d'exécution sur la machine sont minimales afin de ne pas interrompre le noyau.
Attribuer plus la priorité de la tâche à votre script Python.
OriginalL'auteur nvd