SCW Icons
hero bg no divider
Blog

Desarrollo de dispositivos y sistemas integrados: descripción general

Secure Code Warrior
Published Aug 11, 2021
Last updated on Mar 06, 2026

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la creación de sistemas integrados seguros.

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basados en microprocesadores. Por lo general, se utilizan para realizar funciones dedicadas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrados?

Los dispositivos integrados son sistemas informáticos diseñados específicamente con hardware y software minimalistas, programados para realizar funciones específicas. Según su finalidad, la complejidad de los dispositivos integrados puede variar.

Si un sistema integrado tiene que realizar operaciones complicadas que consumen muchos recursos, su hardware puede comprender múltiples procesadores, con varios periféricos interconectados. Sin embargo, si está diseñado para realizar una tarea sencilla, es posible que solo contenga un único microcontrolador.

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

Ejemplos de dispositivos integrados

Los dispositivos integrados encuentran aplicaciones en múltiples industrias, desde la aeroespacial hasta la informática, y desde los electrodomésticos hasta la atención médica. Estos son algunos ejemplos:

  • Un termostato dentro de un acondicionador de aire.
  • Un rastreador de actividad física, con pequeños componentes eléctricos que funcionan con un pequeño sistema operativo, que no puede hacer más que registrar y sincronizar tus estadísticas de salud.
  • Sistemas digitales de climatización.
  • 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.
  • Monitores de presión arterial y latidos del corazón.
  • 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. De hecho, un portátil contiene varios componentes de hardware en un cuerpo metálico y abarca todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los sistemas embebidos típicos, que tienen un conjunto mínimo de funciones predefinidas, un portátil tiene un propósito más general y se puede utilizar para realizar una amplia gama de actividades.

Dispositivos integrados en Internet de las cosas

Los sistemas integrados son la base del IoT. Su frigorífico inteligente se puede controlar a través de su dispositivo móvil, gracias a un dispositivo integrado. Es un dispositivo integrado en su sistema de seguridad que le permite ver imágenes de CCTV a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, se trata de un dispositivo integrado que hace toda la magia.

Ciclo de vida del desarrollo de software integrado

Los siguientes pasos están involucrados en el ciclo de vida típico de desarrollo de software de un dispositivo integrado:

Paso 1: Propósito y requisitos

Un dispositivo integrado tiene un conjunto de funciones distintas y precisas. Por eso es muy importante indicar explícitamente su propósito y requisitos antes de comenzar el desarrollo. Se recomienda crear un documento de diseño detallado para el sistema. Responda a preguntas como las siguientes:

  • ¿Qué funciones realizará el dispositivo?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿El dispositivo debe tener una interfaz de usuario? En caso afirmativo, ¿basta con una línea de comandos o se necesita una interfaz de usuario gráfica?
  • ¿Qué límites de tamaño, costo o consumo de energía debe cumplir el dispositivo?
  • ¿Hay puntos de referencia de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos límites?

Paso 2: Arquitectura del sistema

Una vez que hayamos identificado los requisitos únicos del sistema, estaremos listos para diseñar la arquitectura del sistema. Responda a preguntas como las siguientes:

  • ¿Qué componentes de hardware se necesitarán para desarrollar el dispositivo? Esto incluye identificar los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios.
  • ¿Cuánta energía requerirán los componentes?
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces se deben agregar o desarrollar para permitir que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a implementar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccione el sistema operativo

La elección del sistema operativo a menudo determina la eficacia de las aplicaciones integradas, por lo que debe elegir con prudencia. Windows para IoT puede obtener una puntuación alta en gráficos, pero carece de soporte de hardware. Los sistemas Linux y Android integrados son gratuitos, mientras que VxWorks y Windows para IoT tienen costos de licencia.

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

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Los parches de seguridad se publican rápidamente, en caso de que se descubra alguna vulnerabilidad? ¿Existe 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 varias ventajas y desventajas. Según sus requisitos de características, velocidad y confiabilidad, puede elegir un lenguaje/marco en lugar de otro.

Si su aplicación está basada en la web y desea un alto rendimiento, opte por Java.
Sin embargo, si quieres un rendimiento más rápido, opta por C/C++. Si quieres el mejor soporte para bibliotecas de terceros, opta por Python.

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

Una vez que te hayas decidido por la plataforma de desarrollo, estarás listo para empezar a programar. Recuerde que los sistemas embebidos son dispositivos sensibles con recursos limitados de hardware y software. Por lo tanto, es de vital importancia tener en cuenta las mejores prácticas en relación con la seguridad y el rendimiento de las aplicaciones.

Las revisiones de código ayudan a optimizar el código e identificar cualquier error potencial. También debes realizar las pruebas con el mayor rigor posible. Asegúrese de compilar una lista exhaustiva de todos los casos de prueba a los que pueda enfrentarse el dispositivo cuando se utilice en producción.

Paso 6: Mantenimiento y soporte

Al igual que cualquier otra aplicación o dispositivo, el ciclo de vida no termina cuando se envía e instala el dispositivo integrado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la adición de nuevas funciones. Cualquier error reportado también puede requerir la publicación de nuevas actualizaciones de firmware.

