plasma escribió:A ver si lo he entendido...
Lo de las interrupciones es un "puerto de escucha" (direccion de memoria) donde el dispositivo le dice al procesador... "eh! que tengo algo que decirte", como por ejemplo "he terminado la operacion que me mandaste previamente" o "he pasado a inactividad total, que lo sepas". Ahora el programa solo tendria que estar pendiente de cuando se activa el "puerto de escucha" y mirar que le pasa al disposivo, y actuar en consecuencia, y no tener que crear un bucle infinito por programa, con otros bucles dentro que se ejecutan uno u otro segun la situacion dada, y que ademas todo iba por tiempo calculado a ojo de buen cubero, que no es lo mismo que responder a la interrupcion... el equivalente seria un Timer de VB que vigila la interrupcion, no?
Cada milisegundo...
Select Case interrupcion
case 0
seguirhaciendoloqueestuvierashaciendo
case 1
vetealafuncion actuaenconsecuencia
End Case
Lo otro lo interpreto como que ahora se puede crear un software que te permita "controlar" totalmente el hardware de la Wii, o casi.
Igual no he entendido ni papa...
EDITO :Ahora que lo pienso con el "Timer" estariamos en las mismas... quizas sea cosa de que cuando se vaya a ejecutar alguna funcion, o todas, lleve la funcion un parametro "interrupcion" que haga que se comporte esa funcion de una u otra forma... igual es una empanada mental lo que tengo
No es exactamente así: El procesador tiene una señal (por una patita del chip
) donde los periféricos pueden solicitar una interrupción. Y en ese momento, salvo que las interrupciones estén deshabilitadas (que se puede) pasa a tratarlas.
Evidentemente, esa señal se comparte con varios periféricos, por lo que hay un chip (en este caso Hollywood) que se encarga de dar acceso a todas estas señales siguiendo un orden de prioridades (y el registro que habilita la interrupción EHCI no es accesible desde modo usuario)
Cuando se produce la interrupción, el procesador cambia al modo interrupción, testea los flags de los registros de Hollywood y en función de ésto, vuelve a modo usuario mandando una señal para despertar un hilo que previamente, hemos registrado para tratar dicha interrupción.
El hardware USB, tiene un registro reservado (y que yo desconocía hasta hace poco) que le permite habilitar las interrupciones para EHCI (USB 2.0) , OHCI0 y OHCI1 (ambas USB 1.1) y además, puedes fijar la cadencia en la que interrumpirá al procesador en caso de ser necesario.
Esto es así por que puede que el procesador no de abasto... date cuenta que hablamos de tiempos como 125 microsegundos que son realmente, muy cortos. Pero no es el mismo caso que con un timer de los que hablas.
Un timer cíclico no está sincronizado con la señal de interrupción y constantemente está jodiendo al software, mientras que este "timer" lo que indica que si interrumpe al procesador, no debe molestarle al menos hasta que haya pasado un tiempo prudencial.
La diferencia es que por ejemplo, en el Guitar Hero World Tour, aparece una barra de carga al principio: con la versión 2.8D, que usa un timer de 125 us, la barra llega como 3/4 del total, mientras que con interrupciones a 125us, llega a solo a la mitad. Eso es porque via interrupciones, el tiempo entre que se produce una interrupción y la acción, es cortísimo, mientras que con el timer, puede que el flag se levante 1us después y requerir otros 125 us de espera...
En el Guitar Hero World Tour noto un rendimiento parecido usando 500us en interrupción.
Por otro lado, el resto de cosas lo que me permiten, no es solo acceder al hardware libremente, si no modificar el sistema!.
De hecho, el parche que me proporciona SWI (Interrupciones de software) lo realizo en caliente, al cargar mload
y eso me permite cosas como ésta:
OH0: deleting USB device (hub 0, port 0) failed. Device may have been removed.
$IOSVersion: SDI: 06/08/07 18:17:16 64M $
$IOSVersion: SO: 06/28/07 02:37:15 64M Release/apricot-win/HEAD $
$IOSVersion: KD: 08/30/07 04:58:02 64M Release/apricot-win/SDK_FW_30_4_13_branch $
$IOSVersion: WD: 12/05/07 19:50:52 64M Release/apricot-win/SDK_FW_36_4_18_branch $
$IOSVersion: NCD: 06/28/07 02:37:17 64M Release/apricot-win/HEAD $
$IOSVersion: WL: 06/28/07 02:37:25 64M Ver.4.30.44.0/Release $
$IOSVersion: STM: 06/28/07 02:37:18 64M Release/apricot-win/HEAD $
$IOSVersion: OH1: 06/08/07 18:17:21 64M $
Set IPC access rights: salt=ffff0000, n=0
$IOSVersion: ETH: 08/09/07 18:09:02 64M Release/apricot-win/SDK_FW_30_4_13_branch $
$IOSVersion: SSL: 06/21/07 14:52:11 64M Release/srd/HEAD $
$IOSVersion: KBD: 08/27/07 11:20:18 64M $
OH1:configured USB device at port 0, vid: 0x057e pid: 0x0305
Eso que ves es el log que se produce al cargar los módulos OHCI0 y OHCI1 (emtre otros) que van detrás del módulo mload gracias a la captura del vector SWI y a las facilidad de registrar una función (en este caso, es la función svc 0xab, indice 4, que sirve para volcar un texto como log)
Desde el modo usuario los permisos están muy restringidos y no podemos hacer casi nada: ahora disponemos de la posibilidad de ejecutar y modificar cosas desde el Modo Supervisor e incluso una función que nos permite hacerlo desde Modo Sistema.
Vamos, por decirlo de forma clara: podemos acceder a todo el hardware y el software desde el Starlet, expandir sus posibilidades sin necesidad de tener que volver a instalar el cIOS, por lo que se puede considerar el cIOS definitivo