Estou usando uma chamada do sistema pselect no código do espaço do usuário para aguardar um pino GPIO para alternar. Eu sei que não deve demorar mais de 5 milissegundos para que esse toggle ocorra, e eu verifiquei esse tempo usando um oscope. No entanto, a chamada pselect confusa às vezes leva até 20 milissegundos para retornar.
Eu modifiquei o driver GPIO, a implementação pselect no kernel e a implementação pselect na biblioteca glibc, para que todos imprimissem a hora atual quando foram atingidos. Usando estes eu verifiquei que o driver GPIO e a implementação pselect do kernel são atingidos em tempo hábil, no entanto há entre 6 e 15 milissegundos entre quando a chamada do pselect do kernel retorna e a linha imediatamente após a chamada do sistema da glibc para o kernel. p>
Meu entendimento de como as chamadas do sistema são implementadas na biblioteca c é que a macro específica da arquitetura "INLINE_SYSCALL" alterna a CPU entre os modos usuário e kernel, passa parâmetros para o kernel, na verdade chama a função kernel e, em seguida, manipula a configuração errno se aplicável. No ARM essa lógica parece ser um par de instruções de montagem que eu esperaria não ter praticamente nenhum tempo.
Estou usando o kernel versão 4.1.33 (com o patch de tempo real de preempção) e o glibc versão 2.23, rodando no córtex ARM A9.
O que está acontecendo entre quando a função kernel retorna e a linha imediatamente após a chamada da glibc para o kernel que poderia explicar qualquer perda significativa de tempo?
Há algum teste adicional que eu possa realizar para diminuir ainda mais a causa dessa perda de tempo?
Como uma verificação de sanidade, substituí temporariamente a lógica pselect por um circuito ocupado, que solicitava o valor do gpio pin o mais rápido possível. Esse loop só saía quando o valor do gpio pin era alterado, e sempre saía dentro de 5 milissegundos, indicando que o pselect era de fato o problema.
Após alguns testes adicionais, descobri que, apesar da chamada do sistema de poll fazer basicamente a mesma coisa que o pselect, ele não parece estar sujeito à perda de tempo observada ao usar o pselect. Como resultado, sou capaz de contornar esse problema, mas ainda assim gostaria de entender sua causa, se possível ...
Tags linux-kernel system-calls