Written by Jesus
INTRODUCCIÓN
Una de las alternativas para programar sistemas empotrados hoy en día son los llamados sistemas operativos de tiempo real (SOTR). Su característica principal es que ofrecen al programador toda una serie de servicios orientados a la implementacion de sistemas de tiempo real en general, y sistemas empotrados en particular, lo cual no es habitual en los sistemas operativos normales. Algunos presentan la apariencia tipica de un sistema operativo en el sentido habitual del termino, con sistemas de ventanas, sistema de ficheros, acceso a redes y entornos de desarrollo, mientras que otros, denominados núcleos de tiempo real (real-time kernels), son librerías de funciones, normalmente en C.
En la siguiente practica, consideraremos la utilización del núcleo de tiempo real µC/OS-II
Preemptive: µC/OS-II is a fully-preemptive real-time kernel. This means that µC/OS-II always runs the highest priority task that is ready. Most commercial kernels are preemptive and µC/OS-II is comparable in performance with many of them.
La multitarea apropiativa (del inglés “preemptive multitasking”) es una manera en que los sistemas operativos pueden proveer multitarea, es decir, la posibilidad de ejecutar múltiples procesos al mismo tiempo. Con la multitarea apropiativa, el sistema operativo asigna tiempos de CPU a los procesos que se están ejecutando. Por cada núcleo de la CPU, se puede ejecutar a lo sumo un proceso en cada momento. Al proceso actual, el sistema le asigna un intervalo de tiempo para ejecutarse; una vez acabado el tiempo, el proceso queda pausado y se destina el siguiente intervalo de tiempo a un proceso distinto. Eventualmente, el primer proceso volverá a recibir intervalos para seguir ejecutándose, hasta que finalice su ejecución, y lo mismo pasará con los demás.
Para decidir a qué proceso asignar el próximo intervalo de tiempo de ejecución, el sistema operativo dispone de un componente llamado planificador. Hay diversos criterios que se pueden adoptar.
PROCEDIMIENTO
Lo guardara en una ruta cercana a C: y tendrá en cuenta la dirección de la ubicación mas adelante.
Ejecutelo y proceda a dar click en Assembler
Mientras nuestro programa compila, abra Nios ll 15.0 Software Build Tools For Eclipse y cree un nuevo File---Nios II Application and BSP from Template
en SOPC Information File name buscaremos la ruta donde fue guardado el proyecto de DE0_NANO_SOC_practica_nios2_Karplus_Strong_restored y agregue el arcivo .sopcinfo
Damos nombre a nuestro proyecto en este caso UCOS_Practica_1 y en Templates seleccionamos Hello MicroC/OS-II
se debe tener algo así en Project Explorer, dos carpetas con el nombre de nuestro proyecto UCOS_practica_1
Abramos la carpeta de UCOS_practica_1 y demos dobleclick en el .c y analicemos el código.
Aparecen dos librerías, <stdio.h> es la que ya conocemos la cual nos permite utilizar el printf y aparece <includes.h>, esta contiene la transfiguración del sistema operativo Ucos II y todas las librerías necesarias para utilizar el sistema operativo, siempre que se quiera utilizar el sistema operativo se debe incluir <includes.h>
tenemos un #define
TASK_STACKSIZE, esto define el tamaño del stack por tarea, quiere decir que en este caso el stack de cada tarea tiene un tamaño de 2048 (2k)
los OS_STK son los procesos cuantos procesos se quieran añadir se tiene que añadir con OS_STK, en este caso hay 2 procesos (Tareas)
tenemos lo que son las definiciones de las prioridades, que quiere decir esto, cada tarea tiene una prioridad para ejecutarse, a la cual se le destina mas proceso del nios, entre menor sea el numero mas prioridad tiene la tarea para ejecutarse (Duda)
miremos el main y analicemos.
tenemos una función llamada OSTaskCreateExt,
esta función es especial del sistema operativo, esta función es similar a OSTaskCreate ()
salvo que permite obtener información adicional acerca de una tarea que se determine.
el primer argumento es la tarea,es un puntero al codigo de la tarea,el segundo argumento es un Puntero al área de datos es opcional; se utiliza para pasar parámetros a la tarea al inicio de la ejecución, el tercer argumento es la prioridad, entre menor sea el numero, mayor sera su prioridad NOTA: dos tareas no pueden tener la misma prioridad.
OSStart inicia el proceso de multitarea.
OSTimeDlyHMSM tiempo de ejecución de la tarea, H(Horas), M(minutos), S(segundos),M(milisegundos).
luego de analizar el código, vamos a crear una nueva tarea nueva.
añadimos:
OS_STK leds_stk[TASK_STACKSIZE];
Y
#define LEDS_PRIORITY 3 (las prioridades no pueden ser iguales, notese que cada una tiene prioridades diferentes)
añadimos:
el código siguiente
y dentro del main
así creamos nuestra nueva tarea, ahora tenemos tres tareas de prioridad 1 2 y 3 y cada una con un tiempo de ejecución de 3 segundos, imprimiendo (hello from task1,hello from task2,hello from leds_task) respectivamente.
ahora vamos a asignar a cada tarea una ejecución y utilizaremos los leds para ello.
copiemos el siguiente codigo dentro del while de la tarea leds_task
para hacer acceso a los leds necesitamos agragar el system.h y io.h
nuestro periférico se llama LEDS_BASE, para verificarlos debería salir en el system.h
lo que haremos ahora es reemplazar en cada while de las demas tareas ese mismo codigo, y tenemos lo siguiente
cada tarea tiene tiempos diferentes, note que leds_task es de 1 segundo, task1 es de 500 milisegundos y task2 es de 1 segundo.
ya terminando el codigo vamos a Ucos_practica_1_bsp y generamos el bsp
luego en Ucos_practica_1 y vamos a propiedades
se desplegara las siguiente ventana, donde se seleccionara optimizar en nivel 2.
damos click derecho en la carpera de Ucos_practica_1 y seleccionamos build project
en este tiempo ya nuestro programa en Quartus debió haber compilado, asi que programelo sobre la FPGA.
vuelva a eclipse y sobre la carpeta Ucos_practica_1 click derecho:
se desplegara la siguiente ventana, presione (F8) o de click en:
LINKS DE INTERES:
https://www.micrium.com/rtos/kernels/