Principios de OOP aplicados en C para Embedded Systems

312 views
Skip to first unread message

Leandro Francucci

unread,
Feb 10, 2014, 1:59:02 PM2/10/14
to embeb...@googlegroups.com
Estimados,

Comparto con ustedes un artículo que aplica los principios de OOP (Object-Oriented Programming) como el encapsulamiento, la herencia y el polimorfismo al diseño de embedded software en lenguaje C, lo cual fomenta la producción de embedded software modular, reutilizable, flexible, transportable y sumamente legible. Además, facilita y naturaliza, el uso de lenguajes de modelado de software como UML.

Entendiendo y justificando de antemano, que la aplicación de estos principios, y en general los conceptos de OOP al lenguaje C en embedded systems, no es una imitación caprichosa de C++ o Java, si no más bien, es la aplicación de ideas y conceptos maduros y formalizados, que bien empleados y en su "justa medida", permiten aumentar no sólo la productividad sino también la calidad del software desarrollado, y así lograr mitigar las consecuencias de factores que, hoy en día, contribuyen a que el embedded software sea cada vez más dificil de lograr, por ejemplo:
  • Sistemas con requerimientos más sofisticados e inteligentes y por lo tanto más complejos.
  • Sistemas con sofisticados protocolos de comunicacón e interfaces de usuario.
  • Vertiginoso cambio de tecnologías.
  • Advenimiento de procesadores más poderosos, con más y mejores prestaciones.
  • El ancioso mercado de consumo, que obliga a la concreción de proyectos en tiempos muy acotados.
  • El bajo costo no sólo del desarrollo, sino también de su producción y mantenimiento en campo.
Aquí el artículo.
Saludos y espero que sea de utilidad la contribución.

Carlos Pantelides

unread,
Feb 10, 2014, 3:38:37 PM2/10/14
to embeb...@googlegroups.com

Hola Leandro:

Muy interesante el artículo, gracias por compartir. Algunas preguntas, tené en cuenta que soy informático y que se use programación estructurada, orientada a objetos, funcional o lo que sea para mi es un detalle circunstancial, no tomo partido.

En los casos en que haya un compilador c++ disponible, dejando de lado el desafío educativo ¿tiene algún sentido intentar implementar OOP en c?

La complejidad resultante ¿no atenta contra el objetivo de hacer las cosas más fáciles?
 
Carlos Pantelides


@dev4sec




--
-- Recibiste este mensaje porque estás suscripto al Grupo Google Embebidos32. Para postear en este grupo, escribe un email a embeb...@googlegroups.com. Para des-suscribirte, envía un email a embebidos32...@googlegroups.com. Para más opciones, visita el sitio del grupo en https://groups.google.com/d/forum/embebidos32?hl=es
---
Has recibido este mensaje porque estás suscrito al grupo "Embebidos32" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a embebidos32...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.


Ernesto Gigliotti

unread,
Feb 10, 2014, 3:39:20 PM2/10/14
to embeb...@googlegroups.com
Muy bueno, había visto algo parecido a esa "herencia" con structs en la biblioteca gráfica de Microchip, en donde hay diferentes "Widgets" que se pueden poner en pantalla y todos parten de una struct base común.


--

Fernando Lichtschein

unread,
Feb 10, 2014, 3:51:30 PM2/10/14
to embeb...@googlegroups.com
Estimados,

La orientación a objetos puede implementarse en cualquier lenguaje, si bien sin soporte del lenguaje hay que dejar algunas características afuera, como por ejemplo el polimorfismo. Hace varios años había una biblioteca para C que se llamaba C-scape que básicamente manejaba objetos que después se manipulaban, por ejemplo "scrolling list".  Eso antes del C++.

Saludos,

Fernando


El 10 de febrero de 2014, 15:59, Leandro Francucci <francu...@gmail.com> escribió:

--

gerardo gimenez

unread,
Feb 10, 2014, 4:36:47 PM2/10/14
to embeb...@googlegroups.com
Muy bueno!!
Sin lugar a dudas lo mas complejo en la curva de aprendizaje para
linux embedded, por lo menos para los electrónicos que venimos de los
8 bits, FSM y RTOS como uCOS o FreeRTOS. Es encontrarse con esas
estructuras interminables y cosas horribles como estructuras con
tablas de funciones y esas aberraciones de la lógica.

