Blog

Desarrollo de dispositivos y sistemas embebidos: una visión general

August 11, 2021
Secure Code Warrior
Primer plano de una placa de circuito electrónico verde con disipador de calor metálico, chips y conectores.

En Secure Code Warrior, siempre buscamos ampliar nuestra cobertura de formación. Para capacitar a los desarrolladores de sistemas embebidos y a los responsables de seguridad en la creación de sistemas integrados seguros, nos adentramos en el mundo de la seguridad de los sistemas embebidos. En este artículo, compartiremos los aspectos clave que los desarrolladores y arquitectos deben conocer sobre la creación de sistemas embebidos seguros.

Un dispositivo embebido 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 embebido?

Los dispositivos embebidos son sistemas informáticos diseñados específicamente con hardware y software minimalistas, programados para realizar funciones concretas. Dependiendo de su propósito, la complejidad de estos dispositivos puede variar.

Si un sistema embebido debe realizar operaciones complejas que consumen muchos recursos, su hardware puede incluir múltiples procesadores con varios periféricos interconectados. Sin embargo, si está diseñado para una tarea sencilla, puede contener solo un microcontrolador.

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

Ejemplos de dispositivos embebidos

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

  • Un termostato dentro de un aire acondicionado.
  • Un monitor de actividad física, con pequeños componentes eléctricos que ejecutan un sistema operativo diminuto, capaz únicamente de registrar y sincronizar sus estadísticas de salud.
  • Sistemas digitales de control climático.
  • Sistemas de navegación dentro de un avión.
  • Relojes digitales.
  • Dispositivos GPS.
  • Componentes Wi-Fi dentro de hornos microondas y otros productos electrónicos de consumo.
  • Monitores de presión arterial y frecuencia cardíaca.
  • 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 embebido?

Respuesta corta: No. Respuesta larga:

Por definición, un dispositivo embebido encapsula todo el software y hardware necesario para realizar sus funciones. Un portátil ciertamente integra varios componentes de hardware en una carcasa metálica y abarca todo el software necesario para ofrecer su conjunto de funciones.

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

Dispositivos embebidos en el Internet de las Cosas

Los sistemas embebidos son el corazón del IoT. Su nevera inteligente puede controlarse a través de su dispositivo móvil gracias a un sistema embebido. Es un dispositivo embebido en su sistema de seguridad el que le permite ver imágenes de CCTV a miles de kilómetros de distancia. Y cuando pulsa un botón para poner su coche en piloto automático, entre bastidores, es un dispositivo embebido el que hace toda la magia.

Ciclo de vida del desarrollo de software embebido

El ciclo de vida típico del desarrollo de software para un dispositivo embebido comprende las siguientes etapas:

Paso 1: Propósito y requisitos

Un dispositivo embebido cuenta con un conjunto de funciones preciso y distintivo. Por ello, es fundamental definir claramente 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:

  • ¿Qué funciones realizará el dispositivo?
  • ¿Formará parte de otra máquina o funcionará de forma autónoma?
  • ¿Debe tener una interfaz de usuario? En caso afirmativo, ¿basta con una línea de comandos o se requiere una interfaz gráfica?
  • ¿Qué límites de tamaño, coste o consumo energético debe respetar el dispositivo?
  • ¿Existen puntos de referencia 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 listos para diseñar su arquitectura. Responda a preguntas como:

  • ¿Qué componentes de hardware serán necesarios para desarrollar el dispositivo? Esto incluye identificar los circuitos, chips de procesador y microcontroladores, junto con cualquier periférico interno o externo necesario.
  • ¿Cuánta energía requerirán los componentes?
  • ¿El dispositivo estará conectado a internet?
  • ¿Qué interfaces deben añadirse o desarrollarse para permitir que el dispositivo se conecte a otros equipos o a la máquina principal?
  • ¿Cómo implementará el cifrado? (piense en algoritmos, almacenamiento de claves, etc.)
  • ¿Cómo identificará y evitará posibles vulnerabilidades, exploits y malware?

Paso 3: Selección del sistema operativo

La elección del sistema operativo suele determinar la eficacia de sus aplicaciones embebidas, así que elija con cuidado. Windows for IoT puede destacar en gráficos, pero carece de soporte de hardware. Linux embebido y Android son gratuitos, mientras que VxWorks y Windows for IoT conllevan costes de licencia.

Con sistemas de código abierto como Linux y Android, sus desarrolladores tienen más control sobre el kernel; sin embargo, con los sistemas propietarios, solo puede trabajar con el conjunto de funciones predeterminado del kernel.