Principales lenguajes de programación embebidos

Hay muchas organizaciones acreditadas, como IEEE y TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de si marca la Índice TIOBE, o el Espectro IEEE, notarás un tema común.

Los 3 lenguajes principales son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el puesto #1, a Java en el #2 y a Python en el #3. Según el ranking de lenguajes de programación embebidos de IEEE Spectrum, el orden es: Python, Java y, a continuación, C.

¿En qué se diferencia el firmware escrito en Java, C o Python?

Los diferentes lenguajes administran la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de diferentes maneras. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como Java Virtual Machine o JVM.

La administración de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tiene que preocuparse por administrar la memoria usted mismo; el lenguaje lo hace por usted. Además, en C, tienes que recoger la basura tú mismo; es decir, si asignas una memoria de forma dinámica, tienes que liberarla tú mismo de forma explícita. Si no lo haces, se producirá una pérdida de memoria. En Java o Python, la recolección de basura se realiza 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 de bibliotecas más rica, lo que facilita mucho a los desarrolladores la adición de ciertas funciones.

En general, elige C si:

  • Desea 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 necesitas demasiado soporte externo o de terceros.

Opta por Python si:

  • Quiere implementar algoritmos de ciencia de datos o aprendizaje automático.
  • Quieres un soporte completo para bibliotecas de terceros.
  • Está de acuerdo con cambiar la velocidad por la facilidad de uso.
  • Tiene una experiencia limitada en el desarrollo integrado.
  • No necesita una interfaz de bajo nivel con el sistema operativo o el hardware.

Opta por Java si:

  • Estás creando aplicaciones web.
  • Quieres más facilidad de desarrollo que en C, pero aun así quieres más rendimiento que Python.
  • No necesitas demasiado soporte externo o de terceros.

¿C dejará poco a poco de ser una de las mejores opciones para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no se pueden evitar en C. Sin embargo, durante décadas, a pesar del lanzamiento de lenguajes y marcos más sofisticados, C ha seguido siendo una de las mejores opciones en el desarrollo integrado.

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

Dicho esto, C es innegablemente más difícil de aprender para los nuevos desarrolladores, que prefieren la simplicidad de lenguajes como Python. Esto está creando una disminución notable en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de inteligencia artificial y aprendizaje automático también está impulsando a las personas a elegir Python en lugar de C, simplemente porque ofrece una mayor compatibilidad con las bibliotecas.

Es importante recordar que Python solo recientemente pasó a formar parte del mejor lenguaje de programación embebido debate. Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje de ser la mejor opción para el desarrollo integrado.

Por qué la codificación segura es importante 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 datos de forma incorrecta entre subprocesos puede provocar que toda la 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 provocar que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo de piloto automático de un automóvil se apaga, el automóvil ya no podrá evitar los obstáculos.

Estas son 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, daños en la memoria, desbordamientos de pilas, desbordamientos de búferes y pilas) hace que toda la aplicación se bloquee.
  • Los punteros son parte integral de C y C++. Manejarlos requiere el máximo cuidado y un conocimiento profundo de los conceptos subyacentes.
  • La recolección de basura es manual. Esto obliga a los programadores a eliminar explícitamente cualquier memoria asignada dinámicamente. La memoria que no esté libre o se libere de forma incorrecta puede provocar pérdidas de memoria o daños.
  • Hay una falta de API estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente fundamental que los desarrolladores estén capacitados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona una plataforma de aprendizaje personalizada con desafíos, cursos y evaluaciones interactivos que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, estamos hablando de contenido específico para language:framework, y no solo de una modificación de la formación conceptual general.

Echa un vistazo cómo ayudamos a las industrias automotriz y de transporte. O prueba un desafío de codificación centrado en la incrustación ¡hoy para experimentar cómo capacitamos a los desarrolladores para que escriban aplicaciones integradas seguras!

Ver recurso
Ver recurso

En esta publicación, obtendrá una descripción general del desarrollo de dispositivos y sistemas integrados.

¿Interesado en más?

Secure Code Warrior makes secure coding a positive and engaging experience for developers as they increase their skills. We guide each coder along their own preferred learning pathway, so that security-skilled developers become the everyday superheroes of our connected world.

learn more

Secure Code Warrior está aquí para que su organización le ayude a proteger el código durante todo el ciclo de vida del desarrollo de software y a crear una cultura en la que la ciberseguridad sea una prioridad. Ya sea administrador de AppSec, desarrollador, CISO o cualquier persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados con el código inseguro.

Reserva una demostración
Comparte en:
linkedin brandsSocialx logo
autor
Secure Code Warrior
Published Aug 11, 2021

Secure Code Warrior makes secure coding a positive and engaging experience for developers as they increase their skills. We guide each coder along their own preferred learning pathway, so that security-skilled developers become the everyday superheroes of our connected world.

This article was written by Secure Code Warrior's team of industry experts, committed to empowering developers with the knowledge and skills to build secure software from the start. Drawing on deep expertise in secure coding practices, industry trends, and real-world insights.

