Python sur un Fonctionnement en Temps Réel du Système (RTOS)
J'ai l'intention de mettre en œuvre à petite échelle, un système d'acquisition de données sur un système d'exploitation temps réel de la plateforme. (Sur QNX ou une RT-Linux système.)
Autant que je sache, ces travaux sont effectués à l'aide de C /C++ pour obtenir les la plupart hors du système. Cependant, je suis curieux de savoir et que vous voulez apprendre certains ont connu les opinions avant, je aveuglément sauter dans le codage de l'action s'il serait possible et le plus sage de tout écrire en Python (à partir de la basse-instrument au niveau de l'interfaçage par le biais d'un brillant interface utilisateur graphique). Si pas, le mélange avec le calendrier parties critiques de la conception avec un "C", ou de l'écriture tout en C et même pas de mettre une ligne de code Python.
Ou au moins d'emballage le code C à l'aide de Python pour fournir un accès plus facile au système.
De quelle manière voulez-vous me conseiller? Je serais heureux si vous pointez une même conception de cas et lectures supplémentaires.
Merci
NOTE1: La raison de mettre l'accent sur QNX est due, nous avons déjà un QNX 4.25 base de système d'acquisition de données (M300) pour notre atmosphérique de mesure des expériences. C'est un système propriétaire et nous ne pouvons pas accéder à l'intérieur de lui. En regardant de plus sur QNX pourrait être avantageux pour nous, puisque 6.4 a un universitaire libre option de licence, est livré avec Python 2.5, et une récente version de GCC. Je n'ai jamais testé une RT-Linux système, ne savent pas comparable à QNX en termes de stabilité et d'efficacité, mais je sais que tous les membres de Python, de l'habitat et de la non-outils Python (comme Google Earth) que le nouveau système pourrait être développé sur fonctionne la plupart du temps out-of-the-box.
Pour la plupart des mesures 1 hz fréquence d'échantillonnage est satisfaisante. Cependant, il existe des instruments qui doivent être échantillonnés à des taux élevés autour de 100Hz. Habituellement super-rapide des appareils de mesure (comme un Nuage de Particules Imager) vient avec leur système de données --dont ceux-ci sont au-delà de la portée de mon intention initiale. Et oui, le système actuel fonctionne sur un PC pour les tâches d'acquisition de où beaucoup de conseils sur une interface avec différents équipements. Je pense qu'il serait bon de l'appeler comme une plate-forme intégrée, plutôt que juste un PC de bureau classique.
OriginalL'auteur Gökhan Sever | 2009-09-10
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas parler pour chaque d'acquisition de données de configuration, mais plus d'entre eux passent la plupart de leur "temps réel des opérations de" attente pour les données à venir -- au moins ceux avec qui j'ai travaillé.
Puis, quand les données ne viennent, vous devez immédiatement enregistrer l'événement ou de répondre à ça, et puis c'est le retour au jeu d'attente. C'est généralement les plus critiques d'une partie d'un système d'acquisition de données. Pour cette raison, je voudrais généralement dire stick C pour les I/O de parties de l'acquisition de données, mais il n'y a pas de raisons impérieuses de ne pas utiliser Python sur le non-temps-critique portions.
Si vous avez assez lâche exigences -- seuls besoins de la précision à la milliseconde, peut-être-qui ajoute un peu plus de poids à tout faire en Python. Comme la mesure du temps de développement, si vous êtes déjà à l'aise avec le langage Python, vous aurait probablement un produit fini considérablement plus tôt si vous le faites tout en Python et refactoriser seulement comme des goulets d'étranglement apparaissent. Faire le gros de votre travail en Python il sera aussi plus facile de tester votre code, et comme une règle générale, il y aura moins de lignes de code et donc moins de place pour les bugs.
Si vous avez besoin spécifiquement de la multi-tâche (pas de multi-fil), Stackless Python pourraient être bénéfiques. C'est comme multi-threading, mais les fils (ou tasklets, dans Stackless lingo) ne sont pas des OS au niveau des threads, mais Python/au niveau de l'application, de sorte que les frais généraux de la commutation entre les tasklets est significativement réduit. Vous pouvez configurer Stackless d'effectuer plusieurs tâches en collaboration ou de manière préventive. Le plus grand inconvénient est que le blocage IO généralement le bloc de votre ensemble de tasklets. De toute façon, vu que QNX est déjà un système en temps réel, il est difficile de spéculer sur le Stackless serait intéressant de l'utiliser.
Mon vote serait de prendre le bien-Python-que-parcours possible -- je le vois comme un faible coût et de profit élevé. Si et quand vous avez besoin de le réécrire en C, vous aurez déjà code de travail pour commencer à partir.
Stackless seulement modifie une installation de Python -- il remplace un couple de fichiers de base que ne pas affecter toutes les bibliothèques Python. Il se déplace loin de l'aide de la pile C, mais il ne devrait pas affecter de même des bibliothèques écrites en C à l'interface avec Python. Jouer avec Stackless un peu (vraiment facile à installer sur Windows), voir si cela convient à vos besoins. Je n'ai pas construit Stackless à partir de la source, donc je ne peux pas commenter sur toutes les difficultés envisagées avec QNX.
OriginalL'auteur Mark Rushakoff
J'ai construit plusieurs Python soft en temps réel (RT) des systèmes, dans le primaire, les temps de cycle de 1 ms à 1 seconde. Il existe quelques stratégies et les tactiques que j'ai appris le long du chemin:
Utilisation de thread/multitraitement seulement de décharger les non-RT travail à partir du thread principal, où les files d'attente entre les threads sont acceptables et coopérative threading est possible (pas de préemption fils!).
Éviter le GIL. Ce qui signifie non seulement en évitant les threads, mais aussi pour éviter les appels à la plus grande mesure du possible, en particulier au cours du temps des opérations critiques, sauf s'ils sont non-bloquant.
Utilisation des modules en C lors de la pratique. Les choses (en général) aller plus vite avec C! Mais surtout si vous n'avez pas à écrire votre propre: Séjour en Python à moins qu'il n'y a vraiment pas d'autre alternative. L'optimisation de C module de performance est un pain PITA, en particulier lors de la traduction à travers le Python-C interface devient la partie la plus coûteuse du code.
Python, utiliser des accélérateurs pour accélérer la vitesse de votre code. Mon premier RT Python projet a largement bénéficié de Psyco (ouais, j'ai fait cela un certain temps). Une des raisons que je vais rester avec Python 2.x aujourd'hui est PyPy: les Choses toujours aller plus vite avec LLVM!
N'ayez pas peur de occupé-attendre lors de la critique timing est nécessaire. Temps d'utilisation.sleep() à "glisser" sur l'heure souhaitée, puis occupé-attendre au cours de la dernière 1-10 ms. J'ai été en mesure d'obtenir reproductible performance avec l'auto-timing de l'ordre de 10 microsecondes. Assurez-vous que votre Python tâche est exécutée sur max OS priorité.
Numpy ROCHERS! Si vous faites des "live" de google analytics ou des tonnes de statistiques, il est PAS façon d'obtenir plus de travailler plus vite et avec moins de travail (moins de code, moins de bugs) que par l'utilisation de Numpy. Pas dans toute autre langue que je connais, y compris C/C++. Si la majorité de votre code se compose de Numpy appels, vous serez très, très rapide. Je ne peux pas attendre pour le Numpy port de PyPy être achevé!
Être conscient de quand et comment Python ne collecte des ordures. Surveiller votre utilisation de la mémoire et de la force de GC en cas de besoin. Assurez-vous de désactiver explicitement GC au cours du temps des opérations critiques. Tous mes RT Python systèmes de fonctionner en permanence, et Python aime porc mémoire. Attention de codage peut éliminer presque toutes allocation dynamique de la mémoire, dans ce cas, vous pouvez désactiver complètement GC!
Essayez d'effectuer un traitement par lots dans la mesure du possible. Au lieu de traiter des données à l'entrée, des taux, essayez de traiter des données à la vitesse de sortie, qui est souvent beaucoup plus lent. Le traitement par lots, il est plus commode de rassembler de niveau supérieur de la statistique.
Ai-je mentionné à l'aide de PyPy? Eh bien, il vaut la peine de mentionner encore une fois.
Il y a beaucoup d'autres avantages à l'utilisation de Python pour la RT de développement. Par exemple, même si vous êtes assez certain que votre langue cible ne peut pas être de Python, il peut payer des avantages énormes pour développer et déboguer un prototype en Python, puis l'utiliser comme à la fois un modèle et de l'outil de test pour le système final. J'avais été à l'aide de Python pour créer rapidement des prototypes de "parties" d'un système pendant des années, et de créer rapidement des'n'dirty test des Interfaces graphiques. C'est la façon dont mon premier RT Python est entré en existence: Le prototype (+Psyco) a été assez rapide, même avec le test GUI de course!
-BobC
Edit: j'ai Oublié de mentionner la croix-plate-forme de prestations: Mon code s'exécute un peu partout, avec une) pas de recompilation (ou le compilateur dépendances, ou la nécessité de la croix-des compilateurs), et b) presque pas de plate-forme dépendant de code (principalement pour les divers trucs comme la manipulation de fichiers et de série I/O). Je peux développer sur Win7 x86 et déployer sur Linux-ARM (ou tout autre OS POSIX, qui ont tous un Python de ces jours). PyPy est principalement x86 pour l'instant, mais le BRAS de port évolue à un rythme incroyable.
OriginalL'auteur BobC
Généralement la raison avancée contre l'utilisation d'un langage de haut niveau dans un réel contexte de temps est incertitude -- lorsque vous exécutez une routine une fois, il peut prendre 100us; la prochaine fois que vous exécutez la même routine, il peut décider de prolonger une table de hachage, l'appel de malloc, puis malloc demande au noyau pour plus de mémoire, ce qui pourrait faire quelque chose de revenir instantanément à retourner millisecondes plus tard, de retour secondes plus tard à erroring, rien de ce qui est immédiatement apparent (ou contrôlable) à partir du code. Alors que, théoriquement, si vous l'écrivez en C (ou même moins) que vous pouvez prouver que vos chemins critiques "toujours" (sauf meteor strike) exécuter dans X temps.
Oui, prenez-le avec autant de grains de sel que vous le souhaitez. Je pense que peut-être mon argument doit être "si tout ça sonne comme wacko non-sens pour vous, alors vous n'êtes pas en temps réel assez à se soucier de la langue que vous écrivez dans".
À ce stade, n'est pas inférieure à C. et pas l'intention de l'appelant de l'assemblée opcodes de Python à l'aide d'un outil comme CorePy. Le temps de criticité est important, mais pas si important que cela pour me passer de l'utilisation de l'Ada.
OriginalL'auteur hobbs
Notre équipe ont fait un travail combinant plusieurs langues sur QNX et eu beaucoup de succès avec cette approche. À l'aide de python peut avoir un grand impact sur la productivité, et des outils comme SWIG et ctypes rendre vraiment facile à optimiser le code et combinent les caractéristiques des différentes langues.
Toutefois, si vous écrivez un rien de temps critique, il devrait presque certainement être écrit en c. Faire cela signifie que vous éviter les coûts implicites d'une interprétation d'une langue comme le GIL (Mondial Interprète De Verrouillage), et la contention sur de nombreuses petites allocations de mémoire. Ces deux choses peuvent avoir un grand impact sur la façon dont votre application effectue.
Aussi python sur QNX a tendance à ne pas être 100% compatible avec d'autres distributions (par exemple/il y a parfois des modules manquants).
2.5 est sur QNX 6.4.x, et si ma mémoire est bonne PyQt 4 binaires doit être quelque part sur un dépôt de tiers. Je n'ai pas vu un NumPy port encore, n'ont pas essayé de construire une bibliothèque de moi-même. Je suis sûr que beaucoup de piratage serait nécessaire de faire une partie de leur demi de travail. C'est pourquoi j'estime à l'aide d'une RT-Linux solution sur une QNX, mais j'ai besoin de plus d'entrée et de sources sur ce.
pourriez-vous me donner quelques conseils sur où trouver de tels projets utilisant Python - C approche sur un système d'exploitation temps réel du système? Apparemment, c'est un peu cachée sur le web, besoin de creuser plus profond, ou il suffit de prendre à l'essai et l'erreur d'approche.
Les versions de python sur QNX sont fourni et hébergé par Manivelle logiciel cranksoftware.com/downloads. Vous aurez de bons conseils sur OpenQNX, openqnx.com, et à Foundary27 community.qnx.com/sf/sfmain/do/home Comme pour la prise en main, c'est assez beaucoup dépend de ce que vous êtes à la recherche todo. Nous construisons de la croix-plate-forme, et donc l'utilisation de QNX des fonctionnalités spécifiques sont minimes. Mais si je pouvais donner une suggestion, assurez-vous que si vous avez beaucoup de temps critique IO (via les ports COM, matériel personnalisé ou de l'IPC), assurez-vous de faire du prototypage pour obtenir votre droit de conception.
OriginalL'auteur Andrew Walker
Une remarque importante: Python pour QNX est généralement disponible uniquement pour les architectures x86.
Je suis sûr que vous pouvez le compiler pour ppc et les autres architectures, mais ce n'est pas d'aller travailler hors de la boîte.
OriginalL'auteur XPav