Está en la página 1de 38

Introducción y conceptos básicos

Apuntes de clase V1.0


2019

GFR – 2019 - CC BY-SA 2.0


Índice de Contenidos
1 Presentación ................................................................................................... 4
2 Introducción ................................................................................................... 5
3 ¿Qué es un sistema embebido?....................................................................... 6
4 Aplicaciones de un sistema embebido ........................................................... 8
Industria militar y aeroespacial ............................................................... 9
Automotriz ............................................................................................ 10
Tecnología médica ................................................................................ 10
Comunicaciones .................................................................................... 10
Electrodomésticos y electrónica de consumo ....................................... 10
Automatismos industriales y procesos de control ................................. 10
Logística................................................................................................ 11
Agricultura ............................................................................................ 11
Infraestructuras ..................................................................................... 12
Seguridad .............................................................................................. 12
5 Clasificación de sistemas embebidos ........................................................... 12
Computadora en una placa (SBC)......................................................... 12
CPU cards ............................................................................................. 13
PC104 modules ..................................................................................... 14
System on a module (SoM) .................................................................. 14
System on a chip (SoC) ........................................................................ 15
Field-programmable gate array (FPGA) ............................................... 15
6 Consideraciones de diseño de un sistema embebido .................................... 16
7 Desarrollo de un sistema embebido ............................................................. 19
Determinación de los requisitos del sistema ......................................... 20
8 Arquitectura de un sistema embebido .......................................................... 22
Núcleo del sistema ................................................................................ 22
8.1.1 Microprocesador................................................................................ 23
8.1.2 Microcontrolador ............................................................................... 25
8.1.3 El procesador de señales digitales (DSP) .......................................... 27
8.1.4 Field-programmable gate array (FPGA) ........................................... 27
Buses de comunicaciones (direcciones, datos y control) ...................... 28
8.2.1 Direcciones ........................................................................................ 29

2
Memoria ................................................................................................ 30
8.3.1 Sistema de memoria .......................................................................... 33
8.3.2 Registros ............................................................................................ 34
El stack o pila ........................................................................................ 36
8.4.1 El puntero de la pila (stack pointer) .................................................. 36
Conjunto de Instrucciones .................................................................... 36
8.5.1 Tipos de instrucciones ....................................................................... 37
8.5.2 Clasificación del conjunto de instrucciones ...................................... 38
9 Bibliografía................................................................................................... 38

3
1 Presentación

El presente documento es un borrador y no son más que unas anotaciones o “notas


de clase” que complementarán el curso de sistemas embebidos con microcontroladores.
El objetivo del mismo es que el alumno que participe de este curso tenga material
bibliográfico específico en el cual respaldar las clases teóricas. Lamentablemente, no
existe en la actualidad un único libro comercial que siga la dinámica y el contenido que
se le pretende dar a éste curso, por lo que se ha decidido redactar el presente documento.

Históricamente, la materia se dicta desde el año 2011 de forma discontinuada pero


siempre utilizando la plataforma de microcontroladores AVR de la empresa Atmel. Sin
embargo, este año hemos decidido modificar la materia cambiando por completo la
plataforma de desarrollo. En este curso utilizaremos un microcontrolador de 32bits (a
diferencia de los 8 del AVR) que posee una gran cantidad de periféricos y facilidades en
comparación con el anterior.
Este cambio ha provocado la reescritura de todos los apuntes y prácticas de
laboratorio debido a que las diferencias entre las dos plataformas son considerables. Sin
embargo, se ha optado por realizar una introducción genérica orientada a la compresión
general de los sistemas embebidos, sus alcances y limitaciones, que excede a la
plataforma elegida y cuyos conceptos son fácilmente aplicables a cualquier familia de
microcontroladores.
Se ha incluido en este mismo curso un capítulo de repaso de programación en C al
que llamamos C embebido. La particularidad del apunte de repaso es que está orientado
hacia las funciones del lenguaje más utilizadas en la plataforma de desarrollo de un
sistema embebido basado en microcontroladores. Esto significa que, a diferencia del
lenguaje C visto en materias como “introducción al cómputo” donde el objetivo es
aprender conceptualmente el funcionamiento del lenguaje, aquí haremos mayor énfasis
en determinados elementos que resultarán mucho más relevantes. Por ejemplo, el manejo
de bits de forma individual y las operaciones lógicas es un tema que generalmente pasa
desapercibido en cualquier curso de C orientado a la programación en computadoras
personales. De forma complementaria, la asignación dinámica de memoria es un tema
que en este curso no tendrá demasiada relevancia ya que, como se verá, el programador
será, en la mayoría de los casos, el responsable de mantener organizada dicha memoria.
Finalmente, queda aclarar que serán bien recibidos cualquier tipo de comentarios
sobre el presente apunte, ya que creemos que el proceso iterativo de
realimentación/corrección sobre el mismo ayudará sensiblemente a obtener un
documento que, en futuras versiones, será un material de referencia para los estudiantes
del instituto.

GFR

4
2 Introducción

La ley de Moore afirma que la densidad del transistor se ve doblada


aproximadamente cada dieciocho meses. Esto significa que la densidad de integración se
incrementa 1.000 veces cada quince años. Siguiendo la misma tendencia, la capacidad de
computación experimenta un "cambio de generación" aproximadamente cada quince
años.
La próxima generación se conoce con diferentes términos, como, por ejemplo, la
era de los procesadores embebidos (de propósito específico), la era post-PC, la era de la
información, la era wireless (inalámbrica), etc. Es evidente que una nueva generación de
dispositivos inteligentes, conectados, potentes y baratos se acerca. La internet de las cosas
(IoT, por sus siglas en inglés) es probablemente la nueva generación que estamos
experimentando.
Cabe destacar que, de los más de 9.000 millones de microprocesadores
manufacturados en el año 2005, menos del 2% acabaron siendo los cerebros de nuevos
PC, MAC o estaciones de trabajo UNIX. Los 8.800 millones restantes ingresaron
finalmente en aquello que denominamos sistemas embebidos. Básicamente, la esencia de
cualquier sistema electrónico moderno, desde un juguete hasta un sistema de control de
una central nuclear, pasando por los semáforos de nuestras ciudades, están constituidos
por sistemas embebidos. En consecuencia, el crecimiento esperable de los sistemas
embebidos, y en particular aquellos que se encuentran conectados a internet resulta
abrumador.

Los microcontroladores (μC) son, en términos generales, los cerebros de cada sistema
embebido y son los encargados de procesar la información, ejecutar tareas o generar un
flujo de información. Los microcontroladores de los dispositivos que hoy en día
encontramos en el mercado van desde un simple μC de 4 bits, como los que podríamos
encontrar en una postal navideña con sonido, hasta los complejos μC dedicados de 64
bits, con altas capacidades de proceso y gestión de gráficos, que encontramos en una Play
Station.

En cuanto a su funcionamiento, el abanico de opciones también es muy amplio. Así pues,


tenemos dispositivos que ejecutan códigos simples basados en el lenguaje de ensamblador
y que son ejecutados desde una memoria ROM y no disponen de sistema operativo, así
como sistemas basados en sistemas operativos en tiempo real (en inglés, real time
operating systems, RTOS), con capacidades de preempción y multitarea, ejecutando
programas en C o C++ e incluso versiones empotradas de Linux y Windows.

Su utilización es muy extensa y, si miramos a nuestro alrededor, podemos contar


fácilmente docenas de estos dispositivos, por ejemplo, la lavadora de casa, el teléfono
móvil, los reproductores de MP3, las cámaras digitales, etc.

Tanto es así que empiezan a sonar términos como IoT, smart planet, smart cities o stream
computing, en los que el centro de la información y de la computación ya no está en
nuestras computadoras, sino que de una manera ubicua está presente en las cosas, en los
objetos e, incluso, en las personas.

5
Para entender esta predicción, hemos de conocer exactamente qué entendemos por
sistema embebido o sistema de propósito específico. En este sentido, nos surgen las
primeras preguntas:

 ¿Qué es un sistema de propósito específico?


 ¿De qué se compone?
 ¿Qué aplicaciones tiene?

En este apunte encontrarán una aproximación en los sistemas embebidos para resolver
estas preguntas básicas y también otras consideraciones que irán surgiendo durante la
lectura.
Dedicaremos esta primera sección del apunte a introducir las ideas y los conceptos básicos
de los sistemas embebidos que analizaremos con detenimiento en las próximas secciones.
Antes de nada, conoceremos la definición de sistema embebido, alguna de sus tipologías
y los conceptos de familia de sistemas. Conoceremos los campos de aplicación de esta
tecnología y, finalmente, nos adentraremos en el proceso completo de diseño y desarrollo
de un sistema de estas características.

3 ¿Qué es un sistema embebido?

Un sistema embebido es un sistema informático de uso específico que está


encapsulado totalmente por el dispositivo que controla. Los sistemas embebidos
constituyen un sistema computacional fruto de la combinación de hardware y software.
Esta combinación tiene como misión llevar a cabo una funcionalidad o un conjunto de
funcionalidades determinadas. Se denominan embebidos o empotrados porque
normalmente forman parte de un sistema completo o con funcionalidades más generales.

Normalmente, un sistema embebido está basado en un microcontrolador (μC), que


controla una función o funciones específicas de un sistema. Sin embargo, el sistema no
está diseñado para ser programado por el usuario final, como podría suceder con una PC,
en el que ahora lo utilizamos como un procesador de textos y al cabo de un rato le
instalamos un juego. Es decir, un usuario final puede configurar el dispositivo embebido,
pero normalmente no puede modificar la funcionalidad para la que ha sido construido.

Figura 1: Diseño típico de un SSEE

6
Así pues, un sistema embebido está diseñado para llevar a cabo específicamente la
tarea para la que ha sido programado. La tarea puede no ser única y, por lo tanto, se
pueden incluir en ella varias opciones que el usuario puede seleccionar (como si se tratara
de los distintos programas de lavado en un lavarropas). Este rasgo es diferencial con
relación a las computadoras, o al menos lo era hasta hace muy poco. Actualmente, un
grupo minoritario de los dispositivos embebidos han experimentado una fuerte evolución
y ya casi ofrecen funcionalidades más cercanas a los PC que a los electrodomésticos.