Comparte en:
linkedin brandsSocialx logo

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la creación de sistemas integrados seguros.

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basados en microprocesadores. Por lo general, se utilizan para realizar funciones dedicadas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrados?

Los dispositivos integrados son sistemas informáticos diseñados específicamente con hardware y software minimalistas, programados para realizar funciones específicas. Según su finalidad, la complejidad de los dispositivos integrados puede variar.

Si un sistema integrado tiene que realizar operaciones complicadas que consumen muchos recursos, su hardware puede comprender múltiples procesadores, con varios periféricos interconectados. Sin embargo, si está diseñado para realizar una tarea sencilla, es posible que solo contenga un único microcontrolador.

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

Ejemplos de dispositivos integrados

Los dispositivos integrados encuentran aplicaciones en múltiples industrias, desde la aeroespacial hasta la informática, y desde los electrodomésticos hasta la atención médica. Estos son algunos ejemplos:

  • Un termostato dentro de un acondicionador de aire.
  • Un rastreador de actividad física, con pequeños componentes eléctricos que funcionan con un pequeño sistema operativo, que no puede hacer más que registrar y sincronizar tus estadísticas de salud.
  • Sistemas digitales de climatización.
  • 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.
  • Monitores de presión arterial y latidos del corazón.
  • 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. De hecho, un portátil contiene varios componentes de hardware en un cuerpo metálico y abarca todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los sistemas embebidos típicos, que tienen un conjunto mínimo de funciones predefinidas, un portátil tiene un propósito más general y se puede utilizar para realizar una amplia gama de actividades.

Dispositivos integrados en Internet de las cosas

Los sistemas integrados son la base del IoT. Su frigorífico inteligente se puede controlar a través de su dispositivo móvil, gracias a un dispositivo integrado. Es un dispositivo integrado en su sistema de seguridad que le permite ver imágenes de CCTV a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, se trata de un dispositivo integrado que hace toda la magia.

Ciclo de vida del desarrollo de software integrado

Los siguientes pasos están involucrados en el ciclo de vida típico de desarrollo de software de un dispositivo integrado:

Paso 1: Propósito y requisitos

Un dispositivo integrado tiene un conjunto de funciones distintas y precisas. Por eso es muy importante indicar explícitamente su propósito y requisitos antes de comenzar el desarrollo. Se recomienda crear un documento de diseño detallado para el sistema. Responda a preguntas como las siguientes:

  • ¿Qué funciones realizará el dispositivo?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿El dispositivo debe tener una interfaz de usuario? En caso afirmativo, ¿basta con una línea de comandos o se necesita una interfaz de usuario gráfica?
  • ¿Qué límites de tamaño, costo o consumo de energía debe cumplir el dispositivo?
  • ¿Hay puntos de referencia de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos límites?

Paso 2: Arquitectura del sistema

Una vez que hayamos identificado los requisitos únicos del sistema, estaremos listos para diseñar la arquitectura del sistema. Responda a preguntas como las siguientes:

  • ¿Qué componentes de hardware se necesitarán para desarrollar el dispositivo? Esto incluye identificar los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios.
  • ¿Cuánta energía requerirán los componentes?
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces se deben agregar o desarrollar para permitir que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a implementar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccione el sistema operativo

La elección del sistema operativo a menudo determina la eficacia de las aplicaciones integradas, por lo que debe elegir con prudencia. Windows para IoT puede obtener una puntuación alta en gráficos, pero carece de soporte de hardware. Los sistemas Linux y Android integrados son gratuitos, mientras que VxWorks y Windows para IoT tienen costos de licencia.

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

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Los parches de seguridad se publican rápidamente, en caso de que se descubra alguna vulnerabilidad? ¿Existe 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 varias ventajas y desventajas. Según sus requisitos de características, velocidad y confiabilidad, puede elegir un lenguaje/marco en lugar de otro.

Si su aplicación está basada en la web y desea un alto rendimiento, opte por Java.
Sin embargo, si quieres un rendimiento más rápido, opta por C/C++. Si quieres el mejor soporte para bibliotecas de terceros, opta por Python.

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

Una vez que te hayas decidido por la plataforma de desarrollo, estarás listo para empezar a programar. Recuerde que los sistemas embebidos son dispositivos sensibles con recursos limitados de hardware y software. Por lo tanto, es de vital importancia tener en cuenta las mejores prácticas en relación con la seguridad y el rendimiento de las aplicaciones.

Las revisiones de código ayudan a optimizar el código e identificar cualquier error potencial. También debes realizar las pruebas con el mayor rigor posible. Asegúrese de compilar una lista exhaustiva de todos los casos de prueba a los que pueda enfrentarse el dispositivo cuando se utilice en producción.

Paso 6: Mantenimiento y soporte

Al igual que cualquier otra aplicación o dispositivo, el ciclo de vida no termina cuando se envía e instala el dispositivo integrado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la adición de nuevas funciones. Cualquier error reportado también puede requerir la publicación de nuevas actualizaciones de firmware.

Principales lenguajes de programación embebidos

Hay muchas organizaciones acreditadas, como IEEE y TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de si marca la Índice TIOBE, o el Espectro IEEE, notarás un tema común.

