Comment écrire les pilotes de périphérique en Javascript?

est-il possible d'écrire des pilotes matériels en Javascript? Quelles seraient les étapes nécessaires pour une telle mission?

en outre, je n'étais pas sûr où poster ceci, donc toute suggestion à ce sujet sont également les bienvenus. J'espère que c'est la localisation précise de la question.

16
demandé sur Leila Hamon 2012-08-22 21:10:08

6 réponses

Non. Pas vraiment. Je veux dire, vous pourriez écrire quelque chose qui compile Javascript en C, mais ce serait assez fou. Peu comme essayer d'utiliser une cuillère comme une tronçonneuse.

Apprendre C. C'est le bon outil pour le travail.

22
répondu Rich Bradshaw 2012-08-22 17:12:01

Oh, mon Dieu. Ecrire un pilote dans js? Pourquoi? Je veux dire, vous pourriez écrire un emballage javascript pour quelque chose en C ou C++, peut-être, mais pourquoi voudriez-vous faire cela? Les pilotes de périphérique communiquent avec la machine à un niveau assez bas (niveau matériel). Javascript ne l'est pas. Javascript est un langage web (bien, la plupart du temps).

comme L'a dit Rich Bradshaw, c'est comme utiliser une cuillère comme une tronçonneuse. Mais pour moi, ce serait plutôt comme essayer d'utiliser un canoë comme réservoir.

2
répondu Phillip Schmidt 2012-08-22 17:17:21

Wow, cette idée est insensée, IMHO vous choisissez un langage de programmation pour résoudre un problème ou une tâche et pas l'inverse. Je travaille avec des pilotes de périphérique et des trucs liés au noyau OS, mais juste parce que je peux programmer en C, je n'utilise pas C pour faire d'autres tâches telles que L'administration Linux pour mon périphérique embarqué; à la place, j'utilise quelque chose de haut niveau comme Bash, Perl ou Python (selon mon humeur :)).

pourquoi vous intéressez-vous à js? En fait, vous devriez comprendre les internes de le langage de programmation pour savoir ce que vous essayez de réaliser et aussi vous avez besoin de savoir comment votre programme interagira avec vous OS pour communiquer avec les registres de périphériques et les interruptions entre autres choses.

2
répondu Mr_GQ 2012-08-24 05:30:35

aussi stupide que cela paraisse, ceci est maintenant fait pour divers appareils IOT. Mais dans tous les cas que j'ai vu, l'appareil lui-même inclut une version modifiée du moteur V8 JS. Le téléphone Mozilla expose une interface d'accès HW, mais encore une fois ce n'est pas vraiment un pilote de périphérique "réel", mais plutôt une API squelette exposée à JS.

je vous conseille vivement D'apprendre L'objet Pascal ou C/C++ puisqu'ils sont les seuls vrais langages" réels " adaptés à ce type de travail. Traditionnellement C est le plus utilisé le langage, mais c et Pascal est essentiellement la même chose avec une syntaxe différente. C++ builder et objet Pascal partagent même le même codegen, avec parser/lexer différent en haut.

cela dit, il n'y a pas de raison réelle pour que certains pilotes personnalisés puissent être codés en NodeJS. Sous Linux, beaucoup de middleware HW est d'abord écrit en Python, pour être finalisé en C. Donc tout est possible, tant que quelqu'un a adapté le runtime en ce qui concerne l'accès au matériel. FreePascal et Python permet L'accès GPIO sur le Raspberry PI 1-2 un claquement. Mais il ne fait aucun doute que les langages réels, comme C/C++ et objet Pascal ont le dessus.

avec une signification" réelle " compilée pour le code machine de la plateforme, et une référence irréelle aux moteurs de script comme python et javascript.

2
répondu Jon Lennart Aasenden 2016-02-28 01:22:19

N'importe quelle langue peut être utilisée pour écrire le pilote de périphérique, à condition que quelques conditions doivent être remplies:

  1. accès Direct à la mémoire. Regardez ce code source:

https://patchwork.kernel.org/patch/8163061/

en tant que pilote de périphérique, vous pouvez accéder directement à la mémoire virtuelle ou à la mémoire physique (dans le cas de DMA), et donc contourner la configuration de la mémoire virtuelle par le MMU est nécessaire. Accéder directement à la mémoire virtuelle vous connaissez l'adresse virtuelle et vous voulez la lire directement.

Java ou Javascript n'a pas de construction de langage pour lire la mémoire via une adresse connue directement.

  1. assembler tâches sensibles au langage: accéder au matériel nécessite très souvent des instructions spéciales d'assemblage, comme désactiver l'interruption, ou passer d'un CPU à un autre, ou diffuser des messages inter-CPU, etc. Il n'y a pas de construction Java pour faire tout cela, peut-être même pas C langue. C'est pourquoi la combinaison de l'assemblage C + est souvent nécessaire. Mais il n'y a aucun moyen de combiner Java et l'assemblage.

  2. langage natif vs langage interprété: tout langage interprété devra passer par un interpréteur pour exécuter le langage. En Javascript ou Java, vous avez besoin de JVM pour exécuter le Java. Donc si vous avez besoin de Java dans le noyau, alors vous aurez besoin d'un JVM intepreter dans le noyau. Ce n'est pas impossible - le noyau Linux récent a un BPF intepreter tournant dans le noyau, donc vous avez une VM BPF qui tourne dans le noyau:

https://events.linuxfoundation.org/sites/events/files/slides/bpf_collabsummit_2015feb20.pdf

https://lwn.net/Articles/599755/

L'idée de Java comme pilote de périphérique a déjà été implémentée, en tant que document/projet de recherche (pour Sun Solaris OS):

http://dl.acm.org/citation.cfm?id=1215998

http://www.c0t0d0s0.org/archives/2587-Device-driver-in-Java.html

mais je ne sais pas comment le problème de l'accès direct à la mémoire est résolu.

pourtant, il est toujours possible de concevoir un système dans lequel une partie des tâches peut être effectuée par un module de bas niveau, qui est dépendant de C/assemblage, et d'autres composants qui peuvent être écrits dans un langage non-C, comme le montre cet article récent (Usenix 2009):

https://www.usenix.org/legacy/event/usenix09/tech/full_papers/renzelmann/renzelmann_html/

voir le diagramme ci-dessous:

Cliquez pour voir l'image

0
répondu Peter Teoh 2017-08-03 07:31:00

nous avons fait face à un problème similaire, nous avions besoin d'accéder au matériel via notre plate-forme en ligne et de le montrer en direct de sorte que notre solution a été d'acheter un adaptateur qui donne ip au port matériel de sorte que nous sommes en mesure de parler avec lui en utilisant noeud.JS peut-être que vous pouvez trouver une solution similaire

0
répondu aaron0207 2017-08-03 07:34:27