9 votos

STM32F4 ¿Cómo se utilizan las prioridades y subprioridades de preferencia?

He empezado a trabajar con microcontroladores basados en ARM.

No entiendo la subprioridad y la prioridad previa. Por ejemplo:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;

¿Por qué los utilizamos?

19voto

bitsmack Puntos 5415

La prioridad de anticipación permite que una ISR sea anticipada (interrumpida) por otra interrupción de mayor prioridad. Cuando la interrupción de mayor prioridad se completa, la interrupción de menor prioridad continúa desde donde la dejó.

La subprioridad, en cambio, no tiene nada que ver con la preferencia. Digamos que tienes dos interrupciones de la misma prioridad que están pendientes. El gestor de interrupciones elegirá cuál de ellas atenderá primero, basándose en su subprioridad. Una vez que la primera se haya completado, la segunda comenzará.

Puede parecer improbable que dos interrupciones puedan ocurrir al mismo tiempo. Una situación común en la que esto podría suceder es si tienes una rutina de servicio de interrupción que toma mucho tiempo. Durante esta rutina, es posible que se hayan producido otros múltiples disparos de interrupción. Si es así, la subprioridad determinará cuál es la siguiente en ser atendida.

Por último, hay que tener en cuenta que como la prioridad real aumenta el valor de la prioridad disminuye . Es decir, Priority=1 será atendido antes de Priority=2 .

3voto

Sunil Kumar Sahoo Puntos 21032

De stm32f4-discovery.net

NVIC_IRQChannelPreemptionPriority
Con este parámetro se establece prioridad de la interrupción, número de 0x00 a 0x0F. Digamos que tenemos que usar la interrupción de recepción de la USART y la interrupción de finalización de la conversión del ADC. USART es más importante que el ADC, por lo que la USART tendrá un número menor que el ADC.

NVIC_IRQChannelSubPriority
Con este parámetro se establece la prioridad de la prioridad, número de 0x00 a 0x0F. Digamos que tienes 2 USARTs habilitadas, pero la USART1 es más importante que la USART2. Entonces USART1 tendrá número más bajo que la USART2.

o Prioridad de la rutina de servicio de interrupción del STM32

NVIC_IRQChannelPreemptionPriority se utiliza para determinar si una interrupción que se produce después puede sobrepasar la interrupción anterior que está siendo atendida.

NVIC_IRQChannelSubPriority se utiliza para determinar la prioridad si dos interrupciones ocurren al mismo tiempo. (Si NVIC_IRQChannelSubPriority no se determina, la posición en la tabla NVIC se utiliza para determinar la prioridad).

1voto

Umar Puntos 1157

El núcleo M3 o M4 admite hasta 240 interrupciones.

Necesitará que se asigne prioridad a las interrupciones. En lugar de definir 240 niveles de prioridad, la arquitectura agrupa un montón de ellos.

Así, una intuición será

12 grupos principales (grupo A,B,C,...) y cada grupo tiene digamos 10 fuentes de interrupción..

Por lo tanto, si ya hay una interrupción siendo atendida en el grupo A, entonces, otra interrupción en el mismo grupo A no será atendida hasta que la primera interrupción sea atendida completamente. Por el contrario, mientras se atiende la primera interrupción, si se produce otra interrupción de un grupo de mayor prioridad, el servicio de la interrupción actual se pondrá en pausa.

La subprioridad ayuda cuando se producen dos interrupciones del mismo grupo al mismo tiempo. Entonces la subprioridad entrará en juego para elegir qué ISR ejecutar.

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