No se si hacer un OOP con C es algo productivo, pero académicamente es
muy valorable.

Saludos.
--
Giménez Gerardo Daniel.

Agustin Bonelli

unread,
Feb 10, 2014, 5:44:30 PM2/10/14
to embeb...@googlegroups.com
Con mi poca experiencia profesional haciendo software para sistemas embebidos, me parece que lo que propones es correcto. No creo que tenga sentido ponerse a implementar programación orientada a objetos cuando tenes un compilador de C++. Pero hay dos detalles a tener en cuenta:

1 - No todos los fabricantes para todas las plataformas proveen un compilador de C++. Con lo cual C es todo lo que tenes, y entonces, saber como organizar tu codigo para orientarlo a objetos te salva de bastantes dolores de cabeza de querer lograr una correcta modularización y abstracción solo con C. Por más que técnicamente se puede hacer hasta el más mínimo detalle (el g++ esta escrito en C, y tambien en C++). Igualmente, a menos que no se tenga que preparar para una escalabilidad demasiado grando, usar tipo de Dato abstracto y ciertas "buenas practicas" ayuda bastante.

2 - En algunos selectos casos de plataformas como DSP o DSC para aplicaciones muy especificas, el compilador de C++ suele ser un front end (O parser) para un compilador de C. Con lo cual, el resultado del binario compilado termina siendo peor que si se hubiera implementado la tecnica de OOP directamente en C, por cuestiones de que el gcc (o algun otro compilador open source que está de hace mucho) esta lo suficientemente depurado como para saber que las optimizaciones de nivel 1 y 2 funcionan bastante bien. Por eso, no es solo de valor académico saber como lograr abstracción y correcta modularización solo en C. Puede llegar a servir en el ámbito profesional.

Saludos

PS: Lo del compilador de C++ siendo un front end para el gcc creo que lo leí en algun libro que tengo por ahi sobre DSP en tiempo real o algo así, si alguno le interesa puedo buscar buscar mejor la fuente.


Date: Mon, 10 Feb 2014 12:38:37 -0800
From: carlos_p...@yahoo.com
Subject: Re: [embeb32] Principios de OOP aplicados en C para Embedded Systems
To: embeb...@googlegroups.com

Jaime Andrés Aranguren Cardona

unread,
Feb 11, 2014, 6:49:51 AM2/11/14
to embeb...@googlegroups.com
Interesante saber la fuente...

Leandro Francucci

unread,
Feb 11, 2014, 7:22:56 AM2/11/14
to embeb...@googlegroups.com
Tal como está escrito en el artículo, buena parte de los programas de relativa complejidad, de una forma u otra, aplican estos principios. Dicho sea de paso, en ese tipo de programas, por ejemplo los sistemas operativos, es casi inevitable, por la necesidad de lograr un programa modular, transportable, flexible, etc, etc, escribirlo de otra manera que no sea anidando estructuras, utilizando punteros a función como campos de estructuras, tablas de punteros a función, etc... Todo eso es parte de los principios que describo, siendo estos, propios de la programación y no de un lenguaje o herramienta específica.

En mi caso, y por mi formación, los apliqué en plataformas de 8/16 y 32-bits en la industria, desconociendo que detrás de estos, existía un formalismo, que una vez descubierto me permitió, no sólo ponerle nombre a las "cosas", sino también redefinir, integrar y mejorar su aplicación en el mundo complejo de los embeddeds. Justamente por ese motivo, el artículo describe como resolver un problema particular mediante una técnica de programación en C, una vez resuelto el problema y comprendida el alcance de la solución, le pone nombre a esta técnica, que ¡o sorpresa!, es un principio de la OOP (herencia simple).

Desde mi punto de vista, es beneficioso conocer estos principios, nuevamente, sin importar el lenguaje en uso. Por otro lado, su aplicación o no depende de muchos factores. Por "aplicación" no me refiero a "imitar" o emular por completo un lenguaje como C++ o Java con C, esto lo creo totalmente innecesario, simplemente la idea es contar con estos conceptos maduros y formalizados, para mejorar nuestros programas, aplicándolos todos juntos o en parte, cuando sea necesario.

