Blog

Dispositivos embebidos y desarrollo de sistemas embebidos: una visión general

Secure Code Warrior
Publicado el 11 de agosto de 2021

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores y gestores de seguridad para construir sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la construcción de sistemas embebidos seguros. 

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basado en un microprocesador. Suelen utilizarse para realizar funciones específicas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrado?

Los dispositivos embebidos son sistemas informáticos construidos con un hardware y un software mínimos, programados para realizar funciones específicas. Dependiendo de su finalidad, la complejidad de los dispositivos integrados puede variar. 

Si un sistema embebido tiene que realizar operaciones complicadas y con muchos recursos, su hardware puede estar compuesto por varios procesadores, con diversos periféricos interconectados. En cambio, si está diseñado para realizar una tarea sencilla, puede contener un solo microcontrolador. 

Algunos sistemas empotrados son cajas negras sin interfaz de usuario, mientras que otros pueden tener interfaces de usuario gráficas y detalladas.

Ejemplos de dispositivos integrados

Los dispositivos integrados tienen aplicaciones en múltiples sectores, desde el aeroespacial al informático, y desde los electrodomésticos a la sanidad. He aquí algunos ejemplos:

  • Un termostato dentro de un aire acondicionado. 
  • Un rastreador de fitness, con pequeños componentes eléctricos que ejecutan un diminuto sistema operativo, que no puede hacer nada más que registrar y sincronizar sus estadísticas de salud.
  • Sistemas de climatización digital.
  • Sistemas de navegación dentro de un avión.
  • Relojes digitales.
  • Dispositivos GPS.
  • Componentes Wi-Fi en hornos microondas y otros productos electrónicos de consumo.
  • Tensiómetros y pulsómetros.
  • Componente de red dentro de una máquina de resonancia magnética que envía datos a la nube.

¿Es un portátil un dispositivo integrado?

Respuesta corta: No. Respuesta larga:

Por definición, un dispositivo integrado encapsula todo el software y el hardware que necesita para realizar sus funciones. En efecto, un portátil envuelve varios componentes de hardware en un cuerpo metálico y engloba todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los típicos sistemas embebidos, que tienen un conjunto de características mínimas predefinidas, un ordenador portátil es de propósito más general y puede utilizarse para realizar una amplia gama de actividades.

Dispositivos integrados en el Internet de las cosas

Los sistemas embebidos están en el corazón del IoT. Tu nevera inteligente puede controlarse a través de tu dispositivo móvil, gracias a un dispositivo integrado. Un dispositivo integrado en tu sistema de seguridad te permite ver las imágenes de las cámaras de seguridad a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, es un dispositivo integrado el que hace toda la magia.

Ciclo de vida del desarrollo de software embebido

En el ciclo de vida típico del desarrollo de software de un dispositivo embebido intervienen los siguientes pasos:

Paso 1: Objetivo y requisitos

Un dispositivo embebido tiene un conjunto de características distintas y precisas. Por eso es muy importante establecer explícitamente su finalidad y sus requisitos antes de iniciar el desarrollo. Se recomienda crear un documento de diseño detallado del sistema. Responde a preguntas como:

  • ¿Qué funciones realizará el aparato?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿Debe tener el dispositivo una interfaz de usuario? En caso afirmativo, ¿es suficiente una línea de comandos o se necesita una interfaz gráfica?
  • ¿Qué límites de tamaño, coste o consumo de energía debe cumplir el dispositivo?
  • ¿Existen parámetros de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos umbrales?

Paso 2: Arquitectura del sistema

Una vez identificados los requisitos únicos del sistema, estamos preparados para diseñar la arquitectura del sistema. Responde a preguntas como:

  • ¿Qué componentes de hardware serán necesarios para desarrollar el dispositivo? Esto incluye la identificación de los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios. 
  • ¿Qué potencia necesitarán los componentes? 
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces hay que añadir/desarrollar para que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a aplicar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará las posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccionar el sistema operativo

La elección del sistema operativo a menudo dicta la eficacia de sus aplicaciones integradas, así que elija sabiamente. Windows para IoT puede tener una alta puntuación en gráficos, pero carece de soporte de hardware. Embedded Linux y Android son gratuitos, mientras que VxWorks y Windows for IoT tienen costes de licencia. 

Con los sistemas de código abierto como Linux y Android, sus desarrolladores tienen más control sobre el núcleo; sin embargo, con los sistemas propietarios, el conjunto de características por defecto del núcleo es todo con lo que se puede trabajar. 

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Se publican rápidamente los parches de seguridad, en caso de que se descubra alguna vulnerabilidad? ¿Hay alguna protección integrada contra los ataques de ciberseguridad más comunes?

Paso 4: Las herramientas de desarrollo

Los diferentes lenguajes y marcos de programación tienen varios pros y contras. Dependiendo de sus requisitos de funcionalidad, velocidad y fiabilidad, puede elegir un lenguaje/marco en lugar de otro. 

Si tu aplicación está basada en la web y quieres un alto rendimiento, elige Java.
Sin embargo, si quieres el mayor rendimiento, elige C/C++. Si quieres el mejor soporte de bibliotecas de terceros, ve con Python.

Paso 5: codificar, refactorizar, probar y codificar un poco más

Una vez que haya decidido la plataforma de desarrollo, estará listo para empezar a codificar. Recuerda que los sistemas embebidos son dispositivos sensibles con recursos de hardware y software limitados. Por lo tanto, es fundamental tener en cuenta las mejores prácticas relativas a la seguridad y el rendimiento de las aplicaciones.

Las revisiones del código ayudan a optimizarlo y a identificar posibles errores. También es necesario realizar pruebas lo más rigurosas posible. Asegúrate de recopilar una lista exhaustiva de todos los casos de prueba que el dispositivo puede encontrar cuando se utilice en producción.