Las técnicas de diseño de sistemas embebidos han posibilitado el desarrollo de


productos más pequeños, más rápidos, más robustos y, sobre todo, más baratos que se
están introduciendo en casi todos los dispositivos que rodean nuestra vida diaria. El
diseño VLSI (very large scale integrated circuits) ha permitido crear transistores
extremadamente pequeños que se pueden integrar por millones en pequeños circuitos
integrados. Gracias a esto, se han podido construir sistemas más complejos de una manera
modular.
El desarrollo de un sistema embebido está condicionado siempre por su robustez y
eficiencia, y con el condicionante de que ninguno de sus usuarios final es consciente de
su existencia. En la década de 1970 aparecieron los primeros microcontroladores de 8 bits
producidos por Motorola (M6800) e Intel (8080), junto a las primeras memorias
programables PROM (programable read only memory). Las aplicaciones basadas en los
primeros microcontroladores eran muy sencillas (microsoftware, firmware, como lo
conocemos ahora). Normalmente, hacían uso del lenguaje de ensamblador, que permitía
desarrollar aplicaciones de como máximo centenares de líneas de código con las que se
podía sustituir diseños de hardware muy complejos por sistemas programables mucho
más sencillos.
Hoy en día, se están desarrollando aplicaciones para sistemas embebidos de miles
de líneas de código, utilizando múltiples microcontroladores, componentes integrados
VLSI, diferentes niveles de memoria, convertidores analógico-digitales y otros muchos
componentes que permiten que los sistemas embebidos sean usados en casi todos los
dispositivos y máquinas que existen en la actualidad.
Los sistemas embebidos interactúan con una gran variedad de dispositivos
analógicos y digitales. El desarrollador de sistemas embebidos se debe enfrentar a la
interacción con dispositivos analógicos y digitales, tiene que comprender cómo funcionan
sensores y transductores y cómo sus señales son digitalizadas o viceversa. También, cada
día más, los sistemas embebidos utilizan conexiones de red, en muchos casos con
protocolos específicos condicionados por la naturaleza de estos dispositivos. De este
modo, la tarea de desarrollar un sistema embebido es heterogénea y requiere que el
desarrollador tenga un amplio abanico de habilidades y conocimientos.
En la Figura 2 se muestra un ejemplo de algunos de los sistemas embebidos que
podemos encontrar hoy en día dentro de un automóvil.

7
Figura 2 – Sistemas embebidos en un automóvil.

1) Sistema de crucero adaptativo 8) Pretensor reversible de cinturón de seguridad


2) Sistema electrónico de frenado (ABS) – MK60E 9) Unidad de control de asientos
3) Grupo de sensores 10) Frenos
4) Entrada de transmisión de datos 11) Sensor de prechoque óptico
5) Realimentación del pedal de acelerador 12) Sensor de choque lateral
6) Unidad de control de apertura de puertas 13) Sensor de choque delantero
7) Unidad de control de techo solar 14) Unidad de control de airbags

4 Aplicaciones de un sistema embebido

El desarrollo tecnológico de los últimos años en el ámbito de los sistemas


embebidos y de la microelectrónica en general ha facilitado el desarrollo de aplicaciones
existentes y también ha favorecido la aparición de nuevas. Los sistemas embebidos han
permitido el desarrollo de sistemas y aplicaciones:

 de bajo costo,
 en muchos casos descentralizadas,
 con bajos consumos energéticos,
 con más robustez y tolerancia a los fallos,
 con mejor apoyo a la operación con tiempo real,
 con potencial para ser conectadas en red,
 con control o acceso remoto,
 con más densidad de sensores o actuadores,
 con alto nivel de integración en otros sistemas u objetos y
 con tamaños más reducidos o con la posibilidad de ser usadas donde antes
no era posible.

Una gran parte de los sistemas embebidos se pueden considerar dispositivos


sensores que mediante interfaces son capaces de obtener datos. En esta categoría se
incluyen todos los dispositivos que utilizan sensores (sensores de temperatura, humedad,
sísmicos, acústicos, magnéticos, etc.) y también todo tipo de contadores y dispositivos de
medida mecánica (como tacómetros, amperímetros, contadores de pulsos, etc.). Por otro
lado, los sistemas actuadores son aquellos que gracias a estímulos recibidos llevan a cabo
acciones en su ámbito de actuación.
En los últimos años y gracias al auge de las comunicaciones inalámbricas, muchos
de los sistemas embebidos existentes han evolucionado para operar de una manera remota

8
sin la necesidad de conexiones cableadas. Esto ha permitido el desarrollo de nuevas
aplicaciones que hasta el momento no eran posibles. Sin embargo, han aparecido retos
nuevos, puesto que el hecho de poder comunicar un sistema embebido inalámbrico ha
permitido ubicarlos en lugares donde ni siquiera hay energía eléctrica. Por lo tanto, el
consumo y la eficiencia de los dispositivos ha devenido crucial.
Tanto es así que la mayoría de los esfuerzos en el desarrollo de la microelectrónica
y del software (sistemas operativos y bibliotecas) han ido dirigidos a la reducción de los
consumos energéticos de estos dispositivos. Esto se ha hecho patente en diferentes
vertientes:

1. Microelectrónica energéticamente eficiente. Gracias a la reducción del tamaño


de los chips y de los componentes electrónicos que integran un sistema embebido,
junto con técnicas que permiten apagar literalmente algunos componentes del
dispositivo cuando no son usados, se ha reducido de una manera notable el
consumo de estos dispositivos. También hay que destacar la aparición de sistemas
de captación de energía del entorno (energy harvesting), que han permitido la
prolongación de la vida operativa de los sistemas embebidos.

2. Sistemas operativos en tiempo real. Los avances en sistemas operativos en


tiempo real de propósito específico, incluyendo planificadores de tareas
prioritarias y multitarea y en muchos casos con conceptos de justicia (fairness, en
inglés), han permitido una optimización del tiempo de procesador. También han
aparecido técnicas que permiten detectar cuándo no hay más tareas por ejecutar
y, de una manera automática, poner el sistema en un modo dormido (sleep). Los
sistemas basados en eventos y asíncronos han favorecido la utilización de
interrupciones y han evitado también el uso innecesario de esperas.

3. Estándares de comunicación que optimizan el consumo energético. Las


comunicaciones inalámbricas son las que más han evolucionado. Han aparecido
estándares para la comunicación pensados para entornos con altas restricciones
energéticas en los que la pila de protocolos está pensada para minimizar este
aspecto. El 802.15.4 es la especificación hecha por el IEEE del protocolo para
redes de sensores y entornos industriales en el que se optimiza la eficiencia
energética de la capa física. Define tasas de transmisión, modulaciones y
estructura de los paquetes. Han aparecido diferentes implementaciones de la capa
MAC que, entre otras funciones, permiten un acceso aleatorio CSMA/CA en redes
con poco tránsito, o acceso múltiple TDMA/FDMA para redes con tránsito
constante, basándose en protocolos complejos de sincronización y de
encaminamiento de la información. Gracias a estos avances, encontramos
aplicaciones de los sistemas embebidos en casi todos los sectores. A continuación,
detallamos los más representativos.
Industria militar y aeroespacial
Encontramos los sistemas de propósito específico en sistemas de control, ubicación
y monitorización en rescates u operación en desastres naturales, también en sistemas de
control de proyectiles y armamento o control de dispositivos voladores no tripulados,
entre otros. Una parte significativa del costo de los aviones proviene de los equipos de

9
procesamiento de información, incluyendo sistemas de control de vuelo, sistemas para
evitar colisiones o sistemas de información para los pilotos. En muchos casos, la
operación en tiempo real, la robustez y los mecanismos de posicionamiento y
comunicación inalámbricos son clave para este tipo de dispositivos.
Automotriz
La mayoría de los países han establecido leyes que obligan a los fabricantes de
vehículos a que incluyan ciertos sistemas de seguridad, como son los sistemas de airbags
controlados por sistemas de control embebidos al vehículo, sistemas de control del motor,
controles del sistema de freno (ABS) o sistemas de estabilidad (ESP), entre otros. Otros
componentes de los vehículos son también sistemas embebidos, los GPS, los sistemas de
alarma, los controles de climatización, etc.
Tecnología médica
Gracias a sus características y tamaños, los sistemas embebidos son usados en el
ámbito de la medicina e integran todo tipo de equipamiento para la monitorización y el
control en tiempo real. Incluso en muchos casos, los sistemas son adheridos a los
pacientes para ser observados de una manera permanente, sobre todo en el caso de gente
mayor. Hay algunas experiencias de múltiples sistemas sensores adheridos al cuerpo del
paciente y que se comunican entre ellos para encaminar la información hacia el centro
receptor y formar una red de comunicaciones personal llamada red de área personal
(PAN, personal área network).
Comunicaciones
La mayoría de los dispositivos que conforman las redes de comunicaciones están
constituidos por un microcontrolador, su memoria y una interfaz de comunicación. Así
pues, los encaminadores (routers) o los conmutadores (switch), entre otros, no dejan de
ser sistemas de propósito específico. El auge de las comunicaciones ha provocado que
cada vez aparezcan más dispositivos multi-interfaz que permiten la comunicación
utilizando diferentes tecnologías. En este apartado no podemos olvidar los teléfonos
móviles, que son la tecnología que ha experimentado un crecimiento más destacado en
los últimos años. En este ámbito, son especialmente importantes las comunicaciones de
radiofrecuencia y los diseños de sistemas energéticamente eficientes.
Electrodomésticos y electrónica de consumo
Desde los teléfonos móviles hasta los reproductores de música, pasando por las
cocinas de inducción, los aires acondicionados y las calefacciones, encontramos uno o
varios sistemas de propósito específico que rigen el funcionamiento de estos dispositivos.
Tanto es así que muchos de los electrodomésticos que tenemos en casa ya incluyen
interfaces o puertos estándar de expansión que permiten extender las funcionalidades de
los aparatos como, por ejemplo, añadiendo un control remoto. En este contexto, no hay
que olvidar los sistemas de entretenimiento y videojuegos, extendidos cada vez más con
dispositivos de hardware que aumentan su interactividad mediante sensores y actuadores.
Automatismos industriales y procesos de control
Los sistemas SCADA (Supervisory control and data acquisition, en inglés.) y
autómatas de control son implementados cada vez más con sistemas de propósito
específico. A pesar de que la industria tiene una gran inercia a la hora de integrar nuevas

