5 votos

ISR, volátil y ATOMIC_BLOCK

Desde mi experiencia hasta ahora me doy cuenta de la siguiente prestar atención a cuando se trabaja con ISRs:

  • Un ISR debe completar rápidamente
  • Las Variables compartidas entre el ISR y el de ejecución principal ruta de acceso debe ser declarada volatile para evitar accesos a la optimización de distancia
  • Acceso a variables compartidas con 16 bits y más debe ser consultado en un ATOMIC_BLOCK porque la 8 bits de la CPU puede acceder a dichas variables en un solo ciclo

Pero me pregunto acerca de las funciones de llamada de un ISR:

  1. Hace llamar a una función desde un ISR agregar cualquier sobrecarga? Mirando el desmontaje, el código de una función y el mismo código directamente en el ISR rendimiento de las mismas instrucciones
  2. Supongo que todo lo que se aplica a un informe de búsqueda internacional también se aplica a una función llamada desde una ISR, ya que es la misma ruta de ejecución?
  3. Si una función llamada desde el espacio de usuario contiene un ATOMIC_BLOCK, es válida también para llamar desde un ISR?

4voto

jason saldo Puntos 5036

No AVR-respuesta específica:

Saltando en un ISR de una ejecución normal del hilo en general, requiere de un cambio de contexto, donde el estado actual de la CPU se guarda en algún lugar (pila, registros sombra), de modo que la ISR puede utilizar la CPU, ya que necesita, y cuando esté terminado, el ISR restaura el contexto (de modo que el programa principal, el CPU se encuentra exactamente en el estado en que se encontraba antes del ISR) y continúa. Es asíncrono, de saltar de la ejecución normal - el programa no deliberadamente decide rama, algún mecanismo externo (una señal, un poco de hardware, lo que sea) toma la decisión.

Ordinaria de la llamada de función no requiere un cambio de contexto por sí mismo. El código está siguiendo un camino conocido, así que no hay necesidad de guardar y conservar todos los registros de la CPU. Dependiendo de la función, usted puede necesitar para pasar argumentos a ella, y puede leer un valor de retorno, pero ya no está anticipándose a la ejecución normal (es decir, el programa sabe a dónde va y cuándo va allí) y no esperar a volver con todo como estaba antes de la llamada, usted no está haciendo un cambio de contexto.

Si no ves ningún cambio de contexto en el ISR de código (podría ser empuja, pops, etc.) entonces tal vez el hardware se encarga de eso para usted. En otros dispositivos (muchos Microchip partes, por ejemplo), usted necesita tomar el cuidado de el contexto de cambio en el código. En general, me sería de esperar que un ISR saltar requeriría un código extra para cuidar el contexto de cambio frente a un ingenuo vacío XXX(void) la función de llamada.

Llamar a una función desde un ISR no es tan diferente de llamar a una función en el espacio de usuario. El código de la sucursal de la misma manera como antes, con los argumentos que se pasa y valores de retorno devuelto. Si usted está en una limitada-de la pila del dispositivo, sin embargo, tenga cuidado: la llamada a la función, que estará empujando y haciendo estallar cosas y la pila que es muy probable que ya es mantener el contexto del código fuera de la ISR. Stack Overflow es siempre una posibilidad con llamadas de función anidada (recursividad es muy malo para esto).

Un ATOMIC_BLOCK contenedor de bloques de interrupciones de disparo, mientras que un segmento de código que está siendo ejecutado. Si ya estás en una ISR, supongo que esto podría impedir que el ISR de ser adelantado por otro de mayor prioridad de la ISR. Puedo entender por qué desea hacer a este, por lo que parece válida para mí (nota: yo no soy un BRAZO de expertos)

1voto

Avner Puntos 2065

Me gustaría hacer hincapié en la diferencia entre atómica y los bloques de funciones del usuario & ISR código. Solo tienes que buscar los artículos de Wikipedia para la Operación Atómica y la Reentrada.

Atómica en la incrustados nivel es mejor ilustrado por Leer-Modificar-Escribir las operaciones. Algunos códigos como el INC o DEC son atómicas por el diseño de hardware, ya que cualquier ISR fuego sólo antes o después de que el código de operación se ha completado.

Sin embargo, algunas operaciones son demasiado complejas. O algunos de 32-bit MCU como PIC32 o el BRAZO no puede realizar estas operaciones en la (I/O) de espacio de la memoria. En este caso de lectura-modificación-escritura de la operación debe ser completado. Un problema puede producirse si una interrupción o cambio de contexto (por ejemplo, RTOS) se produce. El valor puede ser ya leído, pero aún no se ha escrito, mientras que el otro contexto cambia el valor.

Atómica bloque generalmente deshabilita las interrupciones. Esto evitará que los cambios de contexto y permitir que las operaciones sobre los datos para completar. Es mejor mantener atómica bloques cortos, por lo que las interrupciones son atendidos tan pronto como sea posible.

Atómica de bloques puede ser útil si el micro tiene un controlador de interrupciones anidadas. Un controlador de interrupciones anidadas puede adelantarse a la ejecución de una baja prioridad ISR con una prioridad más alta.

Microcontroladores ARM han ldrex y strex que cargar y almacenar variables con un hardware exclusivo monitor. En la tienda es posible comprobar si el acceso a la variable era exclusivo - si no el software puede volver a hacer el cálculo y pruebe de nuevo.

Me gustaría añadir que aunque el hardware de las operaciones son atómicas, esto no significa que la función es reentrante o subprocesos. Re-participante significa que una función puede ser llamada de nuevo dentro de la ejecución de esa función.

Importante a tener en cuenta es donde se almacena la función del estado. No funcionan en locales o globales, variables estáticas. Si usted está escribiendo ISR rutinas, esto es inevitable ya que es el único medio de comunicación con el código principal. En este caso, me gustaría asegurarse de que cada variable sólo será escrito a partir del 1 de origen (sólo por escrito de ISR o de código principal) y se define como la estática global (no accesible desde el exterior de archivo).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X