Paso 6: Mantenimiento y asistencia

Al igual que cualquier otra aplicación/dispositivo, el ciclo de vida no termina cuando el dispositivo integrado se ha enviado e instalado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la incorporación de nuevas funciones. Los errores detectados también pueden requerir la publicación de nuevas actualizaciones de firmware.

Los mejores lenguajes de programación embebidos

Hay muchas organizaciones de prestigio, como el IEEE y el TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de que se consulte el índice TIOBE o el IEEE Spectrum, se observará un tema común.

Los tres primeros lenguajes son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el primer puesto, a Java en el segundo y a Python en el tercero. Según la clasificación de IEEE Spectrum para los lenguajes de programación integrados, el orden es: Python, Java y luego C.

¿En qué se diferencian los programas escritos en Java, C o Python?

Los distintos lenguajes gestionan la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de forma diferente. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como máquina virtual Java, o JVM. 

La gestión de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tienes que preocuparte de gestionar la memoria tú mismo; el lenguaje lo hace por ti. Además, en C, tienes que recoger tu basura tú mismo; es decir, si asignas dinámicamente un trozo de memoria, tienes que liberarlo explícitamente tú mismo. Si no lo haces, se producirá una fuga de memoria. En Java o Python, la recolección de basura se hace automáticamente. Sin embargo, C es intrínsecamente mucho más rápido que Java o Python.

Una cosa de la que carecen C y Java (pero especialmente C) en comparación con Python es la disponibilidad de bibliotecas de terceros. Python tiene una base de datos más rica de bibliotecas, lo que hace mucho más fácil para los desarrolladores añadir ciertas características.

En general, elija C si:

  • Quiere una interfaz de bajo nivel con el sistema operativo y el hardware.
  • Quieres el mejor rendimiento posible.
  • Sus desarrolladores son expertos en C/C++.
  • No necesita demasiado apoyo externo/de terceros.

Opte por Python si:

  • Quiere implementar algoritmos de ciencia de datos o de aprendizaje automático.
  • Quieres un soporte rico en bibliotecas de terceros.
  • Le parece bien que se cambie la velocidad por la facilidad de uso.
  • Tiene poca experiencia en el desarrollo de sistemas integrados.
  • No necesita una interfaz de bajo nivel con el SO o el hardware.

Opte por Java si:

  • Usted está construyendo aplicaciones web.
  • Quieres más facilidad de desarrollo que C, pero quieres más rendimiento que Python.
  • No necesita demasiado apoyo externo/de terceros.

¿Dejará C de ser poco a poco la mejor opción para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no pueden evitarse en C. Sin embargo, durante décadas, a pesar de la aparición de lenguajes y marcos de trabajo más sofisticados, C ha seguido siendo la opción principal en el desarrollo de sistemas integrados. 

Esto se debe a que la velocidad, el rendimiento y la fiabilidad que ofrece siguen siendo incomparables. El hecho de que Python y gran parte del ecosistema Java (incluyendo el tiempo de ejecución, el lenguaje y el compilador) estén escritos en C, dice mucho de la eficiencia y la durabilidad del lenguaje.

Dicho esto, es innegable que C es más difícil de aprender para los nuevos desarrolladores, que prefieren la sencillez de lenguajes como Python. Esto está provocando un notable descenso en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de IA y ML también está llevando a la gente a elegir Python en lugar de C, simplemente porque ofrece un mayor soporte de bibliotecas.

Es importante recordar que Python ha entrado recientemente en el debate sobre los lenguajes de programación integrados . Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje nunca de ser una de las principales opciones para el desarrollo embebido.

Por qué es importante la codificación segura en C/C++

Muchas cosas pueden salir mal al escribir código en C/C++. Acceder a una dirección de memoria que ya no apunta a datos válidos, o compartir incorrectamente datos entre hilos, puede hacer que toda tu aplicación se bloquee. 

En el caso de los dispositivos integrados, estas implicaciones son mucho más importantes, ya que un fallo en su interior puede hacer que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo del piloto automático de un coche se apaga, éste ya no podrá evitar los obstáculos.

Aquí hay más razones por las que la codificación segura de las aplicaciones C/C++ es tan importante:

  • El manejo inseguro de la memoria (punteros nulos, corrupción de la memoria, desbordamientos de la pila, desbordamientos del búfer y de la pila) provoca la caída de toda la aplicación.
  • Los punteros forman parte de C y C++. Su manejo requiere el máximo cuidado y un profundo conocimiento de los conceptos subyacentes.
  • La recogida de basura es manual. Esto obliga a los programadores a borrar explícitamente cualquier memoria asignada dinámicamente. La memoria no liberada o liberada de forma incorrecta puede provocar fugas de memoria o corrupción.
  • Faltan APIs estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente crítico que los desarrolladores estén formados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona un learning platform personalizado con retos interactivos, courses, y evaluaciones que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, se trata de un contenido específico del lenguaje:marco de trabajo, no de un mero retoque de la formación conceptual general.

Compruebe cómo ayudamos a los sectores de la automoción y el transporte. O pruebe hoy mismo un reto de codificación centrado en la incrustación para experimentar cómo capacitamos a los desarrolladores para escribir aplicaciones incrustadas seguras.

Ver recurso
Ver recurso

En este post, obtendrá una visión general de los dispositivos embebidos y del desarrollo de sistemas embebidos.

¿Quiere saber más?

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.

Reservar una demostración
Compartir en:
Autor
Secure Code Warrior
Publicado el 11 de agosto de 2021

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Secure Code Warrior crea una cultura de desarrolladores orientados a la seguridad, dotándoles de las habilidades necesarias para codificar de forma segura. Nuestro buque insignia es Agile Learning Platform , que ofrece itinerarios basados en habilidades relevantes, prácticas en missions y herramientas contextuales para que los desarrolladores aprendan, desarrollen y apliquen rápidamente sus habilidades para escribir código seguro a gran velocidad.