Los 3 lenguajes principales son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el puesto #1, a Java en el #2 y a Python en el #3. Según el ranking de lenguajes de programación embebidos de IEEE Spectrum, el orden es: Python, Java y, a continuación, C.

¿En qué se diferencia el firmware escrito en Java, C o Python?

Los diferentes lenguajes administran la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de diferentes maneras. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como Java Virtual Machine o JVM.

La administración de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tiene que preocuparse por administrar la memoria usted mismo; el lenguaje lo hace por usted. Además, en C, tienes que recoger la basura tú mismo; es decir, si asignas una memoria de forma dinámica, tienes que liberarla tú mismo de forma explícita. Si no lo haces, se producirá una pérdida de memoria. En Java o Python, la recolección de basura se realiza 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 de bibliotecas más rica, lo que facilita mucho a los desarrolladores la adición de ciertas funciones.

En general, elige C si:

  • Desea 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 necesitas demasiado soporte externo o de terceros.

Opta por Python si:

  • Quiere implementar algoritmos de ciencia de datos o aprendizaje automático.
  • Quieres un soporte completo para bibliotecas de terceros.
  • Está de acuerdo con cambiar la velocidad por la facilidad de uso.
  • Tiene una experiencia limitada en el desarrollo integrado.
  • No necesita una interfaz de bajo nivel con el sistema operativo o el hardware.

Opta por Java si:

  • Estás creando aplicaciones web.
  • Quieres más facilidad de desarrollo que en C, pero aun así quieres más rendimiento que Python.
  • No necesitas demasiado soporte externo o de terceros.

¿C dejará poco a poco de ser una de las mejores opciones para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no se pueden evitar en C. Sin embargo, durante décadas, a pesar del lanzamiento de lenguajes y marcos más sofisticados, C ha seguido siendo una de las mejores opciones en el desarrollo integrado.

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

Dicho esto, C es innegablemente más difícil de aprender para los nuevos desarrolladores, que prefieren la simplicidad de lenguajes como Python. Esto está creando una disminución notable en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de inteligencia artificial y aprendizaje automático también está impulsando a las personas a elegir Python en lugar de C, simplemente porque ofrece una mayor compatibilidad con las bibliotecas.

Es importante recordar que Python solo recientemente pasó a formar parte del mejor lenguaje de programación embebido debate. Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje de ser la mejor opción para el desarrollo integrado.

Por qué la codificación segura es importante 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 datos de forma incorrecta entre subprocesos puede provocar que toda la 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 provocar que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo de piloto automático de un automóvil se apaga, el automóvil ya no podrá evitar los obstáculos.

Estas son 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, daños en la memoria, desbordamientos de pilas, desbordamientos de búferes y pilas) hace que toda la aplicación se bloquee.
  • Los punteros son parte integral de C y C++. Manejarlos requiere el máximo cuidado y un conocimiento profundo de los conceptos subyacentes.
  • La recolección de basura es manual. Esto obliga a los programadores a eliminar explícitamente cualquier memoria asignada dinámicamente. La memoria que no esté libre o se libere de forma incorrecta puede provocar pérdidas de memoria o daños.
  • Hay una falta de API estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente fundamental que los desarrolladores estén capacitados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona una plataforma de aprendizaje personalizada con desafíos, cursos y evaluaciones interactivos que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, estamos hablando de contenido específico para language:framework, y no solo de una modificación de la formación conceptual general.

Echa un vistazo cómo ayudamos a las industrias automotriz y de transporte. O prueba un desafío de codificación centrado en la incrustación ¡hoy para experimentar cómo capacitamos a los desarrolladores para que escriban aplicaciones integradas seguras!

Ver recurso
Ver recurso

Rellene el siguiente formulario para descargar el informe

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

Enviar
scw success icon
scw error icon
Para enviar el formulario, habilite las cookies de «análisis». No dudes en volver a desactivarlas una vez que hayas terminado.

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la creación de sistemas integrados seguros.

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basados en microprocesadores. Por lo general, se utilizan para realizar funciones dedicadas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrados?

Los dispositivos integrados son sistemas informáticos diseñados específicamente con hardware y software minimalistas, programados para realizar funciones específicas. Según su finalidad, la complejidad de los dispositivos integrados puede variar.

Si un sistema integrado tiene que realizar operaciones complicadas que consumen muchos recursos, su hardware puede comprender múltiples procesadores, con varios periféricos interconectados. Sin embargo, si está diseñado para realizar una tarea sencilla, es posible que solo contenga un único microcontrolador.

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

Ejemplos de dispositivos integrados

Los dispositivos integrados encuentran aplicaciones en múltiples industrias, desde la aeroespacial hasta la informática, y desde los electrodomésticos hasta la atención médica. Estos son algunos ejemplos:

  • Un termostato dentro de un acondicionador de aire.
  • Un rastreador de actividad física, con pequeños componentes eléctricos que funcionan con un pequeño sistema operativo, que no puede hacer más que registrar y sincronizar tus estadísticas de salud.
  • Sistemas digitales de climatización.
  • 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.
  • Monitores de presión arterial y latidos del corazón.
  • 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. De hecho, un portátil contiene varios componentes de hardware en un cuerpo metálico y abarca todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los sistemas embebidos típicos, que tienen un conjunto mínimo de funciones predefinidas, un portátil tiene un propósito más general y se puede utilizar para realizar una amplia gama de actividades.

