Alaska Software Inc. - manejando interrupciones
Username: Password:
AuthorTopic: manejando interrupciones
Ernesto Avedillomanejando interrupciones
on Mon, 15 Dec 2008 00:29:02 +0100
Hola a todos,

Necesito asociar un nmero de interrupcin generado por una tarjeta PCI con 
un evento manejado por xBASE++.

Como resltve esto xBase?
Gracias

Ernesto
Osvaldo Ramirez Re: manejando interrupciones
on Mon, 15 Dec 2008 10:20:13 -0700
Estimado Ernesto

Tienes ejemplos de esto en otro lenguaje ?

Saludos
Osvaldo Ramirez
Jos Luis Otermin [Alaska Software]Re: manejando interrupciones
on Mon, 15 Dec 2008 16:18:44 -0300
Ernesto,

Sugiero consideres explicar con mayor detalle la estrategia de lo que 
planeas y as quiza podamos ayudarte.
De todas formas, independientemente de cmo se genere la interrupcin, 
necesitars conocimientos avanzados de C++ para detectar la interrupcin en 
la cola de eventos del Sistema Operativo.
Una vez "colgado" de la cola de eventos del S.O. podrs generar un evento de 
usuario para Xbase++ usando el API para C/C++.

Espero haber ayudado

Jos Luis Otermin
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------

"Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> escribi en el mensaje 
news:306d1aa2$6f498fe3$c8f@news.alaska-software.com...
> Hola a todos,
>
> Necesito asociar un nmero de interrupcin generado por una tarjeta PCI 
> con un evento manejado por xBASE++.
>
> Como resltve esto xBase?
> Gracias
>
> Ernesto
>
Pablo BotellaRe: manejando interrupciones
on Mon, 15 Dec 2008 20:50:31 +0100
Hola,

> Necesito asociar un número de interrupción generado por una tarjeta PCI con 
> un evento manejado por xBASE++.

Lo mejor, si es posible usa el driver que trae tu tarjeta, si trae un API bien sea via COM o con una DLL mejor que mejor, y si no pues a base de DeviceIOControl() si te dan el id del driver.

Si tienes la desgracia de no contar con un driver o si es un dispositivo que vas a fabricar tú, pues entonces no queda otra que echarle un par de huvos al asunto y descargarse el WDDK de la web de MS y hacertelo tu. Registras tu ISR con IoConnectInterrupt()  y a partir de ahi pues imagino que lanzarás un evento de dispositivo a base de KeSynchronizeExecution(). 

>Como resltve esto xBase?
Pues eso. No se resuelve con Xbase++ ( tampoco es su tarea), necesitas C/C++, ASM, Delphi o cualquier otro leguaje que soporte trabajar en "kernel mode", ten en cuenta que aqui no te valen las rutinas normales de uso de memoria con las que se trabaja en "user mode".

Y bueno eso si mejor instalate un WMWare para las pruebas porque en "kernel mode" el azul será tu color favorito ( el de la pantallita azul de windows) mientras estés trabajando con tu driver.

Buena Suerte,

Pablo Botella
Pablo BotellaRe: manejando interrupciones
on Mon, 15 Dec 2008 21:11:57 +0100
Ahi te va un poco de literatura que te puede ser útil:

Programming the Microsoft Windows Driver Model 2nd Edition - by Walter Oney.
Microsoft Windows Internals 4th Edition - by Mark Russinovich.
Undocumented Windows 2000 Secrets - by Sven Schreiber.
Undocumented Windows NT - by Prasad Dabak, Sandeep Phadke and Milind Borate.
Windows NT/2000 Native API Reference - by Gary Nebbett.

Imagino que no te será dificil de localizar en el Amazon
Ernesto AvedilloRe: manejando interrupciones
on Tue, 16 Dec 2008 09:27:44 +0100
Hola a todos,
Para empezar, gracias por las respuestas.
Ciertamente, me vuelvo a leer la pregunta y est algo falta de concrecin. 
Os ruego que me disculpeis.
En explicar.Corregidme si me equivoco en alguna de las cosas que voy a 
escribir.
El hardware de un ordenador es capaz de generar diferentes interrupciones 
que posteriormente una rutina se encarga de gestionar. AppEvent() es una 
funcin que recoge los eventos en cola para que nosotros los gestionemos. 
Por otro lado, las tarjetas que se insertan en los ordenadores poseen en el 
slot un pin que se corresponde a una interrupcin que es capaz de leer el 
sistema y mi pregunta consistia en saber si xBase es capaz de gestionar esas 
interrupciones.