Compartir en:

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores y gestores de seguridad para construir sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la construcción de sistemas embebidos seguros. 

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basado en un microprocesador. Suelen utilizarse para realizar funciones específicas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrado?

Los dispositivos embebidos son sistemas informáticos construidos con un hardware y un software mínimos, programados para realizar funciones específicas. Dependiendo de su finalidad, la complejidad de los dispositivos integrados puede variar. 

Si un sistema embebido tiene que realizar operaciones complicadas y con muchos recursos, su hardware puede estar compuesto por varios procesadores, con diversos periféricos interconectados. En cambio, si está diseñado para realizar una tarea sencilla, puede contener un solo microcontrolador. 

Algunos sistemas empotrados son cajas negras sin interfaz de usuario, mientras que otros pueden tener interfaces de usuario gráficas y detalladas.

Ejemplos de dispositivos integrados

Los dispositivos integrados tienen aplicaciones en múltiples sectores, desde el aeroespacial al informático, y desde los electrodomésticos a la sanidad. He aquí algunos ejemplos:

  • Un termostato dentro de un aire acondicionado. 
  • Un rastreador de fitness, con pequeños componentes eléctricos que ejecutan un diminuto sistema operativo, que no puede hacer nada más que registrar y sincronizar sus estadísticas de salud.
  • Sistemas de climatización digital.
  • Sistemas de navegación dentro de un avión.
  • Relojes digitales.
  • Dispositivos GPS.
  • Componentes Wi-Fi en hornos microondas y otros productos electrónicos de consumo.
  • Tensiómetros y pulsómetros.
  • Componente de red dentro de una máquina de resonancia magnética que envía datos a la nube.

¿Es un portátil un dispositivo integrado?

Respuesta corta: No. Respuesta larga:

Por definición, un dispositivo integrado encapsula todo el software y el hardware que necesita para realizar sus funciones. En efecto, un portátil envuelve varios componentes de hardware en un cuerpo metálico y engloba todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los típicos sistemas embebidos, que tienen un conjunto de características mínimas predefinidas, un ordenador portátil es de propósito más general y puede utilizarse para realizar una amplia gama de actividades.

Dispositivos integrados en el Internet de las cosas

Los sistemas embebidos están en el corazón del IoT. Tu nevera inteligente puede controlarse a través de tu dispositivo móvil, gracias a un dispositivo integrado. Un dispositivo integrado en tu sistema de seguridad te permite ver las imágenes de las cámaras de seguridad a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, es un dispositivo integrado el que hace toda la magia.

Ciclo de vida del desarrollo de software embebido

En el ciclo de vida típico del desarrollo de software de un dispositivo embebido intervienen los siguientes pasos:

Paso 1: Objetivo y requisitos

Un dispositivo embebido tiene un conjunto de características distintas y precisas. Por eso es muy importante establecer explícitamente su finalidad y sus requisitos antes de iniciar el desarrollo. Se recomienda crear un documento de diseño detallado del sistema. Responde a preguntas como:

  • ¿Qué funciones realizará el aparato?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿Debe tener el dispositivo una interfaz de usuario? En caso afirmativo, ¿es suficiente una línea de comandos o se necesita una interfaz gráfica?
  • ¿Qué límites de tamaño, coste o consumo de energía debe cumplir el dispositivo?
  • ¿Existen parámetros de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos umbrales?

Paso 2: Arquitectura del sistema

Una vez identificados los requisitos únicos del sistema, estamos preparados para diseñar la arquitectura del sistema. Responde a preguntas como:

  • ¿Qué componentes de hardware serán necesarios para desarrollar el dispositivo? Esto incluye la identificación de los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios. 
  • ¿Qué potencia necesitarán los componentes? 
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces hay que añadir/desarrollar para que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a aplicar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará las posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccionar el sistema operativo

La elección del sistema operativo a menudo dicta la eficacia de sus aplicaciones integradas, así que elija sabiamente. Windows para IoT puede tener una alta puntuación en gráficos, pero carece de soporte de hardware. Embedded Linux y Android son gratuitos, mientras que VxWorks y Windows for IoT tienen costes de licencia. 

Con los sistemas de código abierto como Linux y Android, sus desarrolladores tienen más control sobre el núcleo; sin embargo, con los sistemas propietarios, el conjunto de características por defecto del núcleo es todo con lo que se puede trabajar. 

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Se publican rápidamente los parches de seguridad, en caso de que se descubra alguna vulnerabilidad? ¿Hay alguna protección integrada contra los ataques de ciberseguridad más comunes?

Paso 4: Las herramientas de desarrollo

Los diferentes lenguajes y marcos de programación tienen varios pros y contras. Dependiendo de sus requisitos de funcionalidad, velocidad y fiabilidad, puede elegir un lenguaje/marco en lugar de otro. 

Si tu aplicación está basada en la web y quieres un alto rendimiento, elige Java.
Sin embargo, si quieres el mayor rendimiento, elige C/C++. Si quieres el mejor soporte de bibliotecas de terceros, ve con Python.

Paso 5: codificar, refactorizar, probar y codificar un poco más

Una vez que haya decidido la plataforma de desarrollo, estará listo para empezar a codificar. Recuerda que los sistemas embebidos son dispositivos sensibles con recursos de hardware y software limitados. Por lo tanto, es fundamental tener en cuenta las mejores prácticas relativas a la seguridad y el rendimiento de las aplicaciones.

Las revisiones del código ayudan a optimizarlo y a identificar posibles errores. También es necesario realizar pruebas lo más rigurosas posible. Asegúrate de recopilar una lista exhaustiva de todos los casos de prueba que el dispositivo puede encontrar cuando se utilice en producción.