También es importante considerar las implicaciones de seguridad al elegir un sistema operativo. ¿Se publican parches de seguridad rápidamente en caso de descubrir vulnerabilidades? ¿Existe alguna protección integrada contra los ataques de ciberseguridad más comunes?

Paso 4: Herramientas de desarrollo

Los diferentes lenguajes de programación y marcos de trabajo tienen diversas ventajas e inconvenientes. Dependiendo de sus requisitos de funcionalidad, velocidad y fiabilidad, puede elegir uno u otro.

Si su aplicación es web y busca un alto rendimiento, utilice Java.
Sin embargo, si desea el mayor rendimiento posible, elija C/C++. Si busca el mejor soporte de bibliotecas de terceros, opte por Python.

Paso 5: Programar, refactorizar, probar y seguir programando

Una vez decidida la plataforma de desarrollo, estará listo para empezar a programar. Recuerde que los sistemas embebidos son dispositivos sensibles con recursos de hardware y software limitados. Por tanto, es fundamental tener en cuenta las mejores prácticas en cuanto a seguridad y rendimiento de las aplicaciones.

Las revisiones de código ayudan a optimizarlo y a identificar posibles errores. También debe realizar pruebas lo más rigurosas posible. Asegúrese de recopilar una lista exhaustiva de todos los casos de prueba que el dispositivo pueda encontrar durante su uso en producción.

Paso 6: Mantenimiento y soporte

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

Principales lenguajes de programación embebida

Existen muchas organizaciones de renombre, como IEEE y TIOBE, que clasifican los lenguajes de programación según su popularidad y uso. Sin embargo, independientemente de si consulta el índice TIOBE, o el IEEE Spectrum, notará 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 n.º 1, a Java en el n.º 2 y a Python en el n.º 3. Según la clasificación de IEEE Spectrum para lenguajes de programación embebida, el orden es: Python, Java y luego C.

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

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

La gestión de memoria en C/C++ es manual; sin embargo, en Java o Python, no tiene que preocuparse por gestionar la memoria usted mismo, ya que el lenguaje lo hace por usted. Es más, en C, usted mismo debe realizar la recolección de basura; es decir, si asigna dinámicamente un fragmento de memoria, debe liberarlo explícitamente. Si no lo hace, se producirá una fuga de memoria. En Java o Python, la recolección de basura se realiza automáticamente. No obstante, C es intrínsecamente mucho más rápido que Java o Python.

Una cosa que a C y Java (pero especialmente a C) les falta en comparación con Python es la disponibilidad de bibliotecas de terceros. Python cuenta con una base de datos de bibliotecas más rica, lo que facilita mucho a los desarrolladores la incorporación de determinadas funciones.

En general, elija C si:

  • Desea una interfaz de bajo nivel con el sistema operativo y el hardware.
  • Busca el mejor rendimiento posible.
  • Sus desarrolladores tienen experiencia en C/C++.
  • No necesita demasiado soporte externo o de terceros.

Elija Python si:

  • Desea implementar algoritmos de ciencia de datos o aprendizaje automático.
  • Busca un amplio soporte de bibliotecas de terceros.
  • Está dispuesto a sacrificar velocidad por facilidad de uso.
  • Tiene poca experiencia en desarrollo embebido.
  • No necesita una interfaz de bajo nivel con el sistema operativo o el hardware.

Elija Java si:

  • Está creando aplicaciones web.
  • Busca una mayor facilidad de desarrollo que en C, pero aún desea un rendimiento superior al de Python.
  • No necesita demasiado soporte externo o de terceros.

¿Dejará C de ser poco a poco una opción principal para el desarrollo embebido?

Los lenguajes de alto nivel facilitan la programació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 de trabajo más sofisticados, C ha seguido siendo una opción líder en el desarrollo embebido.

Esto se debe a que la velocidad, el rendimiento y la fiabilidad que ofrece siguen siendo inigualables. 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, quienes prefieren la simplicidad de lenguajes como Python. Esto está provocando un declive notable en el tamaño de la comunidad de desarrolladores de C. El auge en el desarrollo de aplicaciones de IA y aprendizaje automático también está llevando a las personas a elegir Python sobre C, simplemente porque ofrece un mayor soporte de bibliotecas.

Es importante recordar que Python solo recientemente se ha convertido en parte del debate sobre los mejores lenguajes de programación embebida. Sí, su adopción puede seguir aumentando en los próximos años, pero no esperamos que C deje de ser una opción principal para el desarrollo embebido.

Por qué la programació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 incorrectamente entre hilos, puede hacer que toda la aplicación falle.