Como me ha dicho ya Pablo la respuesta es no y deberia primero buscar una 
funcin capaz de detectar un evento por ejemplo denominada MiEventCheck y 
luego crear una rutina en multitarea del siguiente tipo que trabaje junto 
con la rutina que gestiona el AppEvent()

   oThread := Thread():new()
   oThread:setPriority( PRIORITY_NORMAL )
   oThread:start( "DetectEvent", ,,  )

Procedure DetectEvent
    Do while .t.
        evento : = MiEventCheck()
        ManejaEvento(eveto)
    EndDo
Return


Supongo que esto es asi.
Ernesto


"Pablo Botella" <pb_no_spam_@_remove_all_betwen_underscores_xbwin.com> 
escribi en el mensaje 
news:16e0fedf$707f5269$a5b9@news.alaska-software.com...
Ahi te va un poco de literatura que te puede ser til:

Programming the Microsoft Windows Driver Model 2nd Edition - by Walter Oney.
Microsoft Windows Internals 4th Edition - by Mark Russinovich.
Undocumented Windows 2000 Secrets - by Sven Schreiber.
Undocumented Windows NT - by Prasad Dabak, Sandeep Phadke and Milind Borate.
Windows NT/2000 Native API Reference - by Gary Nebbett.

Imagino que no te ser dificil de localizar en el Amazon
Pablo BotellaRe: manejando interrupciones
on Tue, 16 Dec 2008 10:46:36 +0100
Hola,

A ver, creo que te estás liando.
En modo real a 16 bits ( DOS  e incluso con win16) podías hacer esto con TurboC

pOldProc = getvect( nInterrupt )
setvect( nInterrupt , my_proc )
.....

void interrupt my_proc()
{
   ......
   ( * pOldProc)();
}

Sin embargo en modo protegido con Win32 esto no es posible, o al menos no de esta manera.

> primero buscar una función capaz de detectar un evento 
FALSO. A menos que esa función te la provea el driver de la tarjeta

Mira lo primero tienes que saber en que punto estás, o tienes un driver para tu tarjeta o no lo tienes.

Si tu tarjeta trae un driver, la parte de bajo nivel del driver ( ejecutandose en kernel mode) instalará su rutina de servicio con IoConnectInterrupt() y en esa rutina es donde lanzará los eventos de dispositivo. Algunos drivers traen tambien otro componente adicional a alto nivel ( DLL, ActiveX, EXE,... ) que es el que servirá de puente entre las aplicaciones y el driver del dispositivo.

Si estás en este punto entonces si, probablemente tengas una DLL donde podras especificar un callback o bien subclasear el wndproc de una ventana para recibir el evento que necesitas y luego hacer un PostAppEvent() al Xbp de turno.

> Por otro lado, las tarjetas que se insertan en los ordenadores poseen en el 
> slot un pin que se corresponde a una interrupción que es capaz de leer el 
> sistema y mi pregunta consistia en saber si xBase es capaz de gestionar esas 
> interrupciones.

No es que Xbase++ no sea capaz de gestionar estas interrupciones, es que las aplicaciones en win32 no tienen acceso a ellas
Tan solo los modulos corriendo en "kernel mode" tienen acceso a ese nivel. Hay un rango de 1GB de memoria virtual que está reservado a los controladores, y al que las aplicaciones no tienen acceso, asi que si no tienes un driver no puedes manejarlo, ya que es el driver el que te va a dar acceso indirecto a estos recursos. 

Asi que la respuesta es 
NECESITAS UN DRIVER CORRIENDO EN KERNEL MODE
si lo tienes pues tendrás entonces que remitirte a la documentación de tu driver para ver como resuelve la comunicación con las aplicaciones.

Y si no lo tienes, pues entonces tienes que hacertelo, usando el DDK  de windows, igual que tienes EXEs y DLLs pues windows usa otro tipo de modulos que son DRIVERS, normalmente con la extensión SYS, tienen 1 sola función exportada DriverEntry() que el sistema llama cuando se carga el driver, usando el espacio de memoria virtual compartido por todos los controladores, a diferencia de las aplicaciones que tienen cada una su espacio de memoria virtual independiente.

Asi que resumiendo, los pasos a seguir son estos:

1) Tienes controladores para tu tarjeta?
    - SI    -> Pues leete la documentación y averigua cual es el metodo que el fabricante propone para interactuar con las aplicaciones. -> salta al paso 3
    - NO -> Paso 2

2) Hazte un driver con C/C++ y el WDDK

3) El driver trae una DLL que te permite instalar un callback?
- SI -> Pues montate un callback  - FIN
- NO -> sigue leyendo

4) El driver trae un ActiveX ( IDispatch) que te permite instalar un manejador para un evento?
- SI -> Usa la implementación de Alaska para ActiveX y le metes un codeblock para el evento - FIN
- NO - Sigue leyendo

