Je dois chronométrer la différence de temps entre le front de signal haut -> bas et bas -> haut sur les broches GPIO. J'ai écrit un programme simple qui fait cela. Après l'avoir exécuté pendant un certain temps, j'étais assez satisfait du résultat (variations de 0,01 s). Mais de temps en temps, il y avait comme une erreur de 0,5 s. Je pensais que cela peut être dû à un autre processus système en cours d'exécution à ce moment-là. Ma question est donc:
Puis-je réserver un cœur de processeur uniquement pour mon programme et laisser 3 autres cœurs pour le système?
J'utilise Raspbian Jessie Lite, donc je pense que 3 cœurs suffiront pour le faire fonctionner.
operating-systems
process
NonStandardModel
la source
la source
Réponses:
Dédier un noyau est probablement exagéré.
Je vous suggère d'essayer ma bibliothèque pigpio . Par défaut, il chronomètre les changements de niveau GPIO à moins de 10µs.
Comme test rapide, je vous suggère de regarder cet exemple Python , qui imprimera toute transition de niveau GPIO et le temps en microsecondes depuis la dernière transition sur ce GPIO.
pigpio n'est pas installé par défaut dans Jessie Lite. Installez la dernière version du site lié ou installez l'ancienne version dans les référentiels.
sudo apt-get install pigpio python-pigpio python3-pigpio
la source
Vous pouvez verrouiller votre programme sur un cœur en utilisant
schedutils
comme décrit dans cet article Cyberciti :Cependant, d'autres processus peuvent toujours être planifiés sur le même noyau. Donc, la deuxième chose à faire est de vous assurer que votre commande s'exécute avec la priorité la plus élevée en utilisant la commande nice (cela indiquera au noyau Linux que d'autres processus doivent être anticipés si nécessaire). Démarrez votre programme de cette façon:
Il y a d'autres raisons possibles à vos problèmes de timing. Ce n'est pas aussi facile de faire quoi que ce soit:
Il existe des moyens de rendre votre processus en temps réel , ce qui signifie qu'il s'exécutera avec certaines garanties de synchronisation. Le problème avec cela est que tout le reste pourrait être plus lent, et c'est un sujet complexe. Si vous voulez descendre ce lapin, je vous suggère de commencer à lire sur les processus en temps réel sous Linux .
la source
Étant donné que vous avez des exigences de synchronisation, Raspberry Pi n'est plus la plate-forme appropriée pour cela. Ce n'est pas une plate-forme en temps réel et le timing peut être perturbé par de nombreuses sources d'interférences différentes.
Au lieu de cela, vous devez utiliser un microcontrôleur pour mesurer ce temps, de préférence à l'aide d'interruptions, et transmettre les informations au Pi plus tard.
la source
Selon vos besoins, je ne pense pas que vous ayez besoin d'utiliser un seul processeur. Ce dont vous avez besoin est de vous assurer que votre programme fonctionne tout le temps. Pour y parvenir, vous pouvez définir la priorité de votre programme très haut, afin qu'il ne soit pas perturbé par un autre processus.
Autant que je sache, le système d'exploitation (OS à usage général) que nous utilisons n'est pas conçu pour être utilisé dans des systèmes en temps réel, donc si vous souhaitez exécuter votre processus en temps réel afin qu'aucun autre processus ne le perturbe, vous devez aller pour un OS en temps réel (RTOS). Peut-être qu'ils proposeront une sélection de base. :)
la source