Puis-je avoir 1 cœur de processeur uniquement pour mon programme?

12

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.

NonStandardModel
la source
4
Je suppose que vous interrogez en boucle l'état de la broche GPIO. Cela dépend fortement de la façon dont le système d'exploitation décide d'exécuter votre programme, qui passera la majeure partie de son temps à occuper le processeur sans rien faire d'utile. Vous voudrez peut-être chercher un moyen de configurer une interruption sur une broche GPIO donnée, que vous pouvez utiliser pour laisser votre programme dormir entre les bords du signal sur les broches GPIO.
Florian Castellane
4
Vous ne savez pas quel est votre projet, mais parfois un microcontrôleur convient mieux, surtout lorsque vous avez besoin d'un système plus proche du temps réel. Arduino offre de nombreuses options et vous pouvez écrire votre programme en C / C ++.
SnakeDoc
@Florian Il y a une fonction dans RPi.GPIO qui est similaire à l'interruption. Il bloquera le programme jusqu'à ce que le bord soit détecté (source: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel
@SnakeDoc Je sais que le microcontrôleur est meilleur. J'espérais l'éviter, car je n'ai pas besoin de précision en microsecondes. 1/100 de seconde est plus que suffisant. De plus, j'ai juste besoin de la différence de temps, donc s'il y a un retard, j'espérais que ce serait le même pour le démarrage et l'arrêt. Si cela ne fonctionne pas, je dois utiliser un microcontrôleur connecté à RPi pour stocker les données.
NonStandardModel
1
Ou lancez un système d'exploitation en temps réel sur le PI. Le problème avec votre configuration, c'est que cela dépend du "meilleur effort" de l'OS. Selon ce qui se passe d'autre en même temps que votre programme demande un accès privilégié aux GPIO, il peut être mis en file d'attente derrière les autres tâches que le système d'exploitation exécute à cet instant. Votre programme utilisateur aura une priorité inférieure aux tâches système. Il y a aussi une préemption, ce qui signifie que pendant l'exécution de votre programme, il peut être "suspendu et" mis de côté "par le système d'exploitation pour qu'un autre processus s'exécute, ce qui signifie que vos observations de synchronisation pourraient être faussées.
SnakeDoc

Réponses:

13

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

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)
joan
la source
Je vais essayer votre bibliothèque pigpio. Pour le moment, je dois terminer un autre projet, mais je vais y revenir. Je ferai rapport dans quelques semaines. Je vous remercie!
NonStandardModel
4

Vous pouvez verrouiller votre programme sur un cœur en utilisant schedutilscomme décrit dans cet article Cyberciti :

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

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:

nice -n -20 your-program

Il y a d'autres raisons possibles à vos problèmes de timing. Ce n'est pas aussi facile de faire quoi que ce soit:

  • Si vous programmez en Python, un récupérateur de place interrompt parfois votre programme pour libérer de la mémoire inutilisée.
  • Les interruptions permettent au CPU de gérer autre chose que vous le souhaitez. Par exemple, des paquets réseau ou d'autres entrées / sorties.
  • Si votre programme dort beaucoup, il peut y avoir d'autres processus qui remplissent les caches CPU (cache L1 / L2). Cela vous oblige à attendre l'accès à la RAM.
    • Pire encore si votre RAM est pleine afin que votre processus soit échangé sur le disque car les cartes SD sont lentes.

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 .

Emil Vikström
la source
2
Plutôt qu'agréable, il serait préférable de donner au processus la priorité en temps réel, ce qui garantirait qu'il s'exécute de préférence aux processus non en temps réel.
joan
Bon point, je vais ajouter une note à ce sujet.
Emil Vikström
1
"gc.disable ()" que se passe-t-il si vous désactivez le garbage collector?
Keine
@Keine Vous pouvez obtenir une fuite de mémoire. Disons que vous avez un objet A qui a une variable qui pointe vers B. Python suivra cette référence comme un nombre, il sait que B a 1 objet pointant vers lui. Retirez A lorsque vous n'en avez plus besoin. Le nombre de références pour B diminuera, et s'il atteint 0, Python peut également libérer B. C'est ce qu'on appelle le comptage des références. Mais dire maintenant que B ont une référence de retour à A. Maintenant , vous avez un groupe d'objets pointant vers l'autre. Aucun d'entre eux n'atteindra 0 et ne sera libéré. GC peut trouver de tels clusters et les supprimer lorsque le programme principal ne pointe pas "dans" le cluster.
Emil Vikström
1
J'ajouterai les suggestions que vous avez faites à mon projet. Mais j'espère éviter des sujets trop complexes. Dans ce cas, je suppose qu'il est préférable de faire une détection d'interruption du microcontrôleur et de la connecter à RPi juste pour sauvegarder les données. Je vous remercie!
NonStandardModel
2

É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.

Maxthon Chan
la source
1
N'est-il pas possible d'obtenir des interruptions sur les broches GPIO d'un Raspberry Pi?
Florian Castellane
Cela dépend sûrement de la présence d'une autre partie des exigences de conception qui rend une machine Linux plus appropriée qu'un MCU. RPi est capable de gérer cette tâche correctement, tout comme un MCU cadencé à 10 MHz.
Sean Houlihane
1

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. :)

Vishwajeet Vishu
la source
1
Existe-t-il de bons RTOS gratuits?
Keine
RTLinux et Vxworks sont des exemples de RTOS et ils sont également bons. Mais vous devez étudier le système d'exploitation (quel était l'objectif de sa création) avant l'installation, afin qu'il puisse répondre à vos besoins.
Vishwajeet Vishu du