Tengo que cronometrar la diferencia horaria entre alta -> baja y baja -> borde de señal alta en los pines GPIO. He escrito un programa simple que hace esto. Después de ejecutarlo durante algún tiempo, estuve bastante contento con el resultado (variaciones de 0,01 s). Pero de vez en cuando había un error de 0,5 s. Estaba pensando que esto puede deberse a algún otro proceso del sistema en ejecución en ese momento. Entonces mi pregunta es:
¿Puedo reservar un núcleo de procesador solo para mi programa y dejar otros 3 núcleos para el sistema?
Estoy usando Raspbian Jessie Lite, así que creo que 3 núcleos serán suficientes para ejecutarlo.
operating-systems
process
Modelo no estándar
fuente
fuente
Respuestas:
Dedicar un núcleo es probablemente exagerado.
Te sugiero que pruebes mi biblioteca pigpio . De manera predeterminada, cronometrará los cambios de nivel de GPIO en 10 µs.
Como prueba rápida, le sugiero que mire este ejemplo de Python , que imprimirá cualquier transición de nivel GPIO y el tiempo en microsegundos desde la última transición en ese GPIO.
pigpio no está instalado por defecto en Jessie Lite. Instale la última versión del sitio vinculado o instale la versión anterior en los repositorios.
sudo apt-get install pigpio python-pigpio python3-pigpio
fuente
Puede bloquear su programa a un núcleo utilizando
schedutils
como se describe en este artículo de Cyberciti :Sin embargo, todavía se pueden programar otros procesos en el mismo núcleo. Entonces, lo segundo que debe hacer es asegurarse de que su comando se ejecute con la prioridad más alta usando el comando nice (esto le dirá al kernel de Linux que otros procesos deben ser eliminados si es necesario). Comience su programa de esta manera:
Hay otras razones posibles para sus problemas de tiempo. No es tan fácil hacer nada al respecto:
Hay formas de hacer que su proceso sea en tiempo real , lo que significa que se ejecutará con ciertas garantías de tiempo. El problema con esto es que todo lo demás podría ser más lento y es un tema complejo. Si quieres pasar por este agujero del conejo, te sugiero que comiences a leer sobre procesos en tiempo real en Linux .
fuente
Dado que tiene requisitos de tiempo, Raspberry Pi ya no es la plataforma adecuada para esto. No es una plataforma en tiempo real y muchas fuentes diferentes de interferencia pueden desviar el tiempo.
En su lugar, debe usar un microcontrolador para medir este tiempo, preferiblemente usando interrupciones, y pasar la información al Pi más tarde.
fuente
Según su requisito, no creo que necesite usar un procesador de núcleo único. Lo que necesita es asegurarse de que su programa se ejecute todo el tiempo. Para lograr eso, puede establecer la prioridad de su programa muy alta, para que no se vea afectado por ningún otro proceso.
Hasta donde yo sé, el SO (SO de uso general) que utilizamos no está diseñado para ser utilizado en sistemas en tiempo real, por lo que si desea ejecutar su proceso en tiempo real para que ningún otro proceso lo perturbe, debe ir para un sistema operativo en tiempo real (RTOS). Tal vez se les ocurra una selección central. :)
fuente