PIC18 IO polling

0

Hace poco decidí migrar un diseño existente basado en Interrupción en los pines de cambio al sondeo IO estándar debido a algunas restricciones en la parte que estaba usando. Estoy tratando de averiguar el tiempo de peor caso requerido para sondear un GPIO para un evento, procesar el evento y salir del bucle. He visto la palabra código "no bloqueante" en varias publicaciones y supongo que eso es lo que me gustaría implementar aquí. Cualquier puntero o pseudocódigo sería muy útil. La parte que estoy usando es PIC18F85K22 y estoy ejecutando el reloj interno a 64MHz (Máx.).

    
pregunta ultrasounder

1 respuesta

3

Una llamada sin bloqueo a una parte del código generalmente implica la solicitud de un recurso, como una impresora o un evento en su caso.

Si la impresora está ocupada, o el evento no ha ocurrido, hay dos posibilidades:

  • esperar a que el recurso esté disponible
  • continuar y comprobar después de un tiempo

la primera opción está bloqueando: la ejecución del código se detuvo en lo que se llama ocupado esperando , o spooling. El procesador no puede hacer nada y eso es un desperdicio de energía y tiempo.

la segunda forma es no bloquear: las ejecuciones de código continúan, el procesador puede hacer otra cosa, posiblemente atendiendo otros eventos y luego volver a verificar. El problema es que si su evento caduca de alguna manera, la ejecución del código puede no volver a tiempo.

Algunos pseudo c para ilustrar un ejemplo de espera ocupada:

while(event_1_has_happened == 0); //do nothing
int result_1 = service_event_1();
while(event_2_has_happened == 0); //do nothing
int result_2 = service_event_2();
//... and so on

Sin bloqueo de espera:

int keep_servicing = 1;
while(keep_servicing == 1) {
    if(event_1_has_happened == 1) {
        int result_1 = service_event_1();
    }
    if(event_2_has_happened == 1) {
        int result_2 = service_event_2();
    }

    //... and so on
    keep_servicing = somefunctionofresults(result_1, result2, ..);
}

Tenga en cuenta: los ejemplos anteriores asumen que las funciones event_n_has_happened devuelven inmediatamente si el evento ha ocurrido o no. Pueden ser algo así como verificar si un pin de entrada es alto o bajo, o lo que sea.

    
respondido por el Vladimir Cravero

Lea otras preguntas en las etiquetas