Interrumpir cuando una variable pasa un umbral

0

Estoy programando el código para un LM4F120 Stellaris Launchpad, y necesito un método para activar una interrupción de software cuando el valor de una variable en particular excede un valor de umbral predefinido. Cuando el valor sea más bajo que el valor de umbral, la interrupción se debe desactivar.

Por ejemplo, el nombre de la variable es flag y el valor de umbral es 200. Cada vez que flag supera los 200, la interrupción debe activarse. Cada vez que flag vuelve a estar por debajo de 200, la interrupción se debe desactivar.

¿Cómo puedo implementar tal cosa?

    

3 respuestas

3

Hay dos formas en las que puedo pensar.

El primero puede no funcionar. Envíe una copia de su variable a un registro de temporizador, y cosas falsas para que parezca que el registro de temporizador se desplaza cuando alcanza el valor en cuestión, y eso podría provocar una interrupción del temporizador.

El segundo funcionaría, pero es posible que no satisfaga todas sus necesidades. Utilice el valor de prueba de su variable para generar un bit digital y vuelva a un pin que puede provocar una interrupción en el cambio.

Ambos métodos requieren cierto manejo cuando cambian los valores de las variables.

Francamente, según su descripción, no me parece que necesite una interrupción, pero tal vez una estructura de caso en su programa. Las interrupciones no son "activas" o "inactivas". Suceden, entonces se hacen. Si quiere decir que le gustaría habilitar una interrupción en función de alguna decisión, eso es muy fácil en todas las plataformas que he visto, y solo implica configurar los bits correctos en el registro correcto en el momento adecuado.

    
respondido por el Scott Seidman
5

Si desea que las asignaciones a las variables tengan comportamientos adicionales además de solo sobrescribir el valor, debe agregar un poco de abstracción. Ajustar los accesos a la variable con una interfaz funcional.

Por ejemplo,

static th;

void set_th(int new_th)
{
   int old_th = th;
   th = new_th;
   if (old_th <= 200 && new_th > 200)
   { /* enable interrupt */ }
   else if (old_th > 200 && new_th <= 200)
   { /* disable interrupt */ }
}

int get_th(void)
{
   return th;
}

En algunos lenguajes como C ++, puede lograr el nivel de azúcar sintáctico para que la sintaxis de asignación real a una variable active una llamada de función. Usted escribe th = 42 , donde th es un objeto de tipo de clase, y el compilador en realidad genera th.set(42) (o ese es el concepto, de todos modos). Por supuesto, la función miembro set es definida por el usuario, al igual que la función C simple set_th anterior.

También puede programar la máquina para responder a la actualización de una ubicación de memoria. Es decir, puede hacer que la máquina active una interrupción cuando se actualiza una variable. Esto se puede hacer con un punto de control de hardware (normalmente utilizado para la depuración). El uso de un punto de observación de hardware para este tipo de cosas es un gran hack, y solo podría justificarse por la necesidad de reducir los ciclos al mínimo absoluto. Es decir. no desea llamar a una función para actualizar la variable debido a la sobrecarga.

    
respondido por el Kaz
2

Nunca he usado la serie ARM de Stellaris específicamente, pero un método sería dejar el temporizador funcionando todo el tiempo y simplemente habilitar y deshabilitar la interrupción, por ejemplo, algo como lo siguiente:

if (Th > 200)
    ROM_IntEnable(INT_TIMER0A);
else
    ROM_IntDisable(INT_TIMER0A);

Dejar el temporizador en funcionamiento tendrá algún efecto en el consumo de energía, pero solo me preocuparía si su aplicación es fundamental para ejecutar baterías pequeñas, por ejemplo.

Si ese es el caso, puedes hacer prácticamente lo contrario de cómo habilitas el temporizador al reemplazar ROM_SysCtlPeripheralEnable con ROM_SysCtlPeripheralDisable, etc. p>     

respondido por el PeterJ

Lea otras preguntas en las etiquetas