Preguntas con etiqueta 'interrupts'

3
respuestas

Cómo obtener la misma cantidad de ciclos de reloj antes de ISR en un AVR

Mientras escribía un código de tiempo crítico para un Attiny13, pensé que podría usar el borde ascendente de una entrada como un activador para leer algunos datos de sincronización automática . Sin embargo, la cantidad de ciclos de reloj nec...
3
respuestas

PIC interrupt delay_ms

Estoy usando MikroC Pro, PIC16F1824 con XTAL 4Mhz. Básicamente tengo 2 modos de LEDs. Utilizo un cable serie para enviar el modo para jugar. Modo 1 = Encendido durante 3 segundos y Apagado durante 3 segundos. Modo 2 = Encendido durante...
1
respuesta

¿Por qué deshabilitar la interrupción requiere mucho tiempo en una computadora con varios procesadores?

Tengo una declaración de libro:    La desactivación de la interrupción requiere mucho tiempo en el sistema multiprocesador. Sospecho que esto está relacionado con la implementación de hardware de cómo se habilita / deshabilita la interrup...
1
respuesta

Interrumpir durante la transferencia de paquetes

Estoy usando la biblioteca mbed TCP / IP Socket para recibir mensajes entrantes a través de Ethernet. Actualmente, los datos entrantes se leen en un bucle infinito while (1) (es decir, lo más rápido posible). También agregaré varias funciones...
1
respuesta

STM32F411VE La interrupción ADC no funciona

Mi código funciona bien sin interrupción (traté de sondear el valor ADC) pero cuando habilité la interrupción, no funcionó. Al depurar en Keil, nunca alcanza el ADC_IRQHandler() . También encontré que el indicador EOC siempre se establece...
1
respuesta

LIS2DH12 Marcas de agua e interrupciones de desbordamiento al mismo tiempo

Estoy trabajando en un proyecto que utiliza el acelerómetro LIS2DH12 de ST ( página del producto ). Tengo un par de preguntas al respecto, y como es una parte bastante común, me pregunto si alguien aquí sabe las respuestas: Me gustaría saber...
1
respuesta

ARM cortex-A7 - interrupciones de ciclo

Estoy usando un Banana Pi M3 con un ARM cortex-A7. Quiero realizar una tarea en un ciclo con un período fijo sin demoras y me estaba divirtiendo si pudiera usar una interrupción para eso. ¿Este procesador tiene incluso una interrupción de ciclo?...
1
respuesta

Acelerómetro LSM9DS1 con demasiados pines auxiliares. ¿Cuáles son realmente útiles?

Estoy designando una placa con un LSM9DS1 . Tengo un bus SPI (con solo este dispositivo conectado), dos gpio para la selección de chips (tiene dos CS, uno para el giro y la aceleración y el otro para el magnetómetro. ¿Suceden cosas extrañas en...
1
respuesta

La interrupción de la comparación de salida no funciona avr atmega

Hola, estoy tratando de hacer un parpadeo del led usando interrupciones en un temporizador de 16 bits. Mi modelo de atmega es Atmega168A. La velocidad de reloj del chip es 12Mhz. Aquí está mi código: #include <avr/io.h> #include <a...
3
respuestas

___ método qstnhdr ___ para manejar fuentes de interrupción GPIO concurrentes? ______ qstntxt ___

Tengo dos fuentes de interrupción GPIO que se ejecutan en dos subprocesos separados:

  1. Pulsos GPIO siguiendo la línea de frecuencia (60 Hz)
  2. botón
  3. presionar

¿Cómo puedo usar estas dos interrupciones simultáneamente, considerando que mi controlador (ESP32) multiplexa todas las interrupciones del periférico GPI0 en una interrupción de la CPU?

Actualmente, el programa permite que solo uno de ellos funcione a la vez.

Gracias

    
______ answer370267 ___

Estoy escribiendo esto sin utilizar nunca un ESP32 (o cualquier otro núcleo dual) o FreeRTOS. Desde mi conocimiento de FreeRTOS (búsqueda muy rápida), implementas los controladores de interrupción por tu cuenta, pero tienes que llamar a algunas funciones del sistema operativo desde dentro.

Por lo tanto, independientemente de la GPIO en la que ocurra la interrupción, terminará en la misma función de interrupción, porque solo hay un vector de interrupción para GPIO.

Pero el ESP32 tiene algunos registros para decirle qué interrupciones están pendientes. Y tienes registros que te dicen qué interrupción está habilitada. La combinación de esos registros le permite decidir qué pines están causando una interrupción.

Por lo tanto, en función de esto, puede hacer diferentes cosas según el GPIO que haya provocado la interrupción.

Te voy a dar una idea, no una implementación, así que lo siguiente es pseudocódigo:

%pre%

De esta manera puede dividir la interrupción en múltiples funciones de ejecución. Prefiero la manera de usar las funciones, pero estoy programando en C ++ e intento evitar las variables globales.

    
______ answer370257 ___

Primero verifique si el firmware / SDK le permite dividir las interrupciones. Es posible que tengas que saltar algunos aros adicionales para poder hacerlo. Muchas veces, el SDK basado en arduino silenciará las opciones disponibles para que sea más fácil para los principiantes y unificar la experiencia en diferentes tableros. Y revise la especificación del microcontrolador para ver exactamente qué sucederá cuando entren las interrupciones mientras ya está manejando otra.

De lo contrario, puede comprobar qué provocó la interrupción dentro de la rutina de interrupción y luego establecer un indicador volátil para manejarlo en su bucle principal.

    
______ answer370293 ___

A menos que un dispositivo tenga un enganche por pin de eventos de interrupción, su mejor opción es probablemente rastrear el último estado reconocido de cada registro de puertos de E / S [en %code% , abajo], y luego hacer algo como:

%pre%

Si cualquier bit de interés se establece en %code% o %code% , el código debe borrar atómicamente el bit (tal vez al deshabilitar las interrupciones, usar la carga vinculada / almacenamiento condicional u otros medios) y manejar la condición apropiada. Tenga en cuenta que si el estado de un pin cambia y luego vuelve a cambiar antes de ser observado por el código anterior, la transición debería perderse.

Cada vez que el sistema vaya a estar inactivo en función de una interrupción de cambio de pin, debería borrar el indicador de interrupción de cambio de pin, luego verificar si el estado del puerto coincide con %code% , y solo irse a dormir si lo hace partido. De esa manera, si el pin del puerto cambia antes de leerlo, el código lo notará y, si cambia después de leerlo, el hardware lo notará. Algunas plataformas hacen que sea imposible evitar por completo las condiciones de carrera, pero las buenas plataformas garantizarán que los eventos que se producen entre el borrado de la bandera y la lectura del estado del puerto se activen por el hardware además de que se informen en el software. En consecuencia, incluso si un evento que ocurre precisamente cuando el puerto se está leyendo no aparece en la lectura, aún se registrará como una activación de hardware.

    
___

Tengo dos fuentes de interrupción GPIO que se ejecutan en dos subprocesos separados: Pulsos GPIO siguiendo la línea de frecuencia (60 Hz) botón presionar ¿Cómo puedo usar estas dos interrupciones simultáneamente, considerando que mi con...