Dispositivos integrados en Internet de las cosas

Los sistemas integrados son la base del IoT. Su frigorífico inteligente se puede controlar a través de su dispositivo móvil, gracias a un dispositivo integrado. Es un dispositivo integrado en su sistema de seguridad que le permite ver imágenes de CCTV a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, se trata de un dispositivo integrado que hace toda la magia.

Ciclo de vida del desarrollo de software integrado

Los siguientes pasos están involucrados en el ciclo de vida típico de desarrollo de software de un dispositivo integrado:

Paso 1: Propósito y requisitos

Un dispositivo integrado tiene un conjunto de funciones distintas y precisas. Por eso es muy importante indicar explícitamente su propósito y requisitos antes de comenzar el desarrollo. Se recomienda crear un documento de diseño detallado para el sistema. Responda a preguntas como las siguientes:

  • ¿Qué funciones realizará el dispositivo?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿El dispositivo debe tener una interfaz de usuario? En caso afirmativo, ¿basta con una línea de comandos o se necesita una interfaz de usuario gráfica?
  • ¿Qué límites de tamaño, costo o consumo de energía debe cumplir el dispositivo?
  • ¿Hay puntos de referencia de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos límites?

Paso 2: Arquitectura del sistema

Una vez que hayamos identificado los requisitos únicos del sistema, estaremos listos para diseñar la arquitectura del sistema. Responda a preguntas como las siguientes:

  • ¿Qué componentes de hardware se necesitarán para desarrollar el dispositivo? Esto incluye identificar los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios.
  • ¿Cuánta energía requerirán los componentes?
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces se deben agregar o desarrollar para permitir que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a implementar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccione el sistema operativo

La elección del sistema operativo a menudo determina la eficacia de las aplicaciones integradas, por lo que debe elegir con prudencia. Windows para IoT puede obtener una puntuación alta en gráficos, pero carece de soporte de hardware. Los sistemas Linux y Android integrados son gratuitos, mientras que VxWorks y Windows para IoT tienen costos de licencia.

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

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Los parches de seguridad se publican rápidamente, en caso de que se descubra alguna vulnerabilidad? ¿Existe 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 varias ventajas y desventajas. Según sus requisitos de características, velocidad y confiabilidad, puede elegir un lenguaje/marco en lugar de otro.

Si su aplicación está basada en la web y desea un alto rendimiento, opte por Java.
Sin embargo, si quieres un rendimiento más rápido, opta por C/C++. Si quieres el mejor soporte para bibliotecas de terceros, opta por Python.

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

Una vez que te hayas decidido por la plataforma de desarrollo, estarás listo para empezar a programar. Recuerde que los sistemas embebidos son dispositivos sensibles con recursos limitados de hardware y software. Por lo tanto, es de vital importancia tener en cuenta las mejores prácticas en relación con la seguridad y el rendimiento de las aplicaciones.

Las revisiones de código ayudan a optimizar el código e identificar cualquier error potencial. También debes realizar las pruebas con el mayor rigor posible. Asegúrese de compilar una lista exhaustiva de todos los casos de prueba a los que pueda enfrentarse el dispositivo cuando se utilice en producción.

Paso 6: Mantenimiento y soporte

Al igual que cualquier otra aplicación o dispositivo, el ciclo de vida no termina cuando se envía e instala el dispositivo integrado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la adición de nuevas funciones. Cualquier error reportado también puede requerir la publicación de nuevas actualizaciones de firmware.

Principales lenguajes de programación embebidos

Hay muchas organizaciones acreditadas, como IEEE y TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de si marca la Índice TIOBE, o el Espectro IEEE, notarás un tema común.

Los 3 lenguajes principales son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el puesto #1, a Java en el #2 y a Python en el #3. Según el ranking de lenguajes de programación embebidos de IEEE Spectrum, el orden es: Python, Java y, a continuación, C.

¿En qué se diferencia el firmware escrito en Java, C o Python?

Los diferentes lenguajes administran la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de diferentes maneras. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como Java Virtual Machine o JVM.

La administración de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tiene que preocuparse por administrar la memoria usted mismo; el lenguaje lo hace por usted. Además, en C, tienes que recoger la basura tú mismo; es decir, si asignas una memoria de forma dinámica, tienes que liberarla tú mismo de forma explícita. Si no lo haces, se producirá una pérdida de memoria. En Java o Python, la recolección de basura se realiza 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 de bibliotecas más rica, lo que facilita mucho a los desarrolladores la adición de ciertas funciones.

En general, elige C si:

  • Desea 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 necesitas demasiado soporte externo o de terceros.

Opta por Python si:

  • Quiere implementar algoritmos de ciencia de datos o aprendizaje automático.
  • Quieres un soporte completo para bibliotecas de terceros.
  • Está de acuerdo con cambiar la velocidad por la facilidad de uso.
  • Tiene una experiencia limitada en el desarrollo integrado.
  • No necesita una interfaz de bajo nivel con el sistema operativo o el hardware.