Saludos!

Ing. Leandro G. Francucci
Investigación y Desarrollo
Delsat Group SA
Tel. +54 (223) 4945001
Fax: +54 (223) 4945111
Mar del Plata - Argentina
www.delsatgroup.com

Matias Vara

unread,
Feb 11, 2014, 7:46:38 AM2/11/14
to embeb...@googlegroups.com
Saludos,

Todo el código c del Virtual Filesystem de Linux está escrito de esta manera hace ya varios añós. Esto facilita enormente la escritura de drivers por ejemplo. 
En un momento se habia planteado la escritura del VFS en C++ pero eso comprometía a la optimización del nucleo.

Mis dos centimos. 

Matias  
MV

Ezequiel Espósito

unread,
Feb 11, 2014, 9:14:00 AM2/11/14
to embeb...@googlegroups.com
Hola, buenos días.

Es muy interesante el artículo que envío Leandro. Estoy completamente de acuerdo respecto a que las técnicas de OOP son independientes del lenguaje de programación utilizado. Algunos lenguajes ya incorporan intrínsecamente los mecanismos para implementar técnicas OOP (como por ejemplo C++). Otros lenguajes (como por ejemplo C) no incorporan de manera directa estos mecanismos, pero esto no imposibilita la utilización de técnicas OOP. En particular, en el lenguaje de programación C, es posible implementar el encapsulamiento, la herencia y el polimorfismo a partir de utilizar punteros genéricos, punteros a funciones y estructuras anidadas.

Respecto a mi experiencia en OOP en sistema embebidos, he trabajando tanto en el ámbito académico como en el ámbito industrial con estas técnicas:
  • Desarrollé en el marco del LSE (Laboratorio de Sistemas Embebidos de la FIUBA) una biblioteca gráfica para sistemas embebidos de bajos recursos (GUI) compatible con RTOS. Esta biblioteca la porte específicamente para el LPC1769, pero es independiente del microcontrolador y de la pantalla. Al tener diferentes widgets gráficos, tuve que utilizar herencia y polimorfismo para que la biblioteca de código sea fácilmente escalable y flexible. Les adjunto el paper donde explico como implementé estas técnicas en el lenguaje de programación C.
  • Por otro lado, también en el marco del LSE y como tesis de grado de mi carrera de ingeniería electrónica, desarrolle una biblioteca de algoritmos de control independiente del microcontrolador y del RTOS utilizados. Esta biblioteca permite instanciar diferentes tipos de algoritmos de control y ejecutarlos concurrentemente. También tuve que utilizar técnicas de OOP para generar una biblioteca flexible y escalable. Les dejo el link a la tesis por si alguien quiere ver como hice la implementción: http://laboratorios.fi.uba.ar/lse/tesis/LSE-FIUBA-Tesis-Grado-Ezequiel-Esposito-2013.pdf
  • También dentro de la carrera de especialización de sistemas embebidos, tenemos planeado dictar el curso de Programación Orientada a Objetos en Sistemas Embebidos. La idea del curso a grandes rasgos es, en una primera parte, implementar los pilar de OOP en C. Luego, en una segunda parte, utilizar directamente C++ y realizar una comparativa. Les dejo el link al curso para que tengan más información: http://laboratorios.fi.uba.ar/lse/cursos.html#Programacion_Sistemas_Embebidos_C++. Todavía no tenemos una fecha para el mismo, porque para la apertura del mismo tenemos que tener una mínima cantidad de personas interesadas.
  • Dentro de mi empresa, www.debtech.com.ar, el equipo de desarrollo utiliza continuamente estas técnicas tanto a nivel de software como a nivel de firmware para generar código flexible, escalable y con alto grado de re-utilización.
  •  Por último, en el proyecto CIAA (Computadora Industrial Abierta Argentina) que nuestro grupo de trabajo (ACSE) está impulsado conjuntamente con la cámara CADIEEL y el estado, tanto a nivel de software como a nivel de firmware estamos haciendo uso de estas técnicas OOP. Dentro de algunos días, en mi carácter de responsable de software de la CIAA, les voy a estar enviando el diseño general de dicho software para que todos los que quieran participar de la implementación puedan sumarse. Les dejo el link a la web de la CIAA donde pueden encontrar muchas más información sobre la propuesta: http://www.sase.com.ar/asociacion-civil-sistemas-embebidos/ciaa