10
tecnologías, los sistemas embebidos con comunicaciones inalámbricas abaratan
extremamente los costos de instalación, y los hace muy interesantes y rápidamente
amortizables. Hace unos años, los sistemas de control solían estar centralizados en una
computadora central y gestionados por un software SCADA. Estos ordenadores eran un
punto crítico para la operación de la industria, puesto que en caso de fallo se paraban
muchos procesos. El abaratamiento de los sistemas embebidos, junto con las
comunicaciones inalámbricas, ha permitido llevar un control descentralizado, puesto que
los propios sistemas sensores son capaces de procesar los datos y enviarlos a sistemas
web en los que la replicación y la tolerancia a fallos es mucho más sencilla.

Figura 3 – Ejemplo de sistema SACADA.


HMI: Human-Machine Interface
MTU: Master terminal unit
RTU: Remote Terminal Unit
DAS: Data Acquisition System

Logística
En muchas aplicaciones de logística se equipan las materias primas con
identificadores de radiofrecuencia (tags), o RFID, que permiten hacer el seguimiento de
los productos. Tanto el control como la lectura de estos identificadores se lleva a cabo
mediante sistemas de control basados en sistemas de propósito específico.
Agricultura
La aparición de múltiples sistemas de irrigación, fertilización del suelo y control
del crecimiento de vegetales y plantas empieza a introducir un cambio en los modelos de
agricultura tradicionales. A pesar de los costes de introducir la tecnología en el campo,
algunos estudios demuestran grandes aumentos de la productividad, lo que hace muy
interesante esta tecnología para el sector. Por ejemplo, se han empezado a aplicar
controles exhaustivos en la viticultura y la huerta de regadío dada la relevancia de las
mejoras que los dispositivos embebidos pueden aportar a la producción agrícola en estos
sectores y el incremento evidente del volumen de negocio que ello significa.

11
Infraestructuras
Gracias a las capacidades de comunicación inalámbrica, los bajos consumos
energéticos y las reducidas dimensiones, los sistemas embebidos pueden ser usados como
sistemas de medición en lugares casi inaccesibles en todo tipo de infraestructuras. Esto
permite controlar la salud de edificios, puentes, presas, etc. La evolución de estos sistemas
ha dado pie a la aparición de términos como smart cities o smart infraestructures, que
denominan ciudades llenas de sistemas de medición inalámbricos puestos al servicio del
control de las grandes infraestructuras o ciudades. Incluyen sistemas de control de tráfico
y de polución, sistemas de control acústico o de luminosidad a gran escala, por mencionar
algunos.
Seguridad
En los últimos años, los sistemas de seguridad han ido incorporando todo tipo de
sistemas de propósito específico, desde sistemas de captura y procesamiento de imágenes
hasta sistemas sensores y actuadores, pasando por sistemas de autenticación de personas,
por ejemplo, mediante la huella dactilar o el escáner de retina.

5 Clasificación de sistemas embebidos

Los sistemas embebidos se pueden clasificar de muchas maneras, por ejemplo,


según la funcionalidad, según el tamaño, según los componentes, etc. A continuación, se
muestra una clasificación que los discrimina en función de su nivel de integración. Dado
el elevado número de sistemas existentes, se han elegido algunos de los más
representativos. Posteriormente, analizaremos otras clasificaciones según su arquitectura
y las diferentes tecnologías empleadas.
Computadora en una placa (SBC)
Las computadoras en una placa o SBC (single board computers) son computadoras
completas en un solo circuito. El diseño se centra en un microprocesador con la memoria,
la E/S y todas las otras características de una computadora funcional en una sola tarjeta
que suele ser de tamaño reducido y que tiene todo lo que necesita en la placa madre.
Esta arquitectura no se usa tanto en los computadores personales, sino en entornos
industriales o en sistemas embebidos dentro de otros que ofrecen funcionalidades de
control o de interfaz.
Debido a los grandes niveles de integración y reducción de componentes y
conectores, las computadoras en una placa suelen ser más pequeñas, ligeras, más robustas
y suelen tener una mejor gestión de la potencia eléctrica que las computadoras de
múltiples tarjetas. En la Figura 4 se observa un ejemplo de una computadora en una sola
placa de la marca ASUS. La mundialmente conocida Raspberry PI es otro ejemplo de
SBC.

12
Figura 4 – SBC Asus Tinker Board S. (Cuadcore 1.8GHz y 2 Gb DDR3 RAM )
CPU cards
Una CPU card es un circuito impreso que contiene un procesador (CPU, unidad
central de procesamiento) de una computadora. Las CPU cards se especifican por la
frecuencia de reloj, por el tipo de bus y por otras características específicas de la
funcionalidad que ofrecen. Las CPU cards son todos aquellos circuitos integrados que
implementan arquitecture peripheral component interconnect (PCI), tarjetas de PC
modulares, tarjetas industry standard card (ISC), tarjetas PCI extensions for
instrumentation (PXI), tarjetas embedded technology extended (ETX) y otras muchas.
Normalmente, se utilizan para expandir memoria, velocidad, ancho de banda o
aplicaciones embebidas de sistemas computacionales existentes. Entre otros, hay que
destacar módulos para aplicaciones de audio y de vídeo, comunicación de datos y
almacenamiento embebido. En la Figura 5 se muestra un ejemplo de una CPU card con
un soket LGA1151 preparada para colocar un procesador Intel I3, I5 o I7.

Figura 5 – IB990 PICMG 1.3 full-size CPU card.

Las tarjetas PXI se usan para la adquisición y para sistemas de control, y resultan
muy adecuadas para aplicaciones de medida en tiempo real (concepto que veremos más
adelante). Las tarjetas ETX se usan en entornos industriales para aumentar de una manera
embebida las propiedades de un sistema. Las CPU cards están pensadas para ser
conectadas a la placa base de una computadora, por medio de los puertos ISA o PCI, e
incluyen todas las funcionalidades, tanto la específica como la de comunicación, con la
placa base u otras tarjetas de la computadora. Normalmente, son conocidas como tarjetas
de expansión e incluyen, entre otras, funcionalidades de módem, tarjetas de red, tarjetas
de vídeo y aceleradores gráficos o controladores de disco RAID.

13
PC104 modules
PC/104 está definido como un estándar administrado por el PC/104 Consortium y
que define un factor de forma y un bus de comunicación. El estándar PC/104 fue
concebido para aplicaciones de adquisición de datos en entornos con condiciones que
pueden ser extremas (temperatura, humedad, exteriores, etc.). El factor de forma PC/104
no utiliza una placa base en la que se insertan las placas de expansión, sino que los
módulos pueden ser apilados y anclados unos a otros haciendo que la estructura sea
mucho más robusta. La comunicación entre módulos apilados se lleva a cabo mediante
un bus que conecta todos los niveles.

a b
Figura 6 – a) Modulo PC/104 SER25330 (Octal-Serial Port) y b) la conexión de la
placa con otros módulos.
System on a module (SoM)
System on a module (SoM) es una computadora en una sola placa, embebida, que
se puede considerar la extensión del concepto system on a chip. El SoM se podría
describir como una computadora completa construida en una única placa. El diseño se
centra en un único microprocesador con memoria RAM, controladores de entrada/salida,
alimentación y otros componentes necesarios para convertirlo en una computadora
completa, pero en una sola placa. A diferencia de un SBC, los SoM no tienen conectores
para añadir periféricos directamente a la placa, sino que cualquier periférico tiene que ser
enchufado mediante un bus conectado a un puerto del SoM. Las principales ventajas que
tiene son el bajo consumo energético y la robustez, gracias al alto nivel de integración.

a b
Figura 7 – a) NET ARM G120 System on Module (SoM) y b) su integración en otro
Sistema de mayores dimensiones.

14
System on a chip (SoC)
System on a chip (SoC) es un concepto que hace referencia a la integración de todos
los componentes de una computadora o de otro aparato electrónico en un único circuito
integrado (chip). Normalmente, aglutina funciones digitales, analógicas y
comunicaciones vía radiofrecuencia en un único sustrato. A diferencia de las limitaciones
de memoria y capacidad de cálculo de un microcontrolador, los SoC suelen incluir uno o
varios procesadores que les dan mucha más capacidad de cómputo e integran varias
memorias externas, lo cual incrementa su capacidad. Sin embargo, la integración hoy
todavía tiene límites y el término system on a chip engloba también los sistemas que están
formados por más de un chip, pero que van empaquetados en un mismo encapsulado, lo
que favorece su integración, pero sin llegar a los extremos de utilizar un mismo sustrato.

a b
Figura 8 – a) Esquema de componentes integrados en un SoC y b) el resultado de un
SoC ARM convertido en un SoM para ser utilizado con propósitos generales.
Field-programmable gate array (FPGA)
A pesar de que su nivel de integración es muy variable, queremos introducir el
concepto de field-programmable gate array (FPGA) – en español matriz de puertas
programables in situ–, puesto que un gran número de dispositivos embebidos utilizan
sistemas FPGA como componentes de su arquitectura.
Una FPGA es un circuito integrado que puede ser reprogramado mediante un
lenguaje de programación específico, normalmente algún lenguaje de descripción de
hardware como VHDL. Las FPGA pueden ser usadas para implementar cualquier
operación que un circuito integrado puede llevar a cabo con la diferencia de que, al ser
reprogramables, son mucho más versátiles y pueden ser reusadas en otros contextos. Las
FPGA están constituidas por bloques lógicos y una jerarquía de interconexiones
reconfigurable que permite unir los bloques lógicos. Los bloques lógicos se pueden
configurar para llevar a cabo operaciones complejas o simples operaciones lógicas. Los
bloques lógicos son acompañados por elementos de memoria.
Además de funciones digitales, algunas FPGA también tienen funciones analógicas,
entre otras, la de control del slew rate (o velocidad de cambio de voltaje de salida en
función de las variaciones del voltaje de entrada).

