Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
GFR
4
2 Introducción
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.
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:
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.
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.
7
Figura 2 – Sistemas embebidos en un automóvil.
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.
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:
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.
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.
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.
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)
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:
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:
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.
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).
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.
18
Propiedades no funcionales.
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:
21
8 Arquitectura de un sistema embebido
Buses
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.
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:
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.
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:
Figura 17 – Chip Cortex-M3. Aquí vemos la parte desarrollada por ARM y la parte
desarrollada por los diferentes integradores.
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.
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:
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.
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.
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:
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.
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).
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.
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