Paso 6: Mantenimiento y asistencia

Al igual que cualquier otra aplicación/dispositivo, el ciclo de vida no termina cuando el dispositivo integrado se ha enviado e instalado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la incorporación de nuevas funciones. Los errores detectados también pueden requerir la publicación de nuevas actualizaciones de firmware.

Los mejores lenguajes de programación embebidos

Hay muchas organizaciones de prestigio, como el IEEE y el TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de que se consulte el índice TIOBE o el IEEE Spectrum, se observará un tema común.

Los tres primeros lenguajes son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el primer puesto, a Java en el segundo y a Python en el tercero. Según la clasificación de IEEE Spectrum para los lenguajes de programación integrados, el orden es: Python, Java y luego C.

¿En qué se diferencian los programas escritos en Java, C o Python?

Los distintos lenguajes gestionan la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de forma diferente. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como máquina virtual Java, o JVM. 

La gestión de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tienes que preocuparte de gestionar la memoria tú mismo; el lenguaje lo hace por ti. Además, en C, tienes que recoger tu basura tú mismo; es decir, si asignas dinámicamente un trozo de memoria, tienes que liberarlo explícitamente tú mismo. Si no lo haces, se producirá una fuga de memoria. En Java o Python, la recolección de basura se hace automáticamente. Sin embargo, C es intrínsecamente mucho más rápido que Java o Python.

Una cosa de la que carecen C y Java (pero especialmente C) en comparación con Python es la disponibilidad de bibliotecas de terceros. Python tiene una base de datos más rica de bibliotecas, lo que hace mucho más fácil para los desarrolladores añadir ciertas características.

En general, elija C si:

  • Quiere una interfaz de bajo nivel con el sistema operativo y el hardware.
  • Quieres el mejor rendimiento posible.
  • Sus desarrolladores son expertos en C/C++.
  • No necesita demasiado apoyo externo/de terceros.

Opte por Python si:

  • Quiere implementar algoritmos de ciencia de datos o de aprendizaje automático.
  • Quieres un soporte rico en bibliotecas de terceros.
  • Le parece bien que se cambie la velocidad por la facilidad de uso.
  • Tiene poca experiencia en el desarrollo de sistemas integrados.
  • No necesita una interfaz de bajo nivel con el SO o el hardware.

Opte por Java si:

  • Usted está construyendo aplicaciones web.
  • Quieres más facilidad de desarrollo que C, pero quieres más rendimiento que Python.
  • No necesita demasiado apoyo externo/de terceros.

¿Dejará C de ser poco a poco la mejor opción para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no pueden evitarse en C. Sin embargo, durante décadas, a pesar de la aparición de lenguajes y marcos de trabajo más sofisticados, C ha seguido siendo la opción principal en el desarrollo de sistemas integrados. 

Esto se debe a que la velocidad, el rendimiento y la fiabilidad que ofrece siguen siendo incomparables. El hecho de que Python y gran parte del ecosistema Java (incluyendo el tiempo de ejecución, el lenguaje y el compilador) estén escritos en C, dice mucho de la eficiencia y la durabilidad del lenguaje.

Dicho esto, es innegable que C es más difícil de aprender para los nuevos desarrolladores, que prefieren la sencillez de lenguajes como Python. Esto está provocando un notable descenso en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de IA y ML también está llevando a la gente a elegir Python en lugar de C, simplemente porque ofrece un mayor soporte de bibliotecas.

Es importante recordar que Python ha entrado recientemente en el debate sobre los lenguajes de programación integrados . Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje nunca de ser una de las principales opciones para el desarrollo embebido.

Por qué es importante la codificación segura en C/C++

Muchas cosas pueden salir mal al escribir código en C/C++. Acceder a una dirección de memoria que ya no apunta a datos válidos, o compartir incorrectamente datos entre hilos, puede hacer que toda tu aplicación se bloquee. 

En el caso de los dispositivos integrados, estas implicaciones son mucho más importantes, ya que un fallo en su interior puede hacer que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo del piloto automático de un coche se apaga, éste ya no podrá evitar los obstáculos.

Aquí hay más razones por las que la codificación segura de las aplicaciones C/C++ es tan importante:

  • El manejo inseguro de la memoria (punteros nulos, corrupción de la memoria, desbordamientos de la pila, desbordamientos del búfer y de la pila) provoca la caída de toda la aplicación.
  • Los punteros forman parte de C y C++. Su manejo requiere el máximo cuidado y un profundo conocimiento de los conceptos subyacentes.
  • La recogida de basura es manual. Esto obliga a los programadores a borrar explícitamente cualquier memoria asignada dinámicamente. La memoria no liberada o liberada de forma incorrecta puede provocar fugas de memoria o corrupción.
  • Faltan APIs estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente crítico que los desarrolladores estén formados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona un learning platform personalizado con retos interactivos, courses, y evaluaciones que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, se trata de un contenido específico del lenguaje:marco de trabajo, no de un mero retoque de la formación conceptual general.

Compruebe cómo ayudamos a los sectores de la automoción y el transporte. O pruebe hoy mismo un reto de codificación centrado en la incrustación para experimentar cómo capacitamos a los desarrolladores para escribir aplicaciones incrustadas seguras.

Ver recurso
Ver recurso

Rellene el siguiente formulario para descargar el informe

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores y gestores de seguridad para construir sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la construcción de sistemas embebidos seguros. 

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basado en un microprocesador. Suelen utilizarse para realizar funciones específicas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrado?

Los dispositivos embebidos son sistemas informáticos construidos con un hardware y un software mínimos, programados para realizar funciones específicas. Dependiendo de su finalidad, la complejidad de los dispositivos integrados puede variar. 