15
a b
Figura 9 – a) Esquema de bloques lógicos de una FPGA con sus entradas y salidas y
b) una implementación compatible con Arduino (XLR8)

6 Consideraciones de diseño de un sistema embebido

El proceso de diseño de un sistema embebido se basa en la creación de un modelo


del dispositivo en cuestión. Normalmente, el proceso de diseño requiere una metodología
específica que debe tener en cuenta los requisitos siguientes:

 Jerarquía.
Los seres humanos generalmente no son capaces de comprender sistemas muy
complejos formados por muchos objetos fuertemente interrelacionados. De este modo,
hacer uso de jerarquías permite concebir los sistemas de una manera estructurada y
permite focalizar el diseño en cada una de las partes. Podemos considerar dos tipos de
jerarquías:

 Jerarquías de comportamiento: Contienen los objetos necesarios para describir


el comportamiento del sistema: estados, eventos, señales de entrada y de salida,
etc.

 Jerarquías estructurales: Describen la composición física del sistema. Por


ejemplo, procesadores, memorias, actuadores y sensores. A su vez, los
procesadores incluyen registros, multiplexores, sumadores, etc. Los multiplexores
están constituidos, a su vez, por puertas lógicas.

 Diseño orientado a componentes.


El sistema debe poder ser especificado usando componentes con funcionalidades
definidas. Tiene que ser sencillo derivar el comportamiento de un sistema del
comportamiento de sus componentes. Si dos componentes están interconectados, el
comportamiento de ambos ha de ser predecible.

 Concurrencia.
Dado que el sistema es una composición de componentes, hemos de esperar que
estos trabajen de una manera simultánea y, por lo tanto, dar pie a situaciones de

16
concurrencia. Para el diseñador es difícil prever las situaciones de concurrencia y por ello
es un aspecto crítico que hay que tener en cuenta en la fase de diseño. Cabe señalar que,
en muchos casos, los posibles fallos se deben a un conocimiento incompleto de las
situaciones de concurrencia.

 Sincronización y comunicación.
Los componentes se deben poder comunicar y sincronizar. Se han de poder
expresar prioridades y ponerse de acuerdo en el uso de recursos (exclusión mutua).

 Comportamiento temporal.
Muchos de los sistemas embebidos son sistemas en tiempo real. Así, los requisitos
de tiempos son críticos y tienen que ser especificados durante la fase de diseño del
sistema. Es crucial en el diseño de algunos algoritmos que se ejecutarán en un sistema
embebido demostrar que el algoritmo finaliza de manera determinista en un tiempo
determinado. Generalmente, se emplean técnicas para lo siguiente:

 Medir el tiempo empleado. Para muchas aplicaciones es necesario medir el


tiempo que ha pasado desde un cierto instante hasta que se ha acabado la
ejecución.

 Retardar procesos durante un período. Típicamente los lenguajes de


programación para sistemas en tiempo real ofrecen métodos para introducir
retardos. Sin embargo, en muchos casos estos métodos no son muy precisos,
puesto que utilizan el planificador de tareas del sistema operativo, que introduce
ciertos retardos debido a los cambios de contexto.

 Posibilidad de especificar temporizaciones (timeouts). En muchas situaciones


lo que se quiere es esperar un cierto acontecimiento. Puede suceder, sin embargo,
que este acontecimiento no suceda en un período de tiempo finito y, por lo tanto,
queramos que esto se nos notifique para evitar que el sistema espere eternamente.
Un caso común lo podríamos encontrar cuando se espera un paquete de respuesta
a través de la red y queremos ser notificados si este no se ha recibido en un período
de tiempo determinado. Los lenguajes de programación en tiempo real suelen
ofrecer este tipo de funcionalidades.

 Métodos para especificar retardos y planificaciones.


Para ciertas aplicaciones, hay que completar ciertos cálculos en un período de
tiempo concreto. Desafortunadamente, la mayoría de los lenguajes de programación no
permiten imponer restricciones de tiempos; a la vez, el hardware presenta cada vez más
un comportamiento más impredecible (temporalmente hablando), debido al uso de
memorias caché, pipelines de ejecución, ejecución especulativa, priorización de tareas,
interrupciones, etc., lo cual hace muy difícil que se pierda el tiempo de ejecución de un
algoritmo.
Un ejemplo muy común es el caso del Airbag en un automóvil. Si el conjunto de
sensores de aceleración de un coche detecta una fuerte desaceleración, el airbag se debe

17
poner en marcha con un tiempo no superior a 10 ms; en este contexto, el sistema tiene
que garantizar que se tomará la decisión de activar o no el airbag en este tiempo.

 Comportamiento definido por estados.


Es muy útil utilizar máquinas de estado autómatas para definir el comportamiento
del sistema. Sin embargo, la temporización no se puede modelar en una máquina de
estados ni tampoco se pueden modelar jerarquías complejas.

 Gestión de eventos.
Fruto de la naturaleza reactiva de los sistemas embebido, se requieren mecanismos
para describir eventos. Los eventos pueden ser externos (causados por el entorno) o
internos (causados por el comportamiento del propio sistema).

 Comportamiento definido por excepciones.


En la mayoría de los sistemas hay excepciones. Para que nuestros sistemas sean
robustos, se tienen que poder definir acciones que gestionen las excepciones de una
manera sencilla.

 Soporte al diseño de sistemas grandes.


En ocasiones, se deben desarrollar sistemas grandes y complejos con funciones muy
específicas. Se tienen que usar metodologías para llevar a cabo estos diseños, entre otras,
la orientación a objetos o a componentes son capitales. Se deben reaprovechar las técnicas
y las metodologías existentes para minimizar los esfuerzos en este sentido.

 Legibilidad.
El diseño se ha de especificar en un documento que tiene que ser legible. La
documentación es tan importante o más que el propio diseño. Se deben desarrollar
documentos que puedan ser leídos por humanos y también especificaciones que puedan
ser fácilmente transformadas en programas.

 Portabilidad y flexibilidad.
Las especificaciones han de ser independientes del hardware específico para que
puedan ser utilizadas de una manera sencilla en otras plataformas o componentes.
Idealmente, se debería poder cambiar la plataforma de hardware sin que esto afectara a la
especificación, aunque, en la práctica, siempre son necesarios algunos cambios.

 Finalización.
Tiene que ser posible identificar el ciclo de vida de la aplicación a partir de su
especificación. Se deben poder determinar sus estados de finalización.

 Soporte para dispositivo de E/S no estándar.


Muchos sistemas de propósito específico emplean dispositivos de E/S no estándar.
Se tienen que describir las entradas y salidas de una manera conveniente.

18
 Propiedades no funcionales.

Se deben tener en cuenta también otras propiedades no funcionales, como la


tolerancia a fallos, el tamaño, la extensibilidad, la esperanza de vida del sistema, el
consumo, el peso, la usabilidad, el aspecto, la compatibilidad electromagnética, etc. Se
tienen que definir estas propiedades formalmente.

7 Desarrollo de un sistema embebido

La concepción del sistema en su totalidad es parte de una idea de una persona, o de


un equipo de diseño o de un encargo a medida hecho para un "cliente" que quiere resolver
un problema determinado.
Podemos establecer una serie de tareas previas que culminarán en la elaboración de
un anteproyecto, sobre la base del cual se tomarán las decisiones de seguir adelante o
descartar el proceso:

1. Determinación de los requisitos globales del sistema.


2. Selección del microprocesador, microcontrolador o DSP más adecuados.
3. Selección de la tecnología de fabricación más adecuada.
4. Elección de la memoria y del sistema operativo, si procede.
5. Determinación de las entradas/salidas, comunicaciones, etc.
6. Determinación de las necesidades de homologación en función de la aplicación.
7. Selección del equipo humano más oportuno para su desarrollo, selección de
proveedores hardware y software, etc.
8. Elaboración de un anteproyecto, cuanto más detallado mejor, que nos permita
evaluar la viabilidad técnica y económica del sistema, y también generar un
presupuesto de costos tan veraz como sea posible.

Figura 10 – Diagrama de fases para el diseño de un sistema embebido.

19
En ésta figura se muestra un diagrama simplificado con las fases que hay que seguir y
que comentamos a continuación:

a) Diseño inicial del sistema, que incluye toda una serie de tareas que acabarán en la
elaboración de un esquema eléctrico del sistema y en un diseño de necesidades de
software.
b) A partir del esquema y de la forma física de cada uno de los componentes que
intervienen en él, diseño hardware del sistema. Esta tarea incluye el
posicionamiento de cada uno de los componentes y el encaminamiento de las
pistas conductoras que llevarán a cabo las interconexiones necesarias entre los
pivotes de los componentes, lo que generará un prototipo de placa de circuito
impreso (PCB). A partir de esta PCB, una vez producida, se lleva a cabo el
montaje o el ensamblaje de todos y cada uno de los dispositivos mediante el
procedimiento de soldadura más adecuado. Este proceso acaba en un prototipo de
hardware.
c) Desarrollo del prototipo de software con la programación inicial del
microcontrolador o de los microcontroladores que formen parte del sistema
embebido.
d) Integración del hardware/software mediante el vertido o la programación en el
circuito de los microcontroladores. Así, se dispondrá del primer prototipo
preparado para proceder a su prueba y depuración.
e) Pruebas y depuración del software y hardware mediante el uso de prototipos hasta
llegar a la versión final. Si se detectan errores en el hardware, será necesario
rediseñar la placa y volver a empezar el proceso. Si los errores son de software, el
proceso es similar, salvo que es menos costoso en cuanto a materiales que en
cuanto a horas de ingeniería.
f) Obtención del producto final. Después del resultado satisfactorio en todas las
pruebas se conseguirá el producto final. En el caso de previsiones de fabricación
masiva, habrá que fabricar pre-series y probarlas para minimizar, así, los
imprevistos de cara a la fabricación en serie de altas cantidades.