Espero que los links les sean de utilidad. Cualquier consulta no duden en ponerse en contacto conmigo.

Saludos.

--
Ing. Ezequiel Espósito
Socio Gerente - Debtech SRL - www.debtech.com.ar
Integrante del Laboratorio de Sistemas Embebidos (LSE) - FIUBA - http://laboratorios.fi.uba.ar/
Docente de la Carrera de Especialización de Sistemas Embebidos (LSE) - FIUBA - http://laboratorios.fi.uba.ar/lse/especializacion.html
case2012_submission_35.pdf

Jonathan Marino

unread,
Feb 11, 2014, 2:08:31 PM2/11/14
to embeb...@googlegroups.com
Yo tambien desde hace 6 años que uso OOP en C. Me resulta mucho más facil diagramar todo el sistema asi y tiene muchas ventajas en la calidad de codigo.
Lo único que a nivel industrial no tuve de las mejores experiencias, en una Pyme donde comence con esto me dijeron que era muy complejo y no quisieron continuar con ese código :S
Por más que haya compiladores en C++ la industria tambien tiene mucha resistencia a los cambios.

Saludos

gerardo gimenez

unread,
Feb 11, 2014, 3:50:26 PM2/11/14
to embeb...@googlegroups.com
Me interesa esta discusión!!!

Esto no es un juicio de el trabajo de Leandro que me parece de 10!!!

El tema es complicado, porque te saca de la zona de confort. Pero si
OOP en C es una estratagema para reutilizar y escalar soft, es un
trompazo seguir estructuras de estructuras, es muy dificil, aún con
UML incluido. SI alguien usó la Machine Specific Layer "MSL" de
Freescale para I.MX sabrá de que le estoy hablando.

Para un proyecto donde el grupo es interdisciplinario es muy
complicado que las partes acepten algo así, todo se va a decantar a
algo standar de fácil lectura y entendimiento. Por eso no me parece
que sea muy productivo.(productivo de industria).

Obviamente van a existir casos en que no te queda otra, pero uno le
tiende a huir para evitarse dolores de cabezas futuros.

Por ejemplo en donde laburo, después de unas semanas de batallas
ónticas-epistémicas-doxáticas, decantamos por un entorno en object
pascal sobre Linux Embedded, porque se sentían mas cómodo con este
entorno, aunque yo quería usar C++.(porque es la que más cómodo me
siento)


Saludos!



Me pasa esto. En el laburo estamos haciendo desarrollos con linux
embedded, Entonces yo
Giménez Gerardo Daniel.

Leandro Francucci

unread,
Feb 11, 2014, 8:10:28 PM2/11/14
to embeb...@googlegroups.com
Hago otro pequeño aporte, un artículo que muestra las bases de la implementación de un framework para Statecharts, el cual hace uso de las prácticas que comentamos, aquí. En este caso, se aplicó encapsulamiento, herencia y polimorfismo desde la concepción del framework, aunque desconociendo el formalismo de OOP, luego de un tiempo, se formalizaron los métodos aplicados. Este es otro ejemplo, en el que, por los requerimientos del sistema, no había demasiadas alternativas para su implementación que no sean las planteadas.

Si bien, el uso de estas prácticas no es trivial, una vez que te acostumbrás a estas cosas, ya es dificil retornar. Aún así, para mantener las cosas legibles, generalmente, oculto los detalles más ofuscados en funciones o macros, tal como muestra el framework.

Agrego algo más: la herencia de clases o estructuras, puede implementarse de varias maneras, una de ellas es anidando estructuras, otra (también referenciada en el artículo) es copiando y editando en la estructura derivada, los campos heredados de la estructura base, esto se explica aquí, si bien es algo más sencilla la implementación, tiene algunas desventajas respecto al anidamiento de estructuras. El uso de una u otra, es casi una cuestión de gustos.