Si un sistema embebido tiene que realizar operaciones complicadas y con muchos recursos, su hardware puede estar compuesto por varios procesadores, con diversos periféricos interconectados. En cambio, si está diseñado para realizar una tarea sencilla, puede contener un solo microcontrolador. 

Algunos sistemas empotrados son cajas negras sin interfaz de usuario, mientras que otros pueden tener interfaces de usuario gráficas y detalladas.

Ejemplos de dispositivos integrados

Los dispositivos integrados tienen aplicaciones en múltiples sectores, desde el aeroespacial al informático, y desde los electrodomésticos a la sanidad. He aquí algunos ejemplos:

  • Un termostato dentro de un aire acondicionado. 
  • Un rastreador de fitness, con pequeños componentes eléctricos que ejecutan un diminuto sistema operativo, que no puede hacer nada más que registrar y sincronizar sus estadísticas de salud.
  • Sistemas de climatización digital.
  • Sistemas de navegación dentro de un avión.
  • Relojes digitales.
  • Dispositivos GPS.
  • Componentes Wi-Fi en hornos microondas y otros productos electrónicos de consumo.
  • Tensiómetros y pulsómetros.
  • Componente de red dentro de una máquina de resonancia magnética que envía datos a la nube.

¿Es un portátil un dispositivo integrado?

Respuesta corta: No. Respuesta larga:

Por definición, un dispositivo integrado encapsula todo el software y el hardware que necesita para realizar sus funciones. En efecto, un portátil envuelve varios componentes de hardware en un cuerpo metálico y engloba todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los típicos sistemas embebidos, que tienen un conjunto de características mínimas predefinidas, un ordenador portátil es de propósito más general y puede utilizarse para realizar una amplia gama de actividades.

Dispositivos integrados en el Internet de las cosas

Los sistemas embebidos están en el corazón del IoT. Tu nevera inteligente puede controlarse a través de tu dispositivo móvil, gracias a un dispositivo integrado. Un dispositivo integrado en tu sistema de seguridad te permite ver las imágenes de las cámaras de seguridad a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, es un dispositivo integrado el que hace toda la magia.

Ciclo de vida del desarrollo de software embebido

En el ciclo de vida típico del desarrollo de software de un dispositivo embebido intervienen los siguientes pasos:

Paso 1: Objetivo y requisitos

Un dispositivo embebido tiene un conjunto de características distintas y precisas. Por eso es muy importante establecer explícitamente su finalidad y sus requisitos antes de iniciar el desarrollo. Se recomienda crear un documento de diseño detallado del sistema. Responde a preguntas como:

  • ¿Qué funciones realizará el aparato?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿Debe tener el dispositivo una interfaz de usuario? En caso afirmativo, ¿es suficiente una línea de comandos o se necesita una interfaz gráfica?
  • ¿Qué límites de tamaño, coste o consumo de energía debe cumplir el dispositivo?
  • ¿Existen parámetros de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos umbrales?

Paso 2: Arquitectura del sistema

Una vez identificados los requisitos únicos del sistema, estamos preparados para diseñar la arquitectura del sistema. Responde a preguntas como:

  • ¿Qué componentes de hardware serán necesarios para desarrollar el dispositivo? Esto incluye la identificación de los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios. 
  • ¿Qué potencia necesitarán los componentes? 
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces hay que añadir/desarrollar para que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a aplicar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará las posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccionar el sistema operativo

La elección del sistema operativo a menudo dicta la eficacia de sus aplicaciones integradas, así que elija sabiamente. Windows para IoT puede tener una alta puntuación en gráficos, pero carece de soporte de hardware. Embedded Linux y Android son gratuitos, mientras que VxWorks y Windows for IoT tienen costes de licencia. 

Con los sistemas de código abierto como Linux y Android, sus desarrolladores tienen más control sobre el núcleo; sin embargo, con los sistemas propietarios, el conjunto de características por defecto del núcleo es todo con lo que se puede trabajar. 

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Se publican rápidamente los parches de seguridad, en caso de que se descubra alguna vulnerabilidad? ¿Hay alguna protección integrada contra los ataques de ciberseguridad más comunes?

Paso 4: Las herramientas de desarrollo

Los diferentes lenguajes y marcos de programación tienen varios pros y contras. Dependiendo de sus requisitos de funcionalidad, velocidad y fiabilidad, puede elegir un lenguaje/marco en lugar de otro. 

Si tu aplicación está basada en la web y quieres un alto rendimiento, elige Java.
Sin embargo, si quieres el mayor rendimiento, elige C/C++. Si quieres el mejor soporte de bibliotecas de terceros, ve con Python.

Paso 5: codificar, refactorizar, probar y codificar un poco más

Una vez que haya decidido la plataforma de desarrollo, estará listo para empezar a codificar. Recuerda que los sistemas embebidos son dispositivos sensibles con recursos de hardware y software limitados. Por lo tanto, es fundamental tener en cuenta las mejores prácticas relativas a la seguridad y el rendimiento de las aplicaciones.

Las revisiones del código ayudan a optimizarlo y a identificar posibles errores. También es necesario realizar pruebas lo más rigurosas posible. Asegúrate de recopilar una lista exhaustiva de todos los casos de prueba que el dispositivo puede encontrar cuando se utilice en producción.

Paso 6: Mantenimiento y asistencia

Al igual que cualquier otra aplicación/dispositivo, el ciclo de vida no termina cuando el dispositivo integrado se ha enviado e instalado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la incorporación de nuevas funciones. Los errores detectados también pueden requerir la publicación de nuevas actualizaciones de firmware.

Los mejores lenguajes de programación embebidos

Hay muchas organizaciones de prestigio, como el IEEE y el TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de que se consulte el índice TIOBE o el IEEE Spectrum, se observará un tema común.