5) El driver envia eventos a una ventana que tu registres?
- SI - Subclasea y registra la ventana
- NO - Pues vuelve a mirar el manual o contacta con el fabricante para ver que alternativa te propone, o salta al paso 2

ahora quedó claro?

Saludos,
Pablo
Ernesto AvedilloRe: manejando interrupciones
on Tue, 16 Dec 2008 13:39:37 +0100
Perfectamente, gracias.
Si que tengo driver y lo utilizar aunque el resto de lo que me has 
explicado tambin me ir muy bien
Gracias
Ernesto
"Pablo Botella" <pb_no_spam_@_remove_all_betwen_underscores_xbwin.com> 
escribi en el mensaje 
news:3a89dcbb$331635be$bceb@news.alaska-software.com...
Hola,

A ver, creo que te ests liando.
En modo real a 16 bits ( DOS  e incluso con win16) podas hacer esto con 
TurboC

pOldProc = getvect( nInterrupt )
setvect( nInterrupt , my_proc )
.....

void interrupt my_proc()
{
   ......
   ( * pOldProc)();
}

Sin embargo en modo protegido con Win32 esto no es posible, o al menos no de 
esta manera.

> primero buscar una funcin capaz de detectar un evento
FALSO. A menos que esa funcin te la provea el driver de la tarjeta

Mira lo primero tienes que saber en que punto ests, o tienes un driver para 
tu tarjeta o no lo tienes.

Si tu tarjeta trae un driver, la parte de bajo nivel del driver ( 
ejecutandose en kernel mode) instalar su rutina de servicio con 
IoConnectInterrupt() y en esa rutina es donde lanzar los eventos de 
dispositivo. Algunos drivers traen tambien otro componente adicional a alto 
nivel ( DLL, ActiveX, EXE,... ) que es el que servir de puente entre las 
aplicaciones y el driver del dispositivo.

Si ests en este punto entonces si, probablemente tengas una DLL donde 
podras especificar un callback o bien subclasear el wndproc de una ventana 
para recibir el evento que necesitas y luego hacer un PostAppEvent() al Xbp 
de turno.

> Por otro lado, las tarjetas que se insertan en los ordenadores poseen en 
> el
> slot un pin que se corresponde a una interrupcin que es capaz de leer el
> sistema y mi pregunta consistia en saber si xBase es capaz de gestionar 
> esas
> interrupciones.

No es que Xbase++ no sea capaz de gestionar estas interrupciones, es que las 
aplicaciones en win32 no tienen acceso a ellas
Tan solo los modulos corriendo en "kernel mode" tienen acceso a ese nivel. 
Hay un rango de 1GB de memoria virtual que est reservado a los 
controladores, y al que las aplicaciones no tienen acceso, asi que si no 
tienes un driver no puedes manejarlo, ya que es el driver el que te va a dar 
acceso indirecto a estos recursos.

Asi que la respuesta es
NECESITAS UN DRIVER CORRIENDO EN KERNEL MODE
si lo tienes pues tendrs entonces que remitirte a la documentacin de tu 
driver para ver como resuelve la comunicacin con las aplicaciones.

Y si no lo tienes, pues entonces tienes que hacertelo, usando el DDK  de 
windows, igual que tienes EXEs y DLLs pues windows usa otro tipo de modulos 
que son DRIVERS, normalmente con la extensin SYS, tienen 1 sola funcin 
exportada DriverEntry() que el sistema llama cuando se carga el driver, 
usando el espacio de memoria virtual compartido por todos los controladores, 
a diferencia de las aplicaciones que tienen cada una su espacio de memoria 
virtual independiente.

Asi que resumiendo, los pasos a seguir son estos:

1) Tienes controladores para tu tarjeta?
    - SI    -> Pues leete la documentacin y averigua cual es el metodo que 
el fabricante propone para interactuar con las aplicaciones. -> salta al 
paso 3
    - NO -> Paso 2

2) Hazte un driver con C/C++ y el WDDK

3) El driver trae una DLL que te permite instalar un callback?
- SI -> Pues montate un callback  - FIN
- NO -> sigue leyendo

4) El driver trae un ActiveX ( IDispatch) que te permite instalar un 
manejador para un evento?
- SI -> Usa la implementacin de Alaska para ActiveX y le metes un codeblock 
para el evento - FIN
- NO - Sigue leyendo

5) El driver envia eventos a una ventana que tu registres?
- SI - Subclasea y registra la ventana
- NO - Pues vuelve a mirar el manual o contacta con el fabricante para ver 
que alternativa te propone, o salta al paso 2

ahora qued claro?

Saludos,
Pablo