Opta por Java si:

  • Estás creando aplicaciones web.
  • Quieres más facilidad de desarrollo que en C, pero aun así quieres más rendimiento que Python.
  • No necesitas demasiado soporte externo o de terceros.

¿C dejará poco a poco de ser una de las mejores opciones para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no se pueden evitar en C. Sin embargo, durante décadas, a pesar del lanzamiento de lenguajes y marcos más sofisticados, C ha seguido siendo una de las mejores opciones en el desarrollo integrado.

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

Dicho esto, C es innegablemente más difícil de aprender para los nuevos desarrolladores, que prefieren la simplicidad de lenguajes como Python. Esto está creando una disminución notable en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de inteligencia artificial y aprendizaje automático también está impulsando a las personas a elegir Python en lugar de C, simplemente porque ofrece una mayor compatibilidad con las bibliotecas.

Es importante recordar que Python solo recientemente pasó a formar parte del mejor lenguaje de programación embebido debate. Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje de ser la mejor opción para el desarrollo integrado.

Por qué la codificación segura es importante 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 datos de forma incorrecta entre subprocesos puede provocar que toda la 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 provocar que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo de piloto automático de un automóvil se apaga, el automóvil ya no podrá evitar los obstáculos.

Estas son 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, daños en la memoria, desbordamientos de pilas, desbordamientos de búferes y pilas) hace que toda la aplicación se bloquee.
  • Los punteros son parte integral de C y C++. Manejarlos requiere el máximo cuidado y un conocimiento profundo de los conceptos subyacentes.
  • La recolección de basura es manual. Esto obliga a los programadores a eliminar explícitamente cualquier memoria asignada dinámicamente. La memoria que no esté libre o se libere de forma incorrecta puede provocar pérdidas de memoria o daños.
  • Hay una falta de API estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente fundamental que los desarrolladores estén capacitados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona una plataforma de aprendizaje personalizada con desafíos, cursos y evaluaciones interactivos que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, estamos hablando de contenido específico para language:framework, y no solo de una modificación de la formación conceptual general.

Echa un vistazo cómo ayudamos a las industrias automotriz y de transporte. O prueba un desafío de codificación centrado en la incrustación ¡hoy para experimentar cómo capacitamos a los desarrolladores para que escriban aplicaciones integradas seguras!

Ver seminario web
Comenzar
learn more

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

Secure Code Warrior está aquí para que su organización le ayude a proteger el código durante todo el ciclo de vida del desarrollo de software y a crear una cultura en la que la ciberseguridad sea una prioridad. Ya sea administrador de AppSec, desarrollador, CISO o cualquier persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados con el código inseguro.

Ver informeReserva una demostración
Ver recurso
Comparte en:
linkedin brandsSocialx logo
¿Interesado en más?

Comparte en:
linkedin brandsSocialx logo
autor
Secure Code Warrior
Published Aug 11, 2021

Secure Code Warrior makes secure coding a positive and engaging experience for developers as they increase their skills. We guide each coder along their own preferred learning pathway, so that security-skilled developers become the everyday superheroes of our connected world.

This article was written by Secure Code Warrior's team of industry experts, committed to empowering developers with the knowledge and skills to build secure software from the start. Drawing on deep expertise in secure coding practices, industry trends, and real-world insights.

Comparte en:
linkedin brandsSocialx logo

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de capacitación. Para que los desarrolladores de sistemas integrados y los administradores de seguridad puedan crear sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas integrados. En esta publicación, compartiremos las cosas clave que los desarrolladores y arquitectos deben saber sobre la creación de sistemas integrados seguros.

Un dispositivo integrado es una unidad informática independiente, con su propio hardware y software basados en microprocesadores. Por lo general, se utilizan para realizar funciones dedicadas, ya sea de forma independiente o como parte de sistemas más grandes.

¿Qué es un dispositivo y un sistema integrados?

Los dispositivos integrados son sistemas informáticos diseñados específicamente con hardware y software minimalistas, programados para realizar funciones específicas. Según su finalidad, la complejidad de los dispositivos integrados puede variar.

Si un sistema integrado tiene que realizar operaciones complicadas que consumen muchos recursos, su hardware puede comprender múltiples procesadores, con varios periféricos interconectados. Sin embargo, si está diseñado para realizar una tarea sencilla, es posible que solo contenga un único microcontrolador.

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

Ejemplos de dispositivos integrados

Los dispositivos integrados encuentran aplicaciones en múltiples industrias, desde la aeroespacial hasta la informática, y desde los electrodomésticos hasta la atención médica. Estos son algunos ejemplos:

  • Un termostato dentro de un acondicionador de aire.
  • Un rastreador de actividad física, con pequeños componentes eléctricos que funcionan con un pequeño sistema operativo, que no puede hacer más que registrar y sincronizar tus estadísticas de salud.
  • Sistemas digitales de climatización.
  • 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.
  • Monitores de presión arterial y latidos del corazón.
  • 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. De hecho, un portátil contiene varios componentes de hardware en un cuerpo metálico y abarca todo el software que necesita para ofrecer su conjunto de funciones.

