Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESCUELA DE POSGRADO
AUTOR:
PROFESOR:
LIMA - PERÚ
2020
PROYECTO SISTEMAS EN TIEMPO REAL
0.1. Introducción
El presente proyecto trata sobre la ejecución de dos programas que emplean técnicas
de procesamiento en multitarea, esto es el uso de hilos y asignación de prioridades a los
hilos.
Se hace uso de un sistema operativo en tiempo real denominado Zephyr en la que se
prueban los dos programas y se simulan sobre dos arquitecturas x86 y cortex a53.
Los resultados demuestran que Zephyr es un sistema operativo de tiempo real con
prestaciones avanzadas de simulación.
En noviembre de 2015, que fue desarrollado originalmente como Rocket kernel por
Wind River Systems para dispositivos y aplicaciones referentes a internet de las cosas (IOT).
En febrero de 2016, Zephyr se convirtió en un proyecto de la Fundación Linux .
Desde entonces, los primeros miembros y partidarios del Zephyr incluyen Intel , NXP
Semiconductors , Synopsys , Linaro , runtime.io, DeviceTone, Nordic Semiconductor y Oti-
con . Zephyr es un pequeño sistema operativo en tiempo real para los dispositivos conecta-
dos, con recursos limitados que soporta múltiples arquitecturas y liberados bajo la licencia
Apache 2.0 .
El núcleo Zephyr es pequeño y diseñado para el uso en sistemas de recursos limitados:
de sensores simples incrustadas ambientales y diodo emisor de luz (LED) WEARABLES a
relojes inteligentes sofisticados y puertas de enlace inalámbricos IO.
El kernel ofrece varias caracterı́sticas que lo distinguen de otros sistemas operativos
pequeños:
0.2.1. Seguridad
1
código de la aplicación y el código del núcleo se ejecutan en un solo espacio de direcciones
compartido.
Permite que una aplicación para incorporar sólo las habilidades que necesita, según
sea necesario, y para especificar su cantidad y tamaño.
Requiere ser definidos todos los recursos del sistema en tiempo de compilación, lo que
reduce el tamaño del código y aumenta el rendimiento.
Los servicios de desarrollo ofrecen varios servicios familiares para el desarrollo, inclu-
yendo:
• Servicios de multi-threading, clasifica los hilos en dos tipos; hilos cooperativos y los
hilos preferentes ambos pueden tener una planificación basada en prioridad fija o
variable, además aplican planificación FIFO y round robin.
• Servicios de sincronización entre hilos para los semáforos binarios, semáforos de con-
teo, y semáforos mutex.
• Datos entre hilos que pasan los servicios para las colas básicas de los mensajes,
colas de mensajes mejorados, y flujos de bytes.
2
0.3. Board que soporta
Las que se muestran son las arquitecturas que soporta Zephyr si desea ver las boards
que componen cada arquitectura ir al enlace https://docs.zephyrproject.org/latest/boards/index.html
• x86 Boards
• ARM Boards
• ARC Boards
• NIOS II Boards
• XTENSA Boards
• POSIX/NATIVE Boards
• RISCV Boards
• Shields
Cane señalar que para algunas boards existe simuladores la lista adjunta las muestra.
0.4.1. Objetivos
3
• Simular los programas desarrollados utilizando lo simuladores QUEMU de Tephyr.
• Verificar que los programas realizan las tareas que deberı́an realizar.
0.4.2.1. Programa 0
En el programa 0 se crea un hilo A y este crea a un hilo hijo, el hilo B, ambos invocan
a la misma subrutina con una alternancia al estilo ping pong, es decir, si empieza el hilo A,
ejecuta la subrutina luego de terminar de ejecutarla cede su ocupación para que el hilo B la
ejecute y al terminar su ocupación cede al hilo A para que la ejecute y ası́ sucesivamente.
El programa creado para esta actividad se describe en el anexo con el nombre de
pucp.c. Además lo puede encontrar en la carpeta adjunta pucproject/src/pucp.c
Se simuló el programa en X86 Emulation (QEMU) y ARM Cortex-M0 Emulation (QE-
MU). Los comandos en lı́nea que se emplearon para obtener los archivos compilados son:
// Simular programa 0 con el simulador qemu_x86
// Posicionarse en la carpeta \textit{\textbf{/home/.../zephyrproject/zephyr}}
west build -p auto -b qemu_x86 samples/pucproject
west build -t run
Se verificó en la simulación que el programa lograba su cometido para el que fue creado.
En caso la simulación no fuera exitosa, se tendrı́a que modificar el programa, luego
grabarlo y antes de volverlo a simular se debe borrar la construcción de la simulación no
exitosa con el comando en lı́nea:
// Borrar las construcciones no exitosas antes de proceder a la simulación
west build -t pristine
0.4.2.2. Programa 1
En el programa 1 se crean tres hilos con diferente prioridad el primero con prioridad 0, el
segundo con prioridad 7 y el tercero con prioridad 2. El sentido común nos puede jugar una
mala pasada pues de lo expuesto se deducirı́a que el segundo hilo es de mayor (prioridad
4
7), lo cual es incorrecto, pues en el sistema operativo Zephyr, el de mayor prioridad es el
hilo 1 (prioridad 0).
En el programa 1 los tres hilos compiten por apoderarse de un semáforo y luego de
adquirirlo ejecutan una labor básica de impresión. Debido a que ellos tienen prioridades
asignadas al ejecutarse primero lo hace el hilo 1, realiza su labor de impresión y luego se
le duerme, con la finalidad de dejar libre el semáforo y permitir que los dos hilos restantes
compitan por apoderarse del semaforo. Se observa, siempre, que el kernel atiende al de
mayor prioridad.
El programa creado para esta actividad se describe en el anexo con el nombre de
pucp1.c. Además lo puede encontrar en la carpeta adjunta pucproject1/src/pucp1.c
Se simuló el programa en X86 Emulation (QEMU) y ARM Cortex-M0 Emulation (QE-
MU). Los comandos en lı́nea que se emplearon para obtener los archivos compilados son:
// Simular programa 1 con el simulador qemu_x86
// Posicionarse en la carpeta \textit{\textbf{/home/.../zephyrproject/zephyr}}
west build -p auto -b qemu_x86 samples/pucproject1
west build -t run
Se verificó en la simulación que el programa lograba su cometido para el que fue creado.
En caso la simulación no fuera exitosa, se tendrı́a que modificar el programa, luego
grabarlo y antes de volverlo a simular se debe borrar la construcción de la simulación no
exitosa con el comando en lı́nea:
// Borrar las construcciones no exitosas antes de proceder a la simulación
west build -t pristine
0.5. Conclusiones
• Se verificó que los programas, pucp.c y pucp1.c, realizan las tareas que deberı́an
realizar.
5
APÉNDICE A
6
ARG_UNUSED(dummy2);
ARG_UNUSED(dummy3);
/* invoca a la rutina para ping-pong de mensages con el hilo A */
helloLoop("**** Soy el hilo B", &sem_hiloB, &sem_hiloA);
}
7
void coop_thread1(void) {
while (1) {
k_sem_take(&coop_sem1, K_FOREVER);
printk("---> trabajando hilo 1\n");
k_busy_wait(100000);
k_sem_give(&coop_sem1);
}
}
/* Esta es la función del hilo que tiene la menor prioridad */
void coop_thread2(void) {
while (1) {
k_sem_take(&coop_sem1, K_FOREVER); // sem2
for (int i = 0; i < 5; i++) {
printk("---> trabajando hilo 2\n");
k_busy_wait(100000);
}
k_sem_give(&coop_sem1); // sem2
}
}
/******************************* F I N *********************************/