Los tres primeros lenguajes son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el primer puesto, a Java en el segundo y a Python en el tercero. Según la clasificación de IEEE Spectrum para los lenguajes de programación integrados, el orden es: Python, Java y luego C.

¿En qué se diferencian los programas escritos en Java, C o Python?

Los distintos lenguajes gestionan la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de forma diferente. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como máquina virtual Java, o JVM. 

La gestión de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tienes que preocuparte de gestionar la memoria tú mismo; el lenguaje lo hace por ti. Además, en C, tienes que recoger tu basura tú mismo; es decir, si asignas dinámicamente un trozo de memoria, tienes que liberarlo explícitamente tú mismo. Si no lo haces, se producirá una fuga de memoria. En Java o Python, la recolección de basura se hace automáticamente. Sin embargo, C es intrínsecamente mucho más rápido que Java o Python.

Una cosa de la que carecen C y Java (pero especialmente C) en comparación con Python es la disponibilidad de bibliotecas de terceros. Python tiene una base de datos más rica de bibliotecas, lo que hace mucho más fácil para los desarrolladores añadir ciertas características.

En general, elija C si:

  • Quiere una interfaz de bajo nivel con el sistema operativo y el hardware.
  • Quieres el mejor rendimiento posible.
  • Sus desarrolladores son expertos en C/C++.
  • No necesita demasiado apoyo externo/de terceros.

Opte por Python si:

  • Quiere implementar algoritmos de ciencia de datos o de aprendizaje automático.
  • Quieres un soporte rico en bibliotecas de terceros.
  • Le parece bien que se cambie la velocidad por la facilidad de uso.
  • Tiene poca experiencia en el desarrollo de sistemas integrados.
  • No necesita una interfaz de bajo nivel con el SO o el hardware.

Opte por Java si:

  • Usted está construyendo aplicaciones web.
  • Quieres más facilidad de desarrollo que C, pero quieres más rendimiento que Python.
  • No necesita demasiado apoyo externo/de terceros.

¿Dejará C de ser poco a poco la mejor opción para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no pueden evitarse en C. Sin embargo, durante décadas, a pesar de la aparición de lenguajes y marcos de trabajo más sofisticados, C ha seguido siendo la opción principal en el desarrollo de sistemas integrados. 

Esto se debe a que la velocidad, el rendimiento y la fiabilidad que ofrece siguen siendo incomparables. El hecho de que Python y gran parte del ecosistema Java (incluyendo el tiempo de ejecución, el lenguaje y el compilador) estén escritos en C, dice mucho de la eficiencia y la durabilidad del lenguaje.

Dicho esto, es innegable que C es más difícil de aprender para los nuevos desarrolladores, que prefieren la sencillez de lenguajes como Python. Esto está provocando un notable descenso en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de IA y ML también está llevando a la gente a elegir Python en lugar de C, simplemente porque ofrece un mayor soporte de bibliotecas.

Es importante recordar que Python ha entrado recientemente en el debate sobre los lenguajes de programación integrados . Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje nunca de ser una de las principales opciones para el desarrollo embebido.

Por qué es importante la codificación segura en C/C++

Muchas cosas pueden salir mal al escribir código en C/C++. Acceder a una dirección de memoria que ya no apunta a datos válidos, o compartir incorrectamente datos entre hilos, puede hacer que toda tu aplicación se bloquee. 

En el caso de los dispositivos integrados, estas implicaciones son mucho más importantes, ya que un fallo en su interior puede hacer que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo del piloto automático de un coche se apaga, éste ya no podrá evitar los obstáculos.

Aquí hay más razones por las que la codificación segura de las aplicaciones C/C++ es tan importante:

  • El manejo inseguro de la memoria (punteros nulos, corrupción de la memoria, desbordamientos de la pila, desbordamientos del búfer y de la pila) provoca la caída de toda la aplicación.
  • Los punteros forman parte de C y C++. Su manejo requiere el máximo cuidado y un profundo conocimiento de los conceptos subyacentes.
  • La recogida de basura es manual. Esto obliga a los programadores a borrar explícitamente cualquier memoria asignada dinámicamente. La memoria no liberada o liberada de forma incorrecta puede provocar fugas de memoria o corrupción.
  • Faltan APIs estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente crítico que los desarrolladores estén formados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona un learning platform personalizado con retos interactivos, courses, y evaluaciones que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, se trata de un contenido específico del lenguaje:marco de trabajo, no de un mero retoque de la formación conceptual general.

Compruebe cómo ayudamos a los sectores de la automoción y el transporte. O pruebe hoy mismo un reto de codificación centrado en la incrustación para experimentar cómo capacitamos a los desarrolladores para escribir aplicaciones incrustadas seguras.

Acceso a recursos

Haga clic en el siguiente enlace y descargue el PDF de este recurso.

Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.

Ver el informeReservar una demostración
Descargar PDF
Ver recurso
Compartir en:
¿Quiere saber más?

Compartir en:
Autor
Secure Code Warrior
Publicado el 11 de agosto de 2021

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Secure Code Warrior crea una cultura de desarrolladores orientados a la seguridad, dotándoles de las habilidades necesarias para codificar de forma segura. Nuestro buque insignia es Agile Learning Platform , que ofrece itinerarios basados en habilidades relevantes, prácticas en missions y herramientas contextuales para que los desarrolladores aprendan, desarrollen y apliquen rápidamente sus habilidades para escribir código seguro a gran velocidad.

Compartir en:

En Secure Code Warrior, siempre estamos buscando ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores y gestores de seguridad para construir sistemas embebidos seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este post, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la construcción de sistemas embebidos seguros. 

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basado en un microprocesador. Suelen utilizarse para realizar funciones específicas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrado?

