Preciso calcular a diferença horária entre a borda do sinal alto -> baixo e baixo -> alto nos pinos GPIO. Eu escrevi um programa simples que faz isso. Depois de executá-lo por algum tempo, fiquei muito feliz com o resultado (variações de 0,01 s). Mas de tempos em tempos havia um erro de 0,5 s. Eu estava pensando que isso pode ser devido a algum outro processo do sistema em execução naquele momento. Então, minha pergunta é:
Posso reservar um núcleo de processador apenas para o meu programa e permitir outros 3 núcleos para o sistema?
Estou usando o Raspbian Jessie Lite, então acho que 3 núcleos serão suficientes para executá-lo.
operating-systems
process
NonStandardModel
fonte
fonte
Respostas:
Dedicar um núcleo provavelmente é um exagero.
Eu sugiro que você tente minha biblioteca pigpio . Por padrão, o tempo de GPIO mudará para 10µs.
Como um teste rápido, sugiro que você observe este exemplo Python , que imprimirá qualquer transição no nível GPIO e o tempo em microssegundos desde a última transição nesse GPIO.
O pigpio não está instalado por padrão no Jessie Lite. Instale a versão mais recente do site vinculado ou instale a versão mais antiga nos repositórios.
sudo apt-get install pigpio python-pigpio python3-pigpio
fonte
Você pode bloquear seu programa em um núcleo usando
schedutils
o descrito neste artigo da Cyberciti :Outros processos ainda podem ser agendados no mesmo núcleo. Portanto, a segunda coisa a fazer é garantir que seu comando seja executado com a maior prioridade usando o comando nice (isso informará ao kernel do Linux que outros processos devem ser antecipados, se necessário). Inicie seu programa desta maneira:
Existem outros motivos possíveis para os seus problemas de tempo. Não é tão fácil fazer nada sobre:
Existem maneiras de tornar seu processo em tempo real , o que significa que ele será executado com certas garantias de tempo. O problema disso é que tudo o mais pode ser mais lento e esse é um tópico complexo. Se você quiser descer por essa toca de coelho, sugiro que comece a ler sobre processos em tempo real no Linux .
fonte
Como você está tendo requisitos de tempo, o Raspberry Pi não é mais a plataforma apropriada para isso. Não é uma plataforma em tempo real e o tempo pode ser alterado por várias fontes diferentes de interferência.
Em vez disso, você deve usar um microcontrolador para medir esse tempo, de preferência usando interrupções, e passar as informações para o Pi posteriormente.
fonte
Conforme sua exigência, não acho que você precise usar um processador de núcleo único. O que você precisa é garantir que seu programa seja executado o tempo todo. Para conseguir isso, você pode definir a prioridade do seu programa muito alta, para que ele não seja perturbado por nenhum outro processo.
Tanto quanto eu conheço o SO (General Purpose OS), que usamos, não foi projetado para ser usado em sistemas em tempo real; portanto, se você deseja executar seu processo em tempo real, para que nenhum outro processo o perturbe, é necessário para um sistema operacional em tempo real (RTOS). Talvez eles apresentem a seleção principal. :)
fonte