Cronometragem crítica em um driver ARM Linux Kernel

Eu estou executando o Linux em um MX28 (ARMv5) e estou usando uma linha de GPIO para falar com um dispositivo. Infelizmente, o dispositivo tem alguns requisitos especiais de temporização. Um ponto baixo na linha GPIO não pode durar mais que 7us, os altos não têm requisitos especiais de tempo. O código é implementado como um driver de dispositivo do kernel e alterna o GPIO com gravações de registro direto, em vez de passar pela API GPIO do kernel. Para testar, estou apenas gerando 3 pulsos. O processo é o seguinte, tudo em uma função, portanto deve caber no cache de instruções:

definir alto gpioSalvar sinalizadores e desativar interrupçõesgpio lowpausagpio altarepete 2x maisRestaurar Sinalizadores / Interrupções Reutilizáveis

Aqui está a saída de um analisador lógico ligado ao GPIO.

Na maioria das vezes, funciona muito bem, e os pulsos duram menos de 1 ponto. No entanto, cerca de 10% dos mínimos duram muitos, muitos microssegundos. Mesmo que as interrupções estejam desabilitadas, algo está fazendo com que o fluxo do código seja interrompido.

Eu estou perdido. RT Linux provavelmente não ajudaria aqui, porque o problema não é latência, parece ser algo acontecendo durante a baixa, mesmo que nada deva interrompê-lo com os IRQs desabilitados. Qualquer sugestão seria muito, muito apreciada.

questionAnswers(2)

yourAnswerToTheQuestion