Para los dispositivos embebidos, estas implicaciones son mucho más significativas, ya que un fallo en ellos puede hacer que una máquina mucho más grande deje de funcionar. Por ejemplo, si el módulo de piloto automático de un coche se apaga, el vehículo ya no podrá evitar obstáculos.

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

  • El manejo inseguro de la memoria (punteros nulos, corrupción de memoria, desbordamientos de pila, de búfer y de montón) provoca el bloqueo total de la aplicación.
  • Los punteros son una parte esencial de C y C++. Su manejo 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 liberar explícitamente cualquier memoria asignada dinámicamente. La memoria no liberada o liberada incorrectamente puede provocar fugas o corrupción de memoria.
  • Existe 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 reciban formación en codificación segura para aplicaciones en C/C++. Secure Code Warrior ofrece una plataforma de aprendizaje personalizada con desafíos interactivos, cursos y evaluaciones que permiten a los desarrolladores escribir código C/C++ seguro. Aquí hablamos de contenido específico para lenguajes y frameworks, no solo de un ajuste en la formación conceptual general.

Descubra cómo ayudamos a las industrias automotriz y de transporte. O pruebe un desafío de codificación centrado en sistemas embebidos hoy mismo para experimentar cómo capacitamos a los desarrolladores para escribir aplicaciones embebidas seguras.‍

Eslogan

Controle el desarrollo impulsado por IA antes de su lanzamiento

Mida el riesgo asistido por IA, aplique políticas de codificación segura en el momento de la confirmación y acelere la entrega segura en todo su ciclo de vida de desarrollo de software (SDLC).

Reservar una demostración
Biblioteca de recursos

Explorar más blogs

Acceda a contenido especializado sobre programación segura, gobernanza de IA y gestión de riesgos de software.

ver todo
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Una cultura de seguridad: cómo Sage creó su programa de defensores

Descubre cómo Sage reforzó su seguridad con un enfoque flexible y centrado en las relaciones, logrando formar a más de 200 expertos en seguridad y alcanzar una reducción de riesgos cuantificable.

Más información
Icono de ventana de navegador con las letras KVK en negrita y dos líneas horizontales azules debajo sobre un fondo azul degradado.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Kamer van Koophandel: Seguridad a escala impulsada por los desarrolladores

La Cámara de Comercio (Kamer van Koophandel) comparte cómo integró la programación segura en el desarrollo diario mediante certificaciones basadas en roles, evaluaciones comparativas de puntuación de confianza y una cultura de responsabilidad compartida en seguridad.

Más información
Logotipo de Insurance Australia Group con texto y un icono en azul y gris dentro del diseño de una ventana de navegador web.
Caso de estudio
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cómo un «Juego de Códigos» guía a IAG Group hacia un futuro de programación más seguro

IAG Group es la entidad detrás de muchas de las principales compañías de seguros en la región de Asia-Pacífico, que suscribe pólizas para millones de clientes por un valor aproximado de 11.400 millones de dólares australianos en primas anuales.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Mes de la Concienciación sobre Ciberseguridad 2026: Comprender la seguridad de la IA es fundamental para la defensa empresarial

Hemos llegado a un punto en el que la mayoría de las principales empresas de IA han pedido públicamente una ralentización global en el desarrollo de la IA para que las medidas de seguridad puedan ponerse al día, pero la verdad es que ya se han materializado graves problemas de seguridad. Esto deja a innumerables líderes de seguridad y equipos ejecutivos en una situación urgente, a medida que los costes monetarios y de riesgo de la implementación de la IA siguen acumulándose.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Habilitador 8: Branding de su programa

Un programa de codificación segura necesita algo más que un buen contenido para tener éxito. El Habilitador 8 muestra cómo el branding transforma la participación en una experiencia codiciada basada en el estatus.

Más información
Blog
Etiqueta de filtro
Este es un texto dentro de un bloque div.

Cada empleado está ahora en la primera línea de la ciberseguridad de la IA

El panorama tecnológico empresarial está cambiando a una velocidad que pocos previeron hasta que fue demasiado tarde. Hemos cruzado oficialmente el umbral del código escrito por humanos y la asistencia básica de copilotos hacia la era del Ciclo de Vida de Desarrollo Agéntico (ADLC). Si bien los agentes de IA autónomos prometen una eficiencia sin precedentes en múltiples funciones, también traen consigo una clase completamente nueva de riesgos regulatorios y de seguridad.

Más información

Proteja el desarrollo basado en IA antes de su lanzamiento

Identifique riesgos de desarrollo, aplique políticas y prevenga vulnerabilidades en todo el ciclo de vida de su software.

Reservar una demostración
No se encontraron elementos.