Author | Topic: manejando interrupciones | |
---|---|---|
Ernesto Avedillo | manejando 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 Botella | Re: 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 Botella | Re: 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 Avedillo | Re: 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 Botella | Re: 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 Avedillo | Re: 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 |