Desde el punto de vista del curso de sistemas embebidos, dejaremos de lado los detalles
sobre el proceso de fabricación, los costos y las consideraciones comerciales que
cualquier sistema embebido, pensado para convertirse en un producto comercial debiera
tener. Sin embargo, haremos hincapié en la determinación de los requerimientos del
sistema (tanto de software como hardware) en función de la aplicación a la cual estará
destinado.
Determinación de los requisitos del sistema
Una de las partes más importantes del desarrollo de un sistema embebido es la
definición de los requisitos técnicos y funcionales para poder cumplir las especificaciones
de la aplicación que se quiere hacer. Cuanto más cuidadosamente se lleve a cabo esta fase
previa a la creación de un prototipo, menos probables serán los cambios no deseados tanto
en el hardware como en el software. Aun así, hay que recordar que el desarrollo del
sistema generalmente es un proceso iterativo. Al recorrer los últimos pasos del proyecto,

20
puede surgir la necesidad de revisar las primeras fases para conseguir un producto más
fiable, más consistente y que cumpla todos los requisitos especificados previamente.
Habrá que tener en cuenta una serie de consideraciones técnicas, como por ejemplo
las siguientes:

 Definición de las interfaces de control


 Los tipos de dispositivos que habrá que controlar o con los cuales se tendrá
que comunicar, y también las propiedades eléctricas y mecánicas de sus
interfaces.
 Una definición general de los requisitos de tipos de memoria (volátil, no
volátil, estado sólido, magnética, etc.).
 La definición de cómo el sistema interactuará con las personas (monitor,
teclado y lector de códigos de barras, entre otros).
 Definición de la aplicación de software
 Descripción específica de todas las características de la aplicación de
software.
 Características de depuración.
 Posibilidad de actualización del software.
 Previsión de controladores (drivers) para el funcionamiento del hardware
externo.
 Requisitos de alimentación
 Posibilidad de alimentación mediante batería o pilas.
 Alimentación de seguridad para condiciones de caída de la alimentación
principal.
 Previsiones generales de consumo del sistema.
 Requisitos térmicos del sistema
 Margen de temperatura nominal.
 Refrigeración por ventilador o por convección.
 Ubicación de los componentes para una gestión térmica efectiva.
 Condiciones ambientales externas para determinar las necesidades de control
térmico.
 Tiempo de vida esperado del sistema frente a las necesidades de control
térmico.
 Diseño de la forma y del tamaño
 Restricciones en cuanto a dimensiones.
 Robustez del producto.
 Necesidades de rendimiento
 Necesidades de velocidad de procesamiento.
 Capacidad de manejar interfaces gráficas.
 Capacidad de ejecutar software exterior.
 Capacidad de comunicarse con otras interfaces de alta velocidad.
 Definición de los subsistemas principales
 Los subsistemas principales con suficiente complejidad deben tener una
definición similar a la del sistema completo para evitar problemas o costes de
integración elevados.

21
8 Arquitectura de un sistema embebido

La arquitectura básica de un sistema embebido no difiere demasiado de la


arquitectura de cualquier computadora, en el que figuran cuatro elementos básicos:

 el núcleo o procesador (CPU)


 la memoria principal
 la entrada del sistema
 la salida del sistema

tal como se aprecia en la Figura 11:

Buses

Figura 11 – Arquitectura de un sistema embebido.

En el momento de ejecución, la CPU recoge de la memoria las instrucciones que


tiene que llevar a cabo (el programa) y, junto con otros datos, que pueden ser obtenidos
tanto de la misma memoria del sistema como de sus entradas, ejecuta las tareas indicadas
y devuelve el resultado a la memoria o a la interfaz de salida.

La CPU es, entonces, la parte principal del sistema y todo el diseño y


funcionamiento del sistema embebido gira en torno a esta parte.

La CPU es la parte de un sistema que secuencia y ejecuta instrucciones usando


aritmética básica, lógica, control y operaciones de entrada y salida. El CPU es la parte
encargada de los procesos, por lo que también se le conoce como procesador.
Núcleo del sistema
Hay cuatro opciones principales a la hora de clasificar la CPU que utiliza un sistema
embebido, cada una de las cuales impone variaciones en la arquitectura del sistema, y que
son:
 Microprocesador
 Microcontrolador
 Procesador de señales digitales (DSP, Digital Signal Processor)
 FPGA
A continuación, describiremos en detalle cada una de las posibles opciones.

22
8.1.1 Microprocesador
El microprocesador es un dispositivo que integra en un solo chip las partes
indispensables de la CPU, es decir, los registros internos, la unidad aritmético-lógica
(ALU, arithmetical and logical unit) y la unidad de control. Esta última se encarga de
gestionar la ejecución del programa, es decir, tomar las instrucciones de la memoria,
interpretarlas, recoger los datos necesarios para llevarlas a cabo, ejecutarlos, entregar los
resultados y pasar a la instrucción siguiente. La ALU, tal como su nombre indica, se ocupa
exclusivamente de hacer los cálculos aritméticos y resolver las relaciones lógicas.
Finalmente, los registros internos son memorias de alta velocidad y tamaño reducido en
las que se guardan, de una manera temporal, los datos que se utilizan habitualmente
durante la ejecución, ya sea porque es necesario o con el objetivo de favorecer la
velocidad del sistema.
Un microprocesador puede contener una o más unidades centrales de
procesamiento (CPU), sin embargo, hay que tener presente que la memoria, los puertos y
todos los demás periféricos son exteriores. La programación de un microprocesador es,
por lo tanto, una tarea compleja porque deben controlarse todos estos dispositivos
externos.

Figura 12 – Microprocesador Intel Core I7 de 4/8 Núcleos.

Cuando un sistema embebido está basado en un microprocesador, su arquitectura


típica es la de la Figura 13, en la que se aprecian varios elementos externos: la memoria,
que habitualmente se divide en memoria de datos y de programa, los dispositivos de
entrada/salida y el reloj del sistema. La memoria de datos suele ser memoria RAM,
mientras que el software suele estar constituido por memoria ROM y es donde se guarda
el conjunto de instrucciones que tiene que ejecutar el sistema. En general, la arquitectura
del sistema será de tipo Von Neumann o Harvard, en función de si se permite el acceso
simultáneo a las dos memorias o no. Por lo tanto, en una arquitectura Harvard serán
necesarios dos buses de información separados. Veamos cuales son las características
generales de estas arquitecturas.

Figura 13 – Arquitectura de un sistema embebido basado en un microprocesador

23
8.1.1.1 Arquitecturas de microprocesadores
Como se mencionó anteriormente, cuando de arquitectura funcional de una CPU
hablamos, existen fundamentalmente dos tipos que son las más utilizadas:

 La arquitectura Von Neumann es una familia de arquitecturas de procesadores que


utilizan el mismo dispositivo de almacenamiento tanto para las instrucciones como
para los datos. Es decir, que se dispone de una sola memoria principal donde se
almacenan datos e instrucciones de forma indistinta accediendo a ella a través de un
sistema de buses único (direcciones, datos y control).

Figura 14 – Esquema de la arquitectura Von-Neumann

En un sistema con arquitectura Von Neumann el tamaño de la unidad de datos o


instrucciones está fijado por el ancho del bus o canal que comunica la memoria con la
CPU. Así un microprocesador de 8 bits con un bus de 8 bits, tendrá que manejar datos e
instrucciones de una o más unidades de 8 bits (bytes) de longitud. Si tiene que acceder a
una instrucción o dato de más de un byte de longitud, tendrá que realizar más de un acceso
a la memoria. El tener un único bus hace que el microprocesador sea más lento en su
respuesta, ya que no puede buscar en memoria una nueva instrucción mientras no
finalicen las transferencias de datos de la instrucción anterior.
Las principales limitaciones que nos encontramos con la arquitectura Von
Neumann son:
 La longitud de las instrucciones por el bus de datos, que hace que el
microprocesador tenga que realizar varios accesos a memoria para buscar
instrucciones complejas.
 La velocidad de operación a causa del bus único para datos e instrucciones
que no deja acceder simultáneamente a unos y otras, lo cual impide superponer
ambos tiempos de acceso.
Los CPU de las PC de escritorio son un ejemplo de la arquitectura Von-Neumann.
(Específicamente son una versión de Harvard modificada puesto que hacen uso de la
memoria cache para separar las instrucciones y los datos).

 El término Arquitectura Harvard originalmente se refería a las arquitecturas de


computadoras que utilizaban dispositivos de almacenamiento físicamente separados
para las instrucciones y para los datos. El término proviene de la computadora
Harvard Mark I, que almacenaba las instrucciones en cintas perforadas y los datos en
interruptores. Las características de esta arquitectura se detallan a continuación:
 La memoria de programa y la memoria de datos constituyen dos espacios de
almacenamiento separados.

24
 El acceso a cada espacio de memoria es a través de dos buses de direcciones
distintos: uno que accede a los datos y otro a las instrucciones con distintas
velocidades.

Figura 15 – Esquema de la arquitectura Harvard


Ventajas de esta arquitectura:
 El tamaño de las instrucciones no está relacionado con el de los datos, y por lo
tanto puede ser optimizado para que cualquier instrucción ocupe una sola posición
de memoria de programa, logrando así mayor velocidad y menor longitud de
programa.
 El tiempo de acceso a las instrucciones puede superponerse con el de los datos,
logrando una mayor velocidad en cada operación.

8.1.2 Microcontrolador
Un microcontrolador (abreviado μC, UC o MCU) es un circuito integrado
programable, capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de
varios bloques funcionales, los cuales cumplen una tarea específica. Un microcontrolador
incluye en su interior las tres principales unidades funcionales de una computadora:
unidad central de procesamiento (CPU), memoria y periféricos de entrada/salida lo que
lo convierte en un SoC según la definición establecida anteriormente. Adicionalmente,
los uC pueden incluir reloj propio, dispositivos de entrada, convertidores de analógico/
digital y viceversa, puertos de comunicación, etc. En el ámbito de los sistemas embebidos,
los microcontroladores son especialmente útiles cuando queremos obtener sistemas de
bajo coste, especialmente si se han de producir a gran escala. En este caso, la arquitectura
del sistema es la que aparece en la Figura 16b.

a b
Figura 16 – a) Microcontrolador ARM de la empresa STM b) Esquema interno del
CPU y los periféricos que componen el microcontrolador.

