Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Ver: Modo: Orden:
gestion de interrupciones | 9 comentarios (9 temáticos, editoriales, 0 ocultos)
Todo sea por conseguir trabajo. (none / 0) (#3)
por jamarier a las Sun May 8th, 2005 at 11:41:11 PM CET
(Información Usuario) http://barbacana.net/blog/

Cuando yo dí interrupciones, la única conclusión fue: cortas y sal en cuanto puedas. ;-) Pero aviso que no llegamos a diseñar sistemas operativos así que lo que díga a partir de ahora puede que no valga ni los bytes que ocupa:

Si es necesario ejecutar funciones no disponibles en el «modo interrupción», una de las soluciones es no hacerlo en el modo de interrupción. Un sistema sería implementar una máquina de estados. Cuando se activa la interrupción, se varía el valor del estado del sistema. En puntos estratégicos, al estilo de los watchdogs, se comprueba el valor de la variable de estado y se bifurca el flujo del programa en el sentido adecuado. Aunque la interrupción se procesa en el momento que se genera, la función se ejecuta cuando puede. Podríamos llamarlo ¿interrupción cooperativa? por su similitud a los sistemas de multitarea cooperativa. Dependiendo de la complejidad del sistema se puede desarrollar una cola de eventos de interrupciones, etc.

Respecto al problema de que se llame una interrupción antes de que esté lista la bottom_half, se me ocurren 2 sistemas. El último micro que usé podias seleccionar las interrupciones que estaban activas. puedes desabilitar todas las interrupciones salvo una alarma de pocos microsegundos de valor (en otro vector de interrupción), pasados esos micro segundos se activan todas las interrupciones, y así hemos dado tiempo de ejecutar completo el sleep.

Quizás este otro sistema sea más interesante: (hay que depurar el reset del flag de irq
void Interrupt8()
{
   push_pila_direcciones(boton_half);
   erase_irq()
}

void bottom_half()
{
  value16=read_hardware(reg16)
  if (value16 ==0x0800)
  {
     value32=read_hardware(reg32);
     if (value32 == 1)
        do_something1();
  }
}


Es decir, la interrupción introduce fraudulentamente en la pila de direcciones la dirección de nuestra botton_half. Así que cuando la interrupción devuelve el control en vez de retornar al código desde la que se produce, salta a nuestra función botton_half. Al terminar está, se retorna a el punto donde se generó la introducción. Hay un detalle que no he plasmado y es que en función del sistema, en la pila de programa, se pueden introducir más información que en una llamada de función general (creo que se guardaba la dirección de retorno y el estado de los flags en el momento del salto. Así que hay que ajustar estas llamadas y los retornos para que el SO no se de cuenta de la función que has colado.

Si esto funciona, no te olvides que son ideas originales mías y que estoy buscando trabajo de altos vuelos.

-----
Opinión expresada por alguien que puede que no sea yo.



gestion de interrupciones | 9 comentarios (9 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:
Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda