Variables globales en programacion de rutinas de interrupcion

Variables globales en programacion de rutinas de interrupcion

de Rafael Agustin Castelli Ottati -
Número de respuestas: 4

Buenas, mirando los ejemplos del teorico de como programar rutinas de interrupcion me surgio la siguiente duda (pongo como ejemplo el LED de la clase 22 pero podria ser cualquiera que sea en una maquina no dedicada):

Primeramente, no entiendo porque principal se hace como un procedimiento.
Mas alla de eso, no me queda claro como inicializar las variables.
Se supone que el programa que escribo debe ejecutarse, instalar las interrupciones y terminar. Si yo declaro las variables como esta hecho en el ejemplo, no se "borrarian" los datos de las variables una vez que termina la ejecucion porque cuando mi programa termina, la memoria que se le habia asignado para almacenar esas variables se libera para posiblemente ser usada por otro programa, entonces ya no puedo contar mas con los datos de ahi?
Ademas, si bien esta puesto el timer como un procedimiento del programa principal cuando se de una interrupcion y se ejecute el procedimiento timer, una vez finalizado el programa principal, no se pierde el "contexto"? O sea si el procedimiento se va a ejecutar de forma independiente al main (porque por ejemplo me interrumpen una vez que termina) la variable cantTics no estaria indefinida en el scope del procedimiento como programa en si?

PD: Se usa Pascal por algo en especial o podria escribir todo en C sin problemas?

Saludos,
Rafael.

En respuesta a Rafael Agustin Castelli Ottati

Re: Variables globales en programacion de rutinas de interrupcion

de Gustavo Brown -

Rafael,

  En general todos los lenguajes de programación se basan en procedimientos y funciones. Qué pondrías en vez de un procedimiento ?

  Para las demás preguntas, las respuestas te van a quedar claras cuando curses Sistemas Operativos. Asi que no te tiene por que quedar todo claro lo que te respondo aqui. Espero que al menos las ideas sí se entiendan.

  Las variables en alto nivel se inicializan directamente cuando se definen o por ejemplo en alguna rutina de inicialización.

  Luego en bajo nivel hay que determinar dónde van a residir las variables. Las variables locales a un procedimiento pueden ir a registros o a memoria, y cuando es a memoria en general van al stack. Eso permite por ejemplo tener funciones o procedimientos reentrantes, como ser las funciones recursivas que vemos en este curso.

  Las variables globales en general van a memoria dado que no podemos darnos el lujo de desperdiciar un registro para mantener una variable.

  Algo que no se ve en este curso sino en Sistemas Operativos es cómo se pone un programa a ejecutar (al ejecutar lo llamamos proceso). Esto implica leerlo de algún lado (por ejemplo del sistema de archivos del disco), ponerlo en alguna región de la memoria y ponerlo en ejecución. El que hace eso es el sistema operativo quien mantiene estructuras de datos para saber que procesos estan actualmente en el sistema y se encarga que no "se pisen" las regiones de memoria. Y también es el encargado de "liberar" la memoria cuando termina de ejecutar.

  Luego si no tenemos sistema operativo entonces debemos encargarnos nosotros de hacer todo ese trabajo. Alguien puso en memoria el programa e hizo algun call al procedimiento inicial (en este caso el main o principal). En el caso de la maquina no dedicada ese procedimiento termina y vuelve al llamador. El llamador ahora es libre de usar la memoria como quiera, pero si dejamos instaladas interrupciones deberia dejar sin modificar la region de memoria que las rutinas de interrupción utilizan (ya sea para código o datos). Si eso no se cumple entonces el sistema va a funcionar mal.

  La ultima pregunta sobre la variable cantTics del ejemplo. Esa es una variable global que se mantiene en memoria (en el mismo segmento donde está el código de la rutina que atiende la interrupción). El "scope" de una variable global por defecto es justamente global, o sea visible desde cualquier lado. En C existe el concepto de variable global asociada a un módulo particular pero no aplica a este caso.

  Y sobre si usar C o Pascal, mientras se entienda bien no hay problemas. Yo personalmente prefiero C.

  

  Saludos,
     Gustavo

En respuesta a Gustavo Brown

Re: Variables globales en programacion de rutinas de interrupcion

de Rafael Agustin Castelli Ottati -

Muchas gracias por la respuesta, se me aclaro bastante la situacion. Respecto a escribir el principal como un procedimiento, creo que me confundi estando acostumbrado a poner int main() {... return 0; }, pero me quedo claro ahora.

Me quedo una duda colgada:

Si yo tengo un procedimiento (como el principal) y tengo variables globales declaradas dentro del archivo del procedimiento, esas van a ser visibles para un llamador? Pongo un ejemplo corto a continuacion:

Archivo 1 :

int contador;

void principal() {

contador = 1;

}

Archivo 2 :

void main() {

principal();

printf("%d", contador);

}

Puesto asi, la variable contador, por mas de estar declarada en principal, sera visible a main por haberlo llamado o esto seria un ejemplo de lo que mencionaste como "variable global asociada a un modulo en particular"? Para programar en este curso, es valido el esquema de "modularizacion" en 2 archivos o deberia pensar en un gran modulo que va a ser ejecutado?

En respuesta a Rafael Agustin Castelli Ottati

Re: Variables globales en programacion de rutinas de interrupcion

de Gustavo Brown -

A efectos de esta asignatura podes suponer que todas las rutinas están escritas en el mismo módulo (archivo). O sea que una variable definida fuera de una rutina es global a todo el programa y se puede acceder desde cualquier rutina.

Por lo tanto, lo que voy a comentar ahora no es necesario aprenderlo ahora para este curso:

En tu ejemplo particular de 2 archivos (con el lenguaje C), la variable contador de Archivo 1 es global y desde Archivo 2 se puede acceder si se declara como externa (salvo que tu compilador sea muy liberal y te la autodeclare).

O sea, en Archivo 2 deberías haber puesto

extern int contador;  fuera del main() y luego en el main podrias usar la variable.

Esto es para que el tanto el compilador como linker sepan que la variable esta definida en otro módulo (el compilador digamos que lo "anota" y el linker termina de resolver la referencia).

Las variables globales asociadas a un módulo particular se definen mediante la palabra static.

Ej:

static int ticks;

fuera de cualquier rutina define una variable que es visible a todas las rutinas de ese módulo.

Saludos,
    Gustavo