25
8.1.2.1 Familia, fabricante y licencias.
Una familia engloba todos los componentes que están diseñados bajo un mismo
patrón y que comparten un conjunto de propiedades. Encontramos las familias de
microprocesadores o de microcontroladores que comparten, entre otras, una arquitectura,
un formato de instrucción, una medida de registros, etc.
En el contexto de un sistema embebido, podemos encontrar componentes que se
engloban dentro del ámbito de una familia y que, por lo tanto, comparten propiedades. En
el ámbito de los sistemas embebidos hay un conjunto de familias de microprocesadores o
de microcontroladores que han ido evolucionando a medida que se extendía su uso. Las
más representativas son:

 La arquitectura ARM de la empresa ARM.


 La arquitectura AVR de Atmel.
 La arquitectura PICO de Microchip.
 La arquitectura MSP430 de Texas Instruments.
 La arquitectura 8051 de Intel.
 La arquitectura Z80 de Zilog.
 La arquitectura 65816 de Western Design Center.
 La arquitectura SuperH de Hitachi.
 La arquitectura ETRAX CRIS de Axis Communications.
 La arquitectura Power Architecture (propiamente dicha PowerPC).
 La arquitectura eSi-RISC de EnSilica's.

En particular, una familia de microcontroladores está constituida por múltiples variantes


que siguen las especificaciones básicas de la familia, como son el formato de las
instrucciones o la arquitectura del procesador. Una familia no deja de ser una
especificación y un diseño de un núcleo y un conjunto de funcionalidades que forma lo
que se denomina microcontroller unit (MCU) o core.

Figura 17 – Chip Cortex-M3. Aquí vemos la parte desarrollada por ARM y la parte
desarrollada por los diferentes integradores.

La especificación de una familia puede ser implementada por varios fabricantes o


integradores; así, la especificación del procesador Cortex-M3 de ARM la desarrollan

26
empresas como STM, Texas Instruments, NXP, FreeScale o Atmel, entre otras, que le
añaden los periféricos, la memoria y otros componentes que consideran óptimos por el
diseño que tienen.
Por otro lado, están los fabricantes de microcontroladores, que pueden trabajar
de distintas maneras. Por ejemplo, los hay que solo se encargan del diseño y fabricación
del chip; otros diseñan y mandan fabricar a otros (en inglés, fabless); otros compran la
licencia y fabrican el circuito integrado. En definitiva, todas las posibles combinaciones.
Los fabricantes intentan mantener la compatibilidad entre los microcontroladores
que forman una familia, puesto que el desarrollo de aplicaciones en sistemas embebidoss
va ligado a una tool chain o herramientas de desarrollo específicas para la familia y, por
lo tanto, quieren evitar que sus clientes tengan que cambiar todas las herramientas por el
simple hecho de cambiar de procesador. También hay que señalar que existe una fuerte
competencia en el ámbito de las herramientas ofrecidas para el desarrollo, y fabricantes
como STM "regalan" su entorno de desarrollo y/o bibliotecas si se usan sus
microcontroladores.
Finalmente, el término licencia que acaba de aparecer se refiere al “permiso” para
emplear determinado diseño pagando royalties. En este mundo son habituales las
empresas de ingeniería que licencian sus diseños a otros como veremos más adelante.

8.1.3 El procesador de señales digitales (DSP)


Además de los dispositivos de propósito general que hemos comentado hasta el
momento, hay que destacar el DSP como un microprocesador de carácter específico
diseñado para ofrecer un alto rendimiento en las aplicaciones que utilizan procesamiento
de la señal, como pueden ser el tratamiento de voz, música, vídeo, imágenes, etc.
La diferencia básica entre un DSP y el resto de los procesadores es la capacidad
para ejecutar operaciones aritméticas, como la suma, la multiplicación, el desplazamiento
de bits o la multiplicación-acumulación en un solo salto de reloj. Este hecho permite,
pues, hacer cálculos matriciales o convoluciones con pocos saltos. Además, suelen
utilizar aritmética de saturación, es decir, se limitan los resultados de las operaciones entre
un valor máximo y mínimo en vez de permitir el paso del valor máximo al mínimo, como
sucede en los cuentakilómetros analógicos de los automóviles.
Debido a su especialización, pueden ser usados en solitario o junto con un
procesador de carácter general que encarga al DSP las tareas específicas de procesamiento
de la señal. Dado que los DSP trabajan muchas veces con señales del mundo real y, por
lo tanto, analógicas, es común equiparlos con convertidores analógico-digitales (ADC) y
digital-analógicos (DAC), así como con dispositivos digitales de entrada/salida de alta
velocidad.
Como veremos más adelante, existen actualmente microcontroladores que poseen
instrucciones de DSP, lo que permite ejecutar instrucciones complejas en un único ciclo
de reloj. Estas facilidades convierten a ciertos modelos de microcontroladores en
alternativas muy interesantes que combinan bajos costos y un buen desempeño.
8.1.4 Field-programmable gate array (FPGA)
Como se mencionó anteriormente, los dispositivos FPGA permiten la
implementación de todo el hardware y software de un sistema digital en un circuito
integrado configurable, permitiendo desarrollos conocidos como SoC-Programable.

27
En el ámbito de los sistemas embebidos, la utilización de sistemas con FPGA se
justifica cuando las aplicaciones requieren procesamiento masivo de datos con
restricciones de tiempo real que no pueden alcanzarse con el diseño tradicional de
microprocesadores o microcontroladores.
Para estos sistemas son comunes las soluciones en FPGAs, que aprovechan el
paralelismo inherente de algunos algoritmos y permiten desarrollar módulos de
aceleración por hardware. Además, la especificación de todo el sistema se realiza en
forma flexible debido a que su diseño e implementación involucran herramientas de
desarrollo que permiten un elevado nivel de abstracción.
Buses de comunicaciones (direcciones, datos y control)
Tal como se ha podido entrever en los diagramas anteriores, cualquier sistema
embebido, sea cual sea su arquitectura, necesita establecer comunicaciones entre las
diferentes partes que lo forman.
Denominamos buses a estos canales de comunicación, y habitualmente esta
información se transporta en forma de señales eléctricas. En su forma más simple,
podemos entender el bus como un conjunto de "hilos" por donde viaja la información y
normalmente un solo bus interconecta múltiples dispositivos.
La información que viaja por ellos puede ser de tres tipos: direcciones, datos y
control. En primer lugar, la dirección nos indica dónde hay que guardar la información o
de dónde se tiene que extraer, ya sea de la memoria del sistema o de los dispositivos
entrada-salida. En segundo lugar, los datos contienen la información que estamos
procesando. Finalmente, en el bus de control encontramos señales que son necesarias para
el funcionamiento correcto de los dispositivos que forman el sistema. Por ejemplo,
cuando accedemos a la memoria del sistema para recoger unos datos determinados, aparte
de saber la dirección, hay que saber en qué momento están preparados para ser leídas. En
el mundo digital, es muy importante remarcar que todo aquello que no tiene
dirección no existe, puesto que no hay manera de acceder a ello. Pensemos en cuando
borramos un fichero del disco duro de nuestro PC: la información (datos) no se borra
físicamente, pero sí que dejamos de recordar la ubicación (dirección) y, por lo tanto, no
podemos ver la información, aunque permanezca allí.
La Figura 18 muestra los diferentes elementos de un sistema embebido
interconectados mediante los buses de direcciones, datos y control. En este caso, el bus
de direcciones transporta 12 señales, el bus de datos 16 y el bus de control 4:

Figura 18 – Los buses de direcciones, datos y control.

28
Definimos el ancho del bus como el número de bits que puede transportar
simultáneamente y nos da una idea aproximada de la velocidad del bus. Es decir, si
debemos transferir 64 bits sobre un bus de ancho de 16 bits, necesitaremos cuatro
instantes temporales para completar la transmisión, mientras que, si el bus tiene un ancho
de 64 bits, con un solo instante será suficiente. Así pues, queda claro que la velocidad del
bus en bits por segundo vendrá determinada por el producto de su ancho y la frecuencia
máxima de funcionamiento, medida en ciclos por segundo. Por ejemplo, un bus que opera
a 800 MHz y tiene un ancho de 32 bits es capaz de transportar datos a una velocidad
teórica de 25,6 Gbps.
En la figura siguiente podemos ver el movimiento de datos entre fuente y destino.
En este caso, son necesarios ocho instantes temporales para transmitir 32 bits. En el caso
particular de que el ancho del bus sea 1, diremos que se trata de un bus serie, mientras
que en el resto de los casos nos referiremos a él como bus paralelo.

Figura 19 – Movimiento de una palabra de 32 bits en un bus de 8 bits.


Dado que el sistema trabajará con palabras de N bits para describir tanto los datos
como las direcciones, hay que establecer un orden en los bits que recibimos o enviamos
por medio de los buses. En caso de que la palabra ocupe completamente el bus, hay que
establecer un orden espacial entre las líneas que forman el bus. Si, por el contrario, una
palabra requiere varias transmisiones para ser enviada (es seguro el caso de los buses
serie), hay que establecer un orden espaciotemporal. Cualquier disposición que se lleve a
cabo es una simple cuestión de convenio y, en general, se usa la notación Big Endian, en
la que el bit 0 (de más a la derecha) corresponde al de menos peso (LSB) y el bit con un
índice más grande corresponde al de más peso (MSB), o la notación Little Endian, que
funciona justo al revés.

Figura 20 – Notaciones Big Endian y Little Endian.


8.2.1 Direcciones
Anteriormente hemos visto que los datos guardados en memoria necesitan una
dirección asociada para poder ser identificadas y acceder a ellos. Así mismo, también
necesitaremos identificar los dispositivos de entrada/salida para poder interactuar con
ellos. Si pensamos en la memoria del sistema, la podemos ver como una agrupación de
datos en la que cada posición tiene un índice diferente (dirección) y una capacidad