Sin embargo, a diferencia de los sistemas embebidos típicos, que tienen un conjunto mínimo de funciones predefinidas, un portátil tiene un propósito más general y se puede utilizar para realizar una amplia gama de actividades.

Dispositivos integrados en Internet de las cosas

Los sistemas integrados son la base del IoT. Su frigorífico inteligente se puede controlar a través de su dispositivo móvil, gracias a un dispositivo integrado. Es un dispositivo integrado en su sistema de seguridad que le permite ver imágenes de CCTV a miles de kilómetros de distancia. Y cuando pulsas un botón para poner tu coche en piloto automático, entre bastidores, se trata de un dispositivo integrado que hace toda la magia.

Ciclo de vida del desarrollo de software integrado

Los siguientes pasos están involucrados en el ciclo de vida típico de desarrollo de software de un dispositivo integrado:

Paso 1: Propósito y requisitos

Un dispositivo integrado tiene un conjunto de funciones distintas y precisas. Por eso es muy importante indicar explícitamente su propósito y requisitos antes de comenzar el desarrollo. Se recomienda crear un documento de diseño detallado para el sistema. Responda a preguntas como las siguientes:

  • ¿Qué funciones realizará el dispositivo?
  • ¿Formará parte de otra máquina o funcionará por sí sola?
  • ¿El dispositivo debe tener una interfaz de usuario? En caso afirmativo, ¿basta con una línea de comandos o se necesita una interfaz de usuario gráfica?
  • ¿Qué límites de tamaño, costo o consumo de energía debe cumplir el dispositivo?
  • ¿Hay puntos de referencia de rendimiento? Por ejemplo, ¿se espera que el dispositivo responda en tiempo real o dentro de ciertos límites?

Paso 2: Arquitectura del sistema

Una vez que hayamos identificado los requisitos únicos del sistema, estaremos listos para diseñar la arquitectura del sistema. Responda a preguntas como las siguientes:

  • ¿Qué componentes de hardware se necesitarán para desarrollar el dispositivo? Esto incluye identificar los circuitos, los chips del procesador y los microcontroladores, junto con los periféricos internos y externos necesarios.
  • ¿Cuánta energía requerirán los componentes?
  • ¿Se conectará el dispositivo a Internet?
  • ¿Qué interfaces se deben agregar o desarrollar para permitir que el dispositivo se conecte a otros dispositivos o a la máquina más grande?
  • ¿Cómo va a implementar el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará posibles vulnerabilidades, exploits y malware?

Paso 3: Seleccione el sistema operativo

La elección del sistema operativo a menudo determina la eficacia de las aplicaciones integradas, por lo que debe elegir con prudencia. Windows para IoT puede obtener una puntuación alta en gráficos, pero carece de soporte de hardware. Los sistemas Linux y Android integrados son gratuitos, mientras que VxWorks y Windows para IoT tienen costos de licencia.

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

También es importante tener en cuenta las implicaciones de seguridad al elegir un sistema operativo. ¿Los parches de seguridad se publican rápidamente, en caso de que se descubra alguna vulnerabilidad? ¿Existe 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 varias ventajas y desventajas. Según sus requisitos de características, velocidad y confiabilidad, puede elegir un lenguaje/marco en lugar de otro.

Si su aplicación está basada en la web y desea un alto rendimiento, opte por Java.
Sin embargo, si quieres un rendimiento más rápido, opta por C/C++. Si quieres el mejor soporte para bibliotecas de terceros, opta por Python.

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

Una vez que te hayas decidido por la plataforma de desarrollo, estarás listo para empezar a programar. Recuerde que los sistemas embebidos son dispositivos sensibles con recursos limitados de hardware y software. Por lo tanto, es de vital importancia tener en cuenta las mejores prácticas en relación con la seguridad y el rendimiento de las aplicaciones.

Las revisiones de código ayudan a optimizar el código e identificar cualquier error potencial. También debes realizar las pruebas con el mayor rigor posible. Asegúrese de compilar una lista exhaustiva de todos los casos de prueba a los que pueda enfrentarse el dispositivo cuando se utilice en producción.

Paso 6: Mantenimiento y soporte

Al igual que cualquier otra aplicación o dispositivo, el ciclo de vida no termina cuando se envía e instala el dispositivo integrado. A medida que el dispositivo se utiliza en la producción, se identifican nuevos casos de uso que requieren la adición de nuevas funciones. Cualquier error reportado también puede requerir la publicación de nuevas actualizaciones de firmware.

Principales lenguajes de programación embebidos

Hay muchas organizaciones acreditadas, como IEEE y TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de si marca la Índice TIOBE, o el Espectro IEEE, notarás un tema común.

Los 3 lenguajes principales son siempre C, Python y Java. El índice TIOBE de julio de 2021 sitúa a C en el puesto #1, a Java en el #2 y a Python en el #3. Según el ranking de lenguajes de programación embebidos de IEEE Spectrum, el orden es: Python, Java y, a continuación, C.