LF

Santiago Pérez

unread,
Feb 12, 2014, 6:36:17 AM2/12/14
to embeb...@googlegroups.com
Muy interesante los artículos y opiniones varias. Gracias!.

Creo el mayor cambio que se plantea es el hecho de pensar la solución del problema desde la óptica del OOP (independientemente del lenguaje) o el tradicional paradigma de la programación estructurada (C, por ejemplo). Para el programador de C, empezar a pensar la solución de los problemas como lo plantean las técnicas de OOP, es un cambio muy grande de visión y pensamiento. Ya sea por costumbre, experiencia o quizás vicio, ya se tiene incorporado una manera de solucionar problemas y programar que pueden llegar al extremo de pensar que cualquier tipo de diagramas (de flujo, de estado, etc) o técnica un poco más abstrayente, no son más que meros formalismos o papelerío inerte.

En el punto que se logra descubrir la potencialidad de encarar los proyectos de otra manera y de que estas técnicas a largo plazo generan mejor código, más mantenible y legible, expandible e incluso permiten ahorrar tiempo, es cuando se genera el punto de inflexión. Me parece que el artículo y las técnicas/métodos mencionados por Leandro, son un intento de poder concretar en el lenguaje más difundido de Sistemas Embebidos, las técnicas de desarrollo OOP.

Creo la resistencia al cambio también es algo esperable, tanto de los desarrolladores como de las empresas en general, sobre todo si se trata de industrias tradicionales o PYMES. Quizás es cuestión de encontrar el equilibrio, empezar de a poco, ir probando e incorporando lentamente siempre y cuando el caso lo amerite.

Saludos!

Santiago

--
Atentamente//With best Regards/Mit freundlichen Grüßen

Santiago Pérez
Ingeniero Electrónico

pere...@gmail.com
Córdoba, Argentina.

Matias Vara

unread,
Feb 12, 2014, 7:05:48 AM2/12/14
to embeb...@googlegroups.com
Hola,

creo que solución es mucho más generalizada y viene de la mano de lo que se denomina "Domain Specific Modeling Languages". Estos plantean un lenguage reducido en expresividad para atacar un problema particular.
Estos lenguages hacen uso de un Modelo de Computacion (State Machine, Automata, Petrinets, Sycronous Dataflow, etc) para definir la ejecucion. Estos son modelos de computacion bien conocidos y estudiados.
De esta forma se reduce expresividad y se gana analisibilidad.
La programacion tienden a "modelar" mas que "a programar" (Aunque programar sea modelar). Y la programación en lenguages de proposito general como C, es generada automaticamente a partir de modelos. El prevoi estudio de la semantica del modelo permite inferir problemas antes de la implementacion en un lenguage de proposito general.  


Matias
    
 
MV

Diego H Turconi

unread,
Feb 12, 2014, 7:51:44 AM2/12/14
to embeb...@googlegroups.com

Hola,

 

Queria saber si alguien (el autor u otro) tendria el articulo que esta en la pagina http://www.embedded-exploited.com.ar/2014/02/principios-de-oop-aplicados-en-c-para.html en pdf u word para poder imprimirlo

Correctamente porque con el navegador se imprime mal y cortandolo tambien … asi lo puedo leer en mis ratos libres..

 

Saludos Diego

 

 


Leandro Francucci

unread,
Feb 12, 2014, 8:25:09 AM2/12/14
to embeb...@googlegroups.com

Ing. Leandro G. Francucci
Investigación y Desarrollo
Delsat Group SA
Tel. +54 (223) 4945001
Fax: +54 (223) 4945111
Mar del Plata - Argentina
www.delsatgroup.com


Ariel Perez

unread,
Feb 12, 2014, 9:51:33 AM2/12/14
to embeb...@googlegroups.com
Muchas gracias Leandro!
Saludos.
Ariel P.

Jonathan Marino