29
determinada (tamaño máximo en número de bits). En los sistemas embebidos, como en
cualquier ordenador, las direcciones se codifican en binario empezando por el 0 y hasta
el número más grande que se puede representar. Por lo tanto, podemos decir que no hay
direcciones negativas. Esto limita la memoria máxima que el sistema es capaz de soportar,
puesto que 32 bits proporcionan 4.294.967.296 identificadores diferentes y, por lo tanto,
no seremos capaces de encaminar todas las posiciones de memoria si esta tiene un tamaño
más grande. Es decir, si los datos tienen un ancho de 8 bits, no podremos tener memorias
más grandes de 4 GB con 32 bits de dirección. Cabe destacar que en general las
direcciones de memora se especifican en formato hexadecimal, por lo que, si el tamaño
de la dirección es de 32 bits todas estarán comprendidas entre 00000000h y FFFFFFFFh.
Finalmente, hay que remarcar que el direccionamiento de memoria es una cuestión
que muchas veces no es transparente al programador del sistema, puesto que, si se
emplean lenguajes de programación tipo C, es habitual el uso del operador & para obtener
la posición de memoria donde se ubica una variable. Por otro lado, esta flexibilidad
requiere actuar con precaución, puesto que el acceso descontrolado sobre la memoria
puede suponer errores graves en el funcionamiento del sistema.
Memoria
El subsistema de memoria es una parte esencial de cualquier sistema embebido,
puesto que es donde guardamos tanto los datos como las instrucciones que forman parte
de nuestras aplicaciones. El diseño correcto de este subsistema en cuanto a dimensionado,
gestión de los propios recursos y adecuación de los tiempos de ejecución afecta
directamente al rendimiento global del sistema. Es más, asignaciones de memoria
inadecuadas pueden incluso dejar nuestra aplicación en un punto muerto, "colgada". En
general, nos podemos encontraren dos situaciones claramente diferenciadas: si nuestra
aplicación es pequeña, la memoria interna del procesador puede resultar suficiente y, por
lo tanto, no tendremos problemas de compatibilidad. En cambio, en aplicaciones más
grandes, tendremos que dotar al sistema de un módulo externo de memoria. En este caso,
la compatibilidad, sobre todo en cuanto a tiempo de ejecución, es fundamental, tal como
veremos más adelante.
En cuanto al tipo de memoria, podemos hacer dos grandes grupos: memoria de
acceso aleatorio o RAM y memoria solo de lectura o ROM. A continuación, se presenta
una clasificación más detallada de los diferentes tipos de memoria, si bien no es
exhaustiva. Tenemos:
 RAM. Su nombre indica que podemos acceder a cualquier posición de memoria en
cualquier momento, a diferencia de lo que sucede en otros tipos de memoria
(normalmente antiguos), como pueden ser las cintas magnéticas, donde el acceso a
una posición determinada pasa forzosamente por el acceso a posiciones anteriores.
Además, los tiempos de lectura y escritura son del mismo orden de magnitud. De entre
los diferentes tipos de memoria RAM podemos destacar:
 Memoria RAM dinámica (DRAM). Se trata de un diseño sencillo de la celda de
memoria elemental (1 bit), basado en el almacenamiento de carga sobre un
condensador. Como la carga almacenada es siempre volátil, las memorias de tipo
DRAM requieren la operación de refresco, es decir, cada cierto tiempo hay que
hacer una lectura de la memoria y volver a guardar el valor resultante. Finalmente,
hay que remarcar que la lectura/escritura se realiza de una manera asíncrona al
reloj del sistema.

30
 Memoria RAM estática (SRAM). Se trata de un diseño más complejo que el
anterior y utiliza la filosofía de los circuitos biestables con lo cual se evita la
necesidad del refresco. Continúan siendo memorias asíncronas como las
anteriores, pero son más rápidas.
 Memoria RAM pseudoestática (PSRAM). Las memorias PSRAM están
formadas por un núcleo de memoria DRAM y una circuitería periférica que se
encarga tanto del refresco como del control de direcciones. Técnicamente es una
memoria DRAM pero se comporta como si fuera SRAM.
 DRAM sincrónica (SDRAM). A diferencia de la memoria DRAM, la SDRAM
sincroniza las direcciones, los datos y las señales de control con el reloj del
sistema, lo cual permite incrementar las tasas de transmisión respecto a la versión
asíncrona.
 ROM. La memoria ROM es una memoria de acceso aleatorio como la RAM pero
está pensada, como su nombre indica, solo para lectura. Se puede escribir en ella,
obviamente, pero el proceso de escritura es siempre mucho más lento que el de lectura
y normalmente nos referimos a él como programación de la ROM. Los tipos más
destacados de memoria ROM son:
 Memoria ROM programable (PROM). Se trata de una memoria que se
programa una sola vez utilizando un aparato específico.
 Memoria EPROM (erasable programmable read only memory). Es una
memoria de tipo PROM, pero con la particularidad de que puede ser borrada. Para
hacerlo, hay que situar la ventana del dispositivo bajo luz ultravioleta durante un
intervalo de tiempo determinado.
 Memoria EEPROM (electrically erasable programmable read only memory).
En este caso, se puede borrar eléctricamente con el mismo aparato utilizado para
la programación.
 Memoria flash. Se trata de un tipo de memoria EEPROM que ha adquirido gran
importancia en los últimos años (memorias USB, tarjetas SD, discos duros de
estado sólido, etc.). En este caso, no es necesario sacar la memoria del circuito
donde se encuentra habitualmente para reprogramarla.

En cuanto a la interacción entre memoria y sistema, cabe señalar que la interfaz de


cualquier memoria está formada por tres tipos de señales, que, coincidiendo con los tipos
de buses, son: direcciones, datos y señales de control. Independientemente del tipo de
memoria y del mecanismo de almacenamiento que emplee, la interfaz más básica con la
memoria la podemos ver en la Figura 21, en la que de momento se han obviado las señales
de control.

31
Figura 21 – Modelo e interfaz básicos de una memoria.

Fijémonos en que un conjunto de bits del bus de dirección identifica una palabra de
la memoria, que se lee o se escribe mediante los buffers (seguidores de tensión) de
entrada/salida.
Las señales que contienen las direcciones son siempre entradas del subsistema de
memoria, y también lo son normalmente las señales de control. En cambio, los datos
pueden ser de entrada o salida según escribimos o leemos en/de la memoria. La función
de las señales de control es, en general, validar las operaciones que se tienen que llevar a
cabo. Dado que las señales digitales experimentan un transitorio a la hora de cambiar de
nivel, es de vital importancia saber en qué momento los valores son válidos.
En la práctica, esto se traduce en esperar el tiempo mínimo necesario entre la carga
de la dirección y la activación de la señal de lectura. A continuación, mencionamos
algunas de las señales de control más habituales:

 Chip select (CS). Habilita el dispositivo de memoria. Generalmente es


válido con valor bajo y puede servir para evitar el consumo de energía
cuando el chip de memoria no se utiliza.
 Output enable (OE). Control del buffer de salida del dispositivo. Suele ser
válido con valor bajo y es entonces cuando permite la lectura de los datos.
En caso contrario, el buffer mantiene un estado de alta impedancia.
 Read (R). Indica que se quiere hacer una operación de lectura.
 Write (W). Indica que se quiere hacer una operación de escritura.
 Column address strobe (CAS). Indica que las señales presentes en el bus
de datos corresponden a la dirección de la columna para el dispositivo. Tal
como veremos más adelante, las memorias se organizan internamente de
manera matricial y, por lo tanto, una posición queda completamente
determinada si indicamos la fila y la columna donde se encuentra.
 Row address strobe (RAS). Indica que las señales presentes en el bus de
datos corresponden a la dirección de la fila para el dispositivo.
Cabe destacar que la mayoría de estas señales de control no solo se encuentran disponibles
en las memorias, sino que es común encontrarlas en todo tipo de dispositivos externos
como conversor analógico/digital, displays, etc.

32
8.3.1 Sistema de memoria
En un sistema embebido se suelen combinar memorias de diferentes tipos que
finalmente dan lugar a su sistema de memoria. Habrá una parte de memoria ROM en la
que guardaremos las aplicaciones y una parte de memoria RAM que utilizaremos a la
hora de ejecutarlas. Asimismo, dividiremos la parte que corresponde a memoria volátil
en tres tipos diferentes, que a la vez están formados por memorias de características
diferentes. A continuación, las presentamos según su tamaño, de mayor a menor:
 Memoria secundaria: es opcional en sistemas embebidos y está formada
por grandes memorias con velocidades de acceso moderadas. El coste
también es el menor de las tres.
 Memoria principal o primaria: de tamaño más pequeño, está constituida
por memorias más rápidas y también más caras. Típicamente son memorias
DRAM o SRAM de gran velocidad.
 Memoria caché: es la parte más pequeña y rápida del sistema de memoria.
También es la más costosa. Está formada por memorias SRAM de muy alta
velocidad.
La lógica que hay detrás de esta configuración del sistema de memoria responde al
comportamiento de la mayoría de las aplicaciones. Así, hay una pequeña cantidad de
datos a los que se accede de una manera mucho más continuada que al resto en un
momento determinado. Por lo tanto, este diseño se acomoda a esta situación y favorece
la velocidad de ejecución del software si se ubican los datos de uso más frecuente en la
memoria caché y el resto en la memoria principal. También se trata de una solución
efectiva en términos de costo, puesto que se mantiene la capacidad del sistema de
memoria y se penaliza poco en velocidad de ejecución respecto a un sistema equivalente
que integre solo memorias de alta velocidad. En ocasiones, también se consideran los
mismos registros (lo veremos a continuación) del microprocesador en una categoría
adicional que podríamos denominar memoria caché interna.
Asociado al sistema de memoria que acabamos de comentar y más en el nivel lógico,
hemos de considerar el mapa de memoria de cualquier sistema embebido. Se incluyen en
él todas las direcciones físicas existentes en el sistema y, aparte de la zona dedicada a
memoria volátil, comentada anteriormente y que contiene tanto datos del usuario como
del sistema, también consideramos la memoria de tipo ROM en la que se guardan las
instrucciones de programa o los dispositivos de entrada/salida mapeados a memoria, que
van desde una pantalla o un visor a un disco duro con acceso directo a memoria (DMA).
En la figura siguiente podemos ver un ejemplo de mapa de memoria para un sistema de
16 bits:

