Objetivo
Al probar la implementación del conjunto de librerías para manejo de ETHERNET llamada RTCS, se encontró que los sockets TCP son bloqueantes ( es decir, se esperan indefinidamente hasta que se reciba una petición por el puerto ). Esto no afectará el sistema si se tiene una tarea distinta por cada socket. Desgraciadamente al probar con la calendarización predeterminada de las tareas se encontró que se realiza un FIFO y cualesquier tarea que ejecute el código bloqueante del TCP bloquea todas las actividades del micro.
La solución es quitar la aplicación FIFO en la calendarización de las tareas y usar un Round Robin.
Alcance
Este documento desarrolla la forma de aplicar el algoritmo de calendarización Round Robin a las tareas generadas en el Kinetis K60 de Freescale.
Desarrollo
MQX está habilitado por default para la generación de tareas por parte del desarrollador. En los ejemplos que vienen en su sitio web y al descargar el sistema operativo MQX en la función main es común ver código de este tipo:
TASK_TEMPLATE_STRUCT MQX_template_list[] = { /* Task number, Entry point, Stack, Pri, String, Auto? */ {MAIN_TASK, Main_task, 2000, 9, "main",MQX_AUTO_START_TASK }, {0, 0, 0, 0, 0, 0, } };
En él se define una tarea principal que es de inicio automático por parte del sistema operativo. La constante MQX_AUTO_START_TASK es la bandera que indica lo anterior al subsistema que se encarga de la calendarización de las tareas.
La estructura Task Template es usada para definir los parámetros básicos de una tarea para el MQX. La calendarización de las tareas ( el tiempo dedicado por el sistema operativo a cada tarea ) utiliza el algoritmo FIFO ( First In First Out ) de forma predeterminada. Esto puede cambiarse y en su lugar escoger la aplicación del algoritmo Round Robin ( también conocido en MQX con el nombre de time slice ). Los pasos para realizar esto son:
1.- Indicar en las tareas que se quiera trabajen de esa forma la bandera: MQX_TIME_SLICE_TASK
Por ejemplo:
TASK_TEMPLATE_STRUCT MQX_template_list[] = { /* Task number, Entry point, Stack, Pri, String, Auto? */ {MAIN_TASK,Main_task,2000,9,"main", MQX_AUTO_START_TASK | MQX_TIME_SLICE_TASK, 0L, 2 }, {SEC_TASK,Main_task,2000,9,"sec", MQX_AUTO_START_TASK | MQX_TIME_SLICE_TASK, 0L, 2 }, {0, 0, 0, 0, 0, 0, } };
Se definen dos tareas que se inician al iniciar el MQX pero que las dos trabajan en Round Robin. El último parámetro (2) indica que el tiempo en que está vigente cada tarea es únicamente 2 milisegundos. La unidad milisegundos puede ser cambiada por ticks, en la documentación indica que de forma predeterminada la unidad de tiempo son ticks pero en esta versión del MQX ( 3.7 ) al revisar las banderas se encontró que la unidad predeterminada eran milisegundos.
La bandera MQX_TIME_SLICE_TASK esta por default deshabilitada en el archivo mqx.h con el siguiente código:
#if MQX_HAS_TIME_SLICE #define MQX_TIME_SLICE_TASK (0x04) #endif
Esto se encuentra en el archivo small_ram_config.h
#ifndef MQX_HAS_TIME_SLICE #define MQX_HAS_TIME_SLICE 0 #endif
Este archivo es colocada en el proyecto actual por parte del CodeWarrior ( desde ahora indicado como CW )cuando se pide por medio del wizard generar un proyecto básico que use el MQX. El archivo small_ram_config.h en el proyecto es generado por lo tanto no puede modificarse.
2.- Buscar en el PSP la bandera MQX_HAS_TIME_SLICE y darle seguimiento con la tecla F3, el CW envía el control a un archivo small_ram_config.h ubicado en el PSP. Se cambia ahí la bandera MQX_HAS_TIME_SLICE de 0 a 1 y se recompila el PSP.
3.- Al colocar la bandera MQX_TIME_SLICE_TASK al momento de generar la tarea esta es respetada. Las tareas son ejecutadas de forma intercalada.
Realizado: 6 de julio del 2012
Autor: Jesús Ambriz
excelente haber encontrado tu blog, yo trabajo con el k60d100m estoy diseñando un gw que incorpora 802.15.4 y la tarjeta gs1500m
ResponderEliminar