¿En qué se diferencia el firmware escrito en Java, C o Python?

Los diferentes lenguajes administran la memoria, las interacciones con el sistema operativo y el tiempo de ejecución de diferentes maneras. Por ejemplo, las aplicaciones Java se ejecutan en un entorno de ejecución especializado conocido como Java Virtual Machine o JVM.

La administración de la memoria en C/C++ es manual, sin embargo, en Java o Python, no tiene que preocuparse por administrar la memoria usted mismo; el lenguaje lo hace por usted. Además, en C, tienes que recoger la basura tú mismo; es decir, si asignas una memoria de forma dinámica, tienes que liberarla tú mismo de forma explícita. Si no lo haces, se producirá una pérdida de memoria. En Java o Python, la recolección de basura se realiza 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 de bibliotecas más rica, lo que facilita mucho a los desarrolladores la adición de ciertas funciones.

En general, elige C si:

  • Desea 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 necesitas demasiado soporte externo o de terceros.

Opta por Python si:

  • Quiere implementar algoritmos de ciencia de datos o aprendizaje automático.
  • Quieres un soporte completo para bibliotecas de terceros.
  • Está de acuerdo con cambiar la velocidad por la facilidad de uso.
  • Tiene una experiencia limitada en el desarrollo integrado.
  • No necesita una interfaz de bajo nivel con el sistema operativo o el hardware.

Opta por Java si:

  • Estás creando aplicaciones web.
  • Quieres más facilidad de desarrollo que en C, pero aun así quieres más rendimiento que Python.
  • No necesitas demasiado soporte externo o de terceros.

¿C dejará poco a poco de ser una de las mejores opciones para el desarrollo integrado?

Los lenguajes de alto nivel facilitan la codificación al abstraer las complejidades que simplemente no se pueden evitar en C. Sin embargo, durante décadas, a pesar del lanzamiento de lenguajes y marcos más sofisticados, C ha seguido siendo una de las mejores opciones en el desarrollo integrado.

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

Dicho esto, C es innegablemente más difícil de aprender para los nuevos desarrolladores, que prefieren la simplicidad de lenguajes como Python. Esto está creando una disminución notable en el tamaño de la comunidad de desarrolladores de C. El aumento del desarrollo de aplicaciones de inteligencia artificial y aprendizaje automático también está impulsando a las personas a elegir Python en lugar de C, simplemente porque ofrece una mayor compatibilidad con las bibliotecas.

Es importante recordar que Python solo recientemente pasó a formar parte del mejor lenguaje de programación embebido debate. Sí, es posible que su adopción siga aumentando en los próximos años, pero no esperamos que C deje de ser la mejor opción para el desarrollo integrado.

Por qué la codificación segura es importante 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 datos de forma incorrecta entre subprocesos puede provocar que toda la 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 provocar que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo de piloto automático de un automóvil se apaga, el automóvil ya no podrá evitar los obstáculos.

Estas son 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, daños en la memoria, desbordamientos de pilas, desbordamientos de búferes y pilas) hace que toda la aplicación se bloquee.
  • Los punteros son parte integral de C y C++. Manejarlos requiere el máximo cuidado y un conocimiento profundo de los conceptos subyacentes.
  • La recolección de basura es manual. Esto obliga a los programadores a eliminar explícitamente cualquier memoria asignada dinámicamente. La memoria que no esté libre o se libere de forma incorrecta puede provocar pérdidas de memoria o daños.
  • Hay una falta de API estandarizadas para estructuras de datos avanzadas (por ejemplo, tablas hash, conjuntos, etc.), lo que obliga a los desarrolladores a reinventar la rueda.

Es absolutamente fundamental que los desarrolladores estén capacitados en codificación segura para aplicaciones C/C++. Secure Code Warrior proporciona una plataforma de aprendizaje personalizada con desafíos, cursos y evaluaciones interactivos que pueden permitir a los desarrolladores escribir código C/C++ seguro. En este caso, estamos hablando de contenido específico para language:framework, y no solo de una modificación de la formación conceptual general.

Echa un vistazo cómo ayudamos a las industrias automotriz y de transporte. O prueba un desafío de codificación centrado en la incrustación ¡hoy para experimentar cómo capacitamos a los desarrolladores para que escriban aplicaciones integradas seguras!

Tabla de contenido

Descargar PDF
Ver recurso
¿Interesado en más?

Secure Code Warrior makes secure coding a positive and engaging experience for developers as they increase their skills. We guide each coder along their own preferred learning pathway, so that security-skilled developers become the everyday superheroes of our connected world.

learn more

Secure Code Warrior está aquí para que su organización le ayude a proteger el código durante todo el ciclo de vida del desarrollo de software y a crear una cultura en la que la ciberseguridad sea una prioridad. Ya sea administrador de AppSec, desarrollador, CISO o cualquier persona relacionada con la seguridad, podemos ayudar a su organización a reducir los riesgos asociados con el código inseguro.

Reserva una demostraciónDescargar
Comparte en:
linkedin brandsSocialx logo
Centro de recursos

Recursos para empezar

Más publicaciones
Centro de recursos

Recursos para empezar

Más publicaciones