unread,
Feb 12, 2014, 1:33:15 PM2/12/14
to embeb...@googlegroups.com
Si, pensar correctamente en oo no es simple.
Yo hace algunos años me compre unos libros de Bruce Douglas para aprender a diseñar sistemas embebidos desde esa óptica pero requeria saber más de UML, y modelado en gral., por suerte en ingenieria informatica vi las cosas que me faltaban.
Yo estoy trabajando para mi tesis en lo que dice Matias Vara para tener una herramienta de modelado para OOC (OOP en C como se lo bautizo hace varios años), que permita crear objetos y su virtual table automagicamente, no se si vieron algo parecido, en Rhapsody hay algo asi pero es muy malo (por ejemplo no permite herencia!)

Diego H Turconi

unread,
Feb 14, 2014, 8:35:41 AM2/14/14
to embeb...@googlegroups.com

Hola Leandro ,

 

Te queria decir que lei casi todo el articulo y es muy buena tu explicación …

Por ahora revisando todo el articulo encontre que en la funcion comm_set_msg_y el primer parametro es msg_x donde debia ser msg_y ya que lo usas dentro con este nombre…

Y otra cosa que tambien note al final de la misma funcion en el memcpy que usas Y_VAR1_SIZE .. es un tema si definiste el array con esa cantidad todo bien pero es mas seguro usar sizeof de la variable destino

Pero no es tan rapida que usar el define directamente… todo depende de lo seguro que estes….

 

Por ahora eso solo observe si veo algo mas te digo y muy buen articulo te felicito .. al terminar de revisarlo te comento bien mi opinión y que otras cosas aplico yo tambien para ayudar a todos..

 

Saludos Diego

 

 

 


Leandro Francucci

unread,
Feb 14, 2014, 8:59:02 AM2/14/14
to embeb...@googlegroups.com
Diego,

Gracias por las revisiones, luego las agrego al artículo original. Desde ya que la idea es intentar transmitir de una manera u otra, técnicas, procesos, usos, etc, que mejoren la producción y calidad del embedded software.

Dicho sea de paso, pienso escribir un artículo que aplique estos y otros conceptos, esta vez orientado a la arquitectura de embedded software, partiendo desde las tradicionales como super-loop y RTOS o free threading, hasta llegar a los beneficios del modelo Actor o Active Object, incluyendo a estos el paradigma de la programación gobernada por eventos.

Saludos!

LF

Ariel Lutenberg

unread,
Feb 14, 2014, 9:04:22 AM2/14/14
to embebidos32@

Muchachos,
Si hay suficiente quorum e interés sobre esta temática entonces es perfectamente posible organizar tutoriales o workshops al respecto durante el SASE2014.
Es simplemente cuestión de que propongan a un coordinador (¿Leandro?) para que sea posible ordenar las actividades en forma clara y coherente.
Saludos,
Ariel.

Juan Franco

unread,
Feb 14, 2014, 9:17:40 AM2/14/14
to embeb...@googlegroups.com
Hola,

Ya que el objetivo de Leandro es llegar a los modelos de computación, no pueden dejar de reflexionar el siguiente material del Profesor Lee de Berkeley:


Aquí más material: 

Saludos

Matias Vara

unread,
Feb 14, 2014, 9:50:00 AM2/14/14
to embeb...@googlegroups.com
Hola, 

El 14 de febrero de 2014, 15:17, Juan Franco <juanfe...@gmail.com> escribió:
Hola,

Ya que el objetivo de Leandro es llegar a los modelos de computación, no pueden dejar de reflexionar el siguiente material del Profesor Lee de Berkeley:


Aquí más material: 

Saludos



Está bueno eso, yo lei bastante. Estoy haciendo mi tesis sobre exactamente ese tema: "Framework for Heterogeneous modeling and composition"
Ptolemy es una buena herramienta para simular composition de modelos heterogeneos pero no para definir formalmente la composition. Tengo mucho material sobre eso. 

Matias  



--
MV

Juan Franco

unread,
Feb 14, 2014, 10:03:06 AM2/14/14
to embeb...@googlegroups.com
Excelente Matias... puedes compartir la información?

Saludos
Reply all
Reply to author
Forward
0 new messages