33
Figura 22 – Modelo e interfaz básicos de una memoria.

8.3.2 Registros
Los registros de datos principalmente funcionan como lugares de memoria
electrónica temporal de frecuente y fácil acceso para el procesador. Esta accesibilidad se
debe a la ubicación de los registros dentro de los microprocesadores. Como resultado de
ello, la CPU puede acceder a ellos con mayor rapidez que los módulos de memoria de
acceso aleatorio vistos anteriormente (RAM - ROM o flash). Un microprocesador normal
contiene múltiples matrices de estos registros y cada uno está fabricado para mantener
sólo una pequeña cantidad de datos binarios. Un registro en funcionamiento tiene una
capacidad de memoria de 8, 16, 32 o 64 bits; estos valores dependen de la arquitectura
del microprocesador.

34
Figura 23 – Mapa de registros principales del CPU de un microcontrolador Cortex-
M0.

Los registros en un microprocesador funcionan como datos en tiempo real que


llevan unidades de memoria electrónica. Esto significa que cuando un usuario da una
orden a una aplicación de software, se traduce en una declaración binaria y se envía al
microprocesador. Estas declaraciones son recibidas por registros del microprocesador,
que los mantienen durante unos nanosegundos si el procesador ya está ocupado, y luego
las envía a petición del procesador. Estos registros también tienen los bits procesados en
tiempo real de datos cuando se transmitieron y los bits de datos previamente procesados,
así como también mantienen las ubicaciones y los comandos asociados con los valores de
entrada o los datos procesados.
Según el tipo de procesador, puede haber hasta ocho categorías principales de los
registros de datos integradas en las CPU. Estos incluyen:
 Contadores de programa (PC), para almacenar los bits de dirección de
instrucción de datos actualmente procesado.
 Registros de instrucción (IR), para el almacenamiento de instrucciones
binarias mientras están siendo procesados o decodificados;
 Acumuladores (CA), para el almacenamiento de resultados de cálculos
matemáticos por la unidad lógica aritmética de la CPU;
 Dirección de registros de memoria (MAR), para el almacenamiento de
ubicaciones de dirección de los bits de datos dentro de la memoria principal
de una computadora;
 Búfer de registros de memoria (MBR), para almacenar y retener
temporalmente los bits de datos entrantes antes de reenviarlos al
microprocesador,
 Estado o bandera de registros (FR), para mantener y actualizar los estados
de funcionamiento de los microprocesadores;
 Registros condicionales (CR), para mantener los valores condicionales o
lógicos de los datos procesados

35
 Registros de propósito general (GPR), para almacenar temporalmente los
bits de datos generales o instrucciones.
Los registros no sólo comparten la carga del procesador, sino que también le
proporcionan instrucciones acerca de cómo se deben procesar los datos. Además, estos
registros proporcionan una importante ayuda a los microprocesadores en la tarea de
determinar dónde enviar los datos tras el procesamiento, y en qué disposición almacenarlo
en la memoria principal o dentro de un dispositivo de almacenamiento. También, el
número de registros integrados y operando dentro de un microprocesador ayuda a definir
su eficiencia operativa y capacidades de procesamiento de datos.
El stack o pila
Stack o pila es una estructura de datos con acceso del tipo LIFO (Last In First Out),
último en entrar, primero en salir. Como similitud se puede asociar a un almacenamiento
de libros formando una pila, en la que se almacenan uno sobre otro, los nuevos elementos
se apilan sobre el último, y cuando se retiran se extrae el último que se ha apilado.
Este tipo de estructura de datos es fácil de desarrollar por los sistemas con
microprocesadores y resulta de gran utilidad para trabajar con listas de datos y es
imprescindible para el trabajo interno del microprocesador en las subrutinas e
interrupciones.
Algunos microprocesadores pueden tener el Stack en su interior
(microcontroladores), representando un sistema muy rápido, pero de tamaño limitado,
otros microprocesadores disponen el stack en la memoria externa, hecho que proporciona
una gran capacidad de almacenamiento y el control de su ubicación, aunque el acceso sea
más lento.
8.4.1 El puntero de la pila (stack pointer)
El puntero del stack SP (stack pointer) como su propio nombre indica es un registro
apuntador a la posición de memoria donde se encuentra la pila. Este registro es de uso
interno del procesador y le indica al mismo cual es el último elemento de la pila. En la
familia Cortex-M el registro SP se encuentra en la memoria junto a los registros de
propósitos generales como ser observó en la Figura 23.
Conjunto de Instrucciones
El conjunto de instrucciones (ISA) (del inglés Instruction Set Architecture) de un
sistema embebido conforma el nexo de unión entre su hardware y el software. Así pues,
cada instrucción representa una acción que el hardware de nuestro sistema es capaz de
llevar a cabo. Nos referiremos a estas acciones como operaciones y actúan siempre sobre
el operando. El número de operandos que una operación contiene denota su grado,
habitualmente comprendido entre 1 y 3. Como ejemplo, pensemos en la instrucción z = x
+ y, escrita en C. Vemos que contiene tres operandos: los operandos fuente x e y además
del operando destino z. Si miramos la instrucción con detalle, podemos observar que en
realidad habrá que llevar a cabo dos operaciones básicas, que son la de suma y la de
asignación. Por lo tanto, el procesador hará primero la suma de x e y, la guardará
temporalmente y escribirá el resultado en z. En contraposición, la instrucción x = x + y
tiene solo dos operando, pero a la hora de ejecutarla habrá que hacer dos operaciones
básicas del mismo modo que en el caso anterior.

36
A la hora de representar las instrucciones en la memoria de programa y de manera que el
procesador sea capaz de interpretarlas, se agrupan los bits de datos en campos. Siempre
tiene que haber un campo destinado a describir cuál es la operación que se ha de llevar a
cabo y el resto de los campos (habitualmente entre 1 y 3) permite localizar los operandos.
En la Figura 24 podemos ver algunos ejemplos de formato de instrucciones en una
máquina que utiliza palabras de 32 bits y en notación Big Endian (en Little Endian los
campos irían al revés, de tal manera que el código de operación se ubica siempre en los
bits de más peso).

Figura 24 – Diferentes formatos de instrucción


8.5.1 Tipos de instrucciones
De cara al procesador, cada instrucción queda unívocamente identificada por una
combinación determinada de 0 y 1 y, por lo tanto, el número de bits dedicado a esta parte
estará determinado por el total de instrucciones que el micro sea capaz de ejecutar. En la
fase de programación, sin embargo, no trabajamos directamente con la información
binaria, sino que utilizamos lenguajes de diferentes niveles de abstracción. El más básico
(de nivel más bajo) es el lenguaje de ensamblador, pero hay una gran cantidad de micros
que se programan con lenguajes de alto nivel tipo C/C++. En cualquiera de los casos,
necesitaremos un software específico que transforme nuestro código a 0 y 1, es decir, a
lenguaje de máquina. De hecho, la traducción de ensamblador a código máquina es
directa, puesto que simplemente sustituimos los códigos de operación binarios por
mnemónicos, que facilitan que el ser humano los interprete. A grandes rasgos,
clasificamos el conjunto de instrucciones en tres grandes bloques:

 Instrucciones de transferencia de datos, que nos permiten mover los datos


de un lugar a otro.
 Instrucciones de control de flujo, que servirán para controlar el orden de
ejecución de las instrucciones que forman un programa.
 Instrucciones relacionadas con la aritmética y la lógica, que nos permitirán
hacer las operaciones lógicas y aritméticas que sean necesarias.

Por otro lado, el conjunto de instrucciones del que dispone un procesador adquiere
una gran importancia, puesto que define la interfaz entre el programador y la máquina.

37
8.5.2 Clasificación del conjunto de instrucciones
Como hemos visto, el CPU es el elemento más importante de un microcontrolador
y determina sus principales características, tanto a nivel hardware como software. Se
encarga de direccionar la memoria de instrucciones, recibir el código de operación de la
instrucción en curso, su decodificación y la ejecución de la operación que implica la
instrucción, así como la búsqueda de los operandos y el almacenamiento del resultado.
Existen dos principales orientaciones en cuanto al conjunto de instrucciones y su
funcionamiento en los procesadores actuales.

 CISC (Complex Instruction Set Computer): Un gran número de procesadores están


basados en la filosofía CISC. Los procesadores CISC tienen un conjunto de
instrucciones que se caracteriza por ser muy amplio y permitir operaciones complejas
entre operandos situados en la memoria o en los registros internos. Este tipo de
arquitectura dificulta el paralelismo entre instrucciones, por lo que, en la actualidad,
la mayoría de los sistemas CISC de alto rendimiento implementan un sistema que
convierte dichas instrucciones complejas en varias instrucciones simples del tipo
RISC, llamadas generalmente microinstrucciones.

 RISC (Reduced Instruction Set Computer): Tanto la industria de los


microprocesadores la de los microcontroladores han decantado hacia la filosofía
RISC. En estos procesadores el repertorio de instrucciones de máquina es muy
reducido y las instrucciones son simples y generalmente, se ejecutan en un ciclo de
instrucción. Las características fundamentales se muestran a continuación:
o Las instrucciones son de tamaños fijos y son presentadas en un reducido
número de formatos.
o Sólo las instrucciones de carga y almacenamiento acceden a la memoria de
datos.

9 Bibliografía

 Ganssle, J. G. (2000). The Art of Designing Embedded Systems (1.ª ed.). Woburn,
Massachusetts: Newnes (Elsevier).
 Marvedel, P. (2003). Embedded System Design (1.ª ed.). Dordrecht: Kluwer
Academic Publishers.
 Peckol, J. K. (2008). Embedded Systems: A Contemporary Design Tool. Hoboken,
Nueva Jersey: Wiley.
 Stuart R. B. (2002). Embedded Microprocessor Systems: Real World Design (3.ª ed.).
Woburn, Massachusetts: Newnes (Elsevier).
 Yaghmour, K. (2003). Building Embedded Linux Systems. Sebastopol, California:
O'Reilly and Associates.
 Introducción a los sistemas empotrados - Ignasi Vilajosana Guillén - FUOC. Fundació
per a la Universitat Oberta de Catalunya.

38

También podría gustarte