Los dispositivos embebidos son sistemas informáticos construidos con un hardware y un software mínimos, programados para realizar funciones específicas. Dependiendo de su finalidad, la complejidad de los dispositivos integrados puede variar. 

Si un sistema embebido tiene que realizar operaciones complicadas y con muchos recursos, su hardware puede estar compuesto por varios procesadores, con diversos periféricos interconectados. En cambio, si está diseñado para realizar una tarea sencilla, puede contener un solo microcontrolador. 

Algunos sistemas empotrados son cajas negras sin interfaz de usuario, mientras que otros pueden tener interfaces de usuario gráficas y detalladas.

Ejemplos de dispositivos integrados

Los dispositivos integrados tienen aplicaciones en múltiples sectores, desde el aeroespacial al informático, y desde los electrodomésticos a la sanidad. He aquí algunos ejemplos:

  • Un termostato dentro de un aire acondicionado. 
  • Un rastreador de fitness, con pequeños componentes eléctricos que ejecutan un diminuto sistema operativo, que no puede hacer nada más que registrar y sincronizar sus estadísticas de salud.
  • Sistemas de climatización digital.
  • Sistemas de navegación dentro de un avión.
  • Relojes digitales.
  • Dispositivos GPS.
  • Componentes Wi-Fi en hornos microondas y otros productos electrónicos de consumo.
  • Tensiómetros y pulsómetros.
  • Componente de red dentro de una máquina de resonancia magnética que envía datos a la nube.

¿Es un portátil un dispositivo integrado?

Respuesta corta: No. Respuesta larga:

Por definición, un dispositivo integrado encapsula todo el software y el hardware que necesita para realizar sus funciones. En efecto, un portátil envuelve varios componentes de hardware en un cuerpo metálico y engloba todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los típicos sistemas embebidos, que tienen un conjunto de características mínimas predefinidas, un ordenador portátil es de propósito más general y puede utilizarse para realizar una amplia gama de actividades.

Dispositivos integrados en el Internet de las cosas

Los sistemas embebidos están en el corazón del IoT. Tu nevera inteligente puede controlarse a través de tu dispositivo móvil, gracias a un dispositivo integrado. Un dispositivo integrado en tu sistema de seguridad te permite ver las imágenes de las cámaras de seguridad a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, es un dispositivo integrado el que hace toda la magia.

Ciclo de vida del desarrollo de software embebido

En el ciclo de vida típico del desarrollo de software de un dispositivo embebido intervienen los siguientes pasos:

Paso 1: Objetivo y requisitos

Un dispositivo embebido tiene un conjunto de características distintas y precisas. Por eso es muy importante establecer explícitamente su finalidad y sus requisitos antes de iniciar el desarrollo. Se recomienda crear un documento de diseño detallado del sistema. Responde a preguntas como:

  • ¿Qué funciones realizará el aparato?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿Debe tener el dispositivo una interfaz de usuario? En caso afirmativo, ¿es suficiente una línea de comandos o se necesita una interfaz gráfica?
  • ¿Qué límites de tamaño, coste o consumo de energía debe cumplir el dispositivo?
  • ¿Existen parámetros de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos umbrales?

Paso 2: Arquitectura del sistema

Una vez identificados los requisitos únicos del sistema, estamos preparados para diseñar la arquitectura del sistema. Responde a preguntas como:

  • ¿Qué componentes de hardware serán necesarios para desarrollar el dispositivo? Esto incluye la identificación de los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios. 
  • ¿Qué potencia necesitarán los componentes? 
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces hay que añadir/desarrollar para que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a aplicar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará las posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccionar el sistema operativo

La elección del sistema operativo a menudo dicta la eficacia de sus aplicaciones integradas, así que elija sabiamente. Windows para IoT puede tener una alta puntuación en gráficos, pero carece de soporte de hardware. Embedded Linux y Android son gratuitos, mientras que VxWorks y Windows for IoT tienen costes de licencia. 

Con los sistemas de código abierto como Linux y Android, sus desarrolladores tienen más control sobre el núcleo; sin embargo, con los sistemas propietarios, el conjunto de características por defecto del núcleo es todo con lo que se puede trabajar. 

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Se publican rápidamente los parches de seguridad, en caso de que se descubra alguna vulnerabilidad? ¿Hay alguna protección integrada contra los ataques de ciberseguridad más comunes?

Paso 4: Las herramientas de desarrollo

Los diferentes lenguajes y marcos de programación tienen varios pros y contras. Dependiendo de sus requisitos de funcionalidad, velocidad y fiabilidad, puede elegir un lenguaje/marco en lugar de otro. 

Si tu aplicación está basada en la web y quieres un alto rendimiento, elige Java.
Sin embargo, si quieres el mayor rendimiento, elige C/C++. Si quieres el mejor soporte de bibliotecas de terceros, ve con Python.

Paso 5: codificar, refactorizar, probar y codificar un poco más

Una vez que haya decidido la plataforma de desarrollo, estará listo para empezar a codificar. Recuerda que los sistemas embebidos son dispositivos sensibles con recursos de hardware y software limitados. Por lo tanto, es fundamental tener en cuenta las mejores prácticas relativas a la seguridad y el rendimiento de las aplicaciones.

Las revisiones del código ayudan a optimizarlo y a identificar posibles errores. También es necesario realizar pruebas lo más rigurosas posible. Asegúrate de recopilar una lista exhaustiva de todos los casos de prueba que el dispositivo puede encontrar cuando se utilice en producción.

Paso 6: Mantenimiento y asistencia

Al igual que cualquier otra aplicación/dispositivo, el ciclo de vida no termina cuando el dispositivo integrado se ha enviado e instalado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la incorporación de nuevas funciones. Los errores detectados también pueden requerir la publicación de nuevas actualizaciones de firmware.

Los mejores lenguajes de programación embebidos

