[ubuntu-ar] Manejo de interrupciones

Gerard glpuga at gmail.com
Sun Feb 19 18:46:01 UTC 2012


> Hola, quería saber si alguien tiene idea de como hacer rutinas en C++ o C para
> atender interrupciones en ubuntu.
> Por ejemplo si tengo una señal en un pin del puerto paralelo, y cambia de estado logico
>quiero que salte la interrupción para en ese momento poder correr una rutina de lectura
>del puerto serie. Espero que se entienda lo que necesito hacer.

Hace mucho que no trato de hacer nada en bajo nivel en Linux, pero si
las cosas no cambiaron demasiado  no podés atender interrupciones
desde una rutina que corra en modo usuario (o sea, como programa común
y corriente de consola).

Los sistemas operativos protegidos no permiten fácilmente los accesos
a los recursos de bajo nivel (hardware) a las aplicaciones comunes por
cuestiones de seguridad y protección de la integridad del sistema, y
cuando lo hacen es con restricciones, como por ejemplo que el programa
tenga permisos de super usuario. Ese es el caso si hacés un programa
que lea los pines del puerto paralelo o modifique sus valores. En
cambio engancharse a las interrupciones del puerto paralelo desde
userland es directamente imposible.

Si realmente necesitás utilizar interrupciones deberías apuntar a
hacer un driver para el núcleo Linux, pero puede ser que no valga la
pena tanto esfuerzo si el problema se puede resolver de otra forma.

Ahora estoy especulando, pero lo único que querés señalizar con el
puerto paralelo es el momento en que estás por recibir un dato por el
puerto serie, entonces podés evitar el puerto paralelo completamente.
Al abrir un dispositivo serie (/dev/ttyS0, 1, 2, ... /dev/ttyUSB0, 1 ,
2, 3... etc) cuando hacés una lectura , el programa lee los byte que
pueda si lleǵo algo por el puerto serie, y sino se bloquea esperando a
que llegue algo por el puerto serie. El driver del puerto serie se
encarga de todos los accesos a bajo nivel al hardware, de la
señalización, de las interrupciones, etc. Para la aplicación en cambio
el puerto serie es un archivo del que van saliendo los bytes que se
reciben.

Si necesitás concurrencia porque tu aplicación tiene que hacer otras
cosas mientras espera a que llegue un dato por el puerto serie,
entonces  mirá por el lado de la rutina "select()".

Saludos!

Gerardo. -



More information about the Ubuntu-ar mailing list