Hay muchas organizaciones de prestigio, como el IEEE y el TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de que se consulte el índice TIOBE o el IEEE Spectrum, se observará un tema común.

Los tres primeros lenguajes son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el primer puesto, a Java en el segundo y a Python en el tercero. Según la clasificación de IEEE Spectrum para los lenguajes de programación integrados, el orden es: Python, Java y luego C.

¿En qué se diferencian los programas escritos en Java, C o Python?

Los distintos lenguajes gestionan la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de forma diferente. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como máquina virtual Java, o JVM. 

La gestión de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tienes que preocuparte de gestionar la memoria tú mismo; el lenguaje lo hace por ti. Además, en C, tienes que recoger tu basura tú mismo; es decir, si asignas dinámicamente un trozo de memoria, tienes que liberarlo explícitamente tú mismo. Si no lo haces, se producirá una fuga de memoria. En Java o Python, la recolección de basura se hace automáticamente. Sin embargo, C es intrínsecamente mucho más rápido que Java o Python.

Una cosa de la que carecen C y Java (pero especialmente C) en comparación con Python es la disponibilidad de bibliotecas de terceros. Python tiene una base de datos más rica de bibliotecas, lo que hace mucho más fácil para los desarrolladores añadir ciertas características.

En general, elija C si:

  • Quiere una interfaz de bajo nivel con el sistema operativo y el hardware.
  • Quieres el mejor rendimiento posible.
  • Sus desarrolladores son expertos en C/C++.
  • No necesita demasiado apoyo externo/de terceros.

Opte por Python si:

  • Quiere implementar algoritmos de ciencia de datos o de aprendizaje automático.
  • Quieres un soporte rico en bibliotecas de terceros.
  • Le parece bien que se cambie la velocidad por la facilidad de uso.
  • Tiene poca experiencia en el desarrollo de sistemas integrados.
  • No necesita una interfaz de bajo nivel con el SO o el hardware.

Opte por Java si:

  • Usted está construyendo aplicaciones web.
  • Quieres más facilidad de desarrollo que C, pero quieres más rendimiento que Python.
  • No necesita demasiado apoyo externo/de terceros.

¿Dejará C de ser poco a poco la mejor opción para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no pueden evitarse en C. Sin embargo, durante décadas, a pesar de la aparición de lenguajes y marcos de trabajo más sofisticados, C ha seguido siendo la opción principal en el desarrollo de sistemas integrados. 

Esto se debe a que la velocidad, el rendimiento y la fiabilidad que ofrece siguen siendo incomparables. El hecho de que Python y gran parte del ecosistema Java (incluyendo el tiempo de ejecución, el lenguaje y el compilador) estén escritos en C, dice mucho de la eficiencia y la durabilidad del lenguaje.

Dicho esto, es innegable que C es más difícil de aprender para los nuevos desarrolladores, que prefieren la sencillez de lenguajes como Python. Esto está provocando un notable descenso en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de IA y ML también está llevando a la gente a elegir Python en lugar de C, simplemente porque ofrece un mayor soporte de bibliotecas.

Es importante recordar que Python ha entrado recientemente en el debate sobre los lenguajes de programación integrados . Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje nunca de ser una de las principales opciones para el desarrollo embebido.

Por qué es importante la codificación segura en C/C++

Muchas cosas pueden salir mal al escribir código en C/C++. Acceder a una dirección de memoria que ya no apunta a datos válidos, o compartir incorrectamente datos entre hilos, puede hacer que toda tu aplicación se bloquee. 

En el caso de los dispositivos integrados, estas implicaciones son mucho más importantes, ya que un fallo en su interior puede hacer que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo del piloto automático de un coche se apaga, éste ya no podrá evitar los obstáculos.

Aquí hay más razones por las que la codificación segura de las aplicaciones C/C++ es tan importante:

  • El manejo inseguro de la memoria (punteros nulos, corrupción de la memoria, desbordamientos de la pila, desbordamientos del búfer y de la pila) provoca la caída de toda la aplicación.
  • Los punteros forman parte de C y C++. Su manejo requiere el máximo cuidado y un profundo conocimiento de los conceptos subyacentes.
  • La recogida de basura es manual. Esto obliga a los programadores a borrar explícitamente cualquier memoria asignada dinámicamente. La memoria no liberada o liberada de forma incorrecta puede provocar fugas de memoria o corrupción.
  • Faltan APIs estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente crítico que los desarrolladores estén formados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona un learning platform personalizado con retos interactivos, courses, y evaluaciones que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, se trata de un contenido específico del lenguaje:marco de trabajo, no de un mero retoque de la formación conceptual general.

Compruebe cómo ayudamos a los sectores de la automoción y el transporte. O pruebe hoy mismo un reto de codificación centrado en la incrustación para experimentar cómo capacitamos a los desarrolladores para escribir aplicaciones incrustadas seguras.

Índice

Descargar PDF
Ver recurso
¿Quiere saber más?

Secure Code Warrior hace que la codificación segura sea una experiencia positiva y atractiva para los desarrolladores a medida que aumentan sus habilidades. Guiamos a cada programador a lo largo de su propio camino de aprendizaje, para que los desarrolladores con conocimientos de seguridad se conviertan en los superhéroes cotidianos de nuestro mundo conectado.

Secure Code Warrior está a disposición de su organización para ayudarle a proteger el código a lo largo de todo el ciclo de vida de desarrollo de software y crear una cultura en la que la ciberseguridad sea una prioridad. Tanto si es director de AppSec, desarrollador, CISO o cualquier persona implicada en la seguridad, podemos ayudar a su organización a reducir los riesgos asociados a un código inseguro.

Reservar una demostraciónDescargar
Compartir en:
Centro de recursos

Recursos para empezar

Más entradas
Centro de recursos

Recursos para empezar

Más entradas