
Continuamos revisando los servicios RTOS que proporcionan información adicional sobre tareas y operaciones con ellos.
Las llamadas de API adicionales asociadas con las tareas incluyen llamadas para obtener la ID de la tarea, verificar el tamaño de la pila, restablecer la tarea, obtener información sobre la tarea y determinar la cantidad de tareas en el sistema. Nucleus RTOS y Nucleus SE proporcionan 4 llamadas API principales para estas operaciones, que cubriré en este artículo.
Artículos anteriores de la serie:
Artículo # 11. Tareas: configuración e introducción a la APIArtículo # 10. Programador: funciones avanzadas y preservación del contextoArtículo # 9. Programador: implementaciónArtículo # 8. Nucleus SE: diseño interno y despliegueArtículo # 7. Núcleo SE: IntroducciónArtículo # 6. Otros servicios RTOSArtículo # 5. Interacción de tareas y sincronizaciónArtículo # 4. Tareas, cambio de contexto e interrupcionesArtículo # 3. Tareas y planificaciónArtículo # 2. RTOS: estructura y modo en tiempo real
Artículo # 1. RTOS: introducción.
Obtener el ID de la tarea actual
Esta llamada de utilidad devuelve la ID de la tarea llamada. Para Nucleus RTOS, este es un puntero a la unidad de control de la tarea actual. Para Nucleus SE, el índice (0-15) de la tarea actual.
Llamar a la tarea actual en Nucleus RTOSPrototipo de llamada de servicio:
NU_TASK * NU_Current_Task_Pointer (VOID);Parámetros:
Están ausentes
Valor de retorno:
Puntero a la unidad de control de la tarea actual;
NU_NULL : no se realiza ninguna tarea.
Desafiando una tarea en curso en Nucleus SEEsta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS.
Prototipo de llamada de servicio:
NUSE_TASK NUSE_Task_Current (nulo);Parámetros:
Están ausentes
Valor de retorno:
Índice de la tarea actual (llamada).
Completa una tarea en curso en Nucleus SELa implementación de la llamada API en este caso es bastante simple:
se devuelve el valor de la variable global
NUSE_Task_Active .
Comprobación del tamaño de pila disponible
Esta llamada de utilidad devuelve el tamaño de pila disponible (en bytes) para la tarea actual. Esto solo es aconsejable para los planificadores, donde cada tarea tiene su propia pila; es decir No es adecuado para el planificador Run To Completion (RTC) en Nucleus SE.
Recordando información de volumen de pila en Nucleus RTOSPrototipo de llamada de servicio:
NO FIRMADO NU_Task_Check_Stack (VOID);Parámetros:
Están ausentes
Valor de retorno:
El tamaño del tamaño de pila disponible para la tarea actual en bytes.
Recordando información sobre el tamaño de la pila en Nucleus SEEsta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS. Sin embargo, Nucleus SE requiere un parámetro formal (ficticio) para facilitar la obtención del valor del puntero en la pila utilizada.
Prototipo de llamada de servicio:
U16 NUSE_Task_Check_Stack (U8 ficticio);Parámetros:
ficticio : cualquier valor, porque de hecho no se usa.
Valor de retorno:
El tamaño del tamaño de pila disponible para la tarea actual en bytes.
ImplementaciónPara dicha llamada, el código debe ser portátil:

Si se usa el planificador RTC, el valor de retorno es 0 porque no es posible (usando código portátil) determinar el espacio de pila disponible para la tarea.
En otros casos, el valor del puntero de la pila se determina al encontrar la dirección del parámetro ficticio, que se ubicará casi al comienzo de la pila. Estrictamente hablando, dicho método depende de las herramientas de desarrollo / compilación, pero siempre funcionará. El valor de retorno es la diferencia entre este valor y el valor original del espacio de pila, traducido a bytes.
Restablecer tarea
Una llamada a la API, en este caso, devuelve la tarea a su estado original sin usar. Dicha función de API es diferente de las funciones de restablecimiento de API habituales para otros objetos del núcleo, aunque solo sea porque es un restablecimiento, y no solo configurando la tarea en su estado inicial (para Nucleus SE es
NUSE_READY o la entrada
NUSE_Task_Initial_State [] (consulte Estructuras de datos en siguiente artículo)); la tarea se pone en espera (
NUSE_PURE_SUSPEND ) y se debe reanudar para poder programarla nuevamente. Esta lógica es similar a la funcionalidad de la llamada API correspondiente en Nucleus RTOS.
Llamada de reinicio de tarea en Nucleus RTOSPrototipo de llamada de servicio:
ESTADO NU_Reset_Task (tarea NU_TASK *, argc UNSIGNED, VOID * argv);Parámetros:
tarea : un puntero a un bloque de control de tarea;
argc : un elemento de datos que se puede usar para transferir información a la tarea;
argv es un puntero que se puede usar para pasar información a la tarea.
Valor de retorno:
NU_SUCCESS - llamada completada con éxito;
NU_INVALID_TASK : puntero no válido a la tarea;
NU_NOT_TERMINATED : la tarea descrita no está en estado de suspensión completa (finalizada) o finalizada (finalizada); solo las tareas en estado de pausa o completado se pueden restablecer.
Llamada de restablecimiento de tarea en Nucleus SEEsta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS.
Prototipo de llamada de servicio:
ESTADO NUSE_Task_Reset (tarea NUSE_TASK);Parámetros:
tarea : índice (ID) de la tarea a restablecer.
Valor de retorno:
NUSE_SUCCESS - llamada completada con éxito;
NUSE_INVALID_TASK : índice de tarea no válido.
Implementar tareas de restablecimiento en Nucleus SEEl propósito principal de la función API
NUSE_Task_Reset () después de verificar el parámetro es reinicializar todas las estructuras de datos de tareas:

Si la tarea se bloquea cuando se llama a la API para esperar el acceso al objeto del núcleo, lo primero que debe hacer es configurar el contador de tareas bloqueadas correspondientes al objeto. Esto se hace mediante la declaración de cambio.
Luego, las estructuras de datos de la tarea se inicializan (básicamente, con ceros, excepto su bloque de contexto) llamando a la función de inicialización
NUSE_Init_Task () . Su implementación se discutirá con más detalle en el próximo artículo que describe la inicialización del sistema. Finalmente, el estado de la tarea se establece en
NUSE_PURE_SUSPEND .
Obteniendo información de la tarea
Esta llamada de servicio proporciona información parcial sobre la tarea. La implementación de Nucleus SE difiere de Nucleus PLUS, en la que se devuelve menos información, porque los nombres de objetos, suplantando una tarea de menor prioridad y un intervalo de tiempo no son compatibles, y la prioridad no se devuelve, como información redundante.
Llamar a la información de la tarea en Nucleus RTOSPrototipo de llamada de servicio:
ESTADO NU_Task_Information (NU_TASK * tarea, CHAR * nombre, DATA_ELEMENT * task_status, UNSIGNED * Scheduled_count, OPTION * Priority, OPTION * preempt, UNSIGNED * time_slice, VOID ** stack_base, UNSIGNED * stack_size, UNSIGNED * minimal_stack;Parámetros:
tarea : un puntero a la tarea para la que se solicita información;
nombre : puntero a una cadena de 8 caracteres para el nombre de la tarea; incluye un área para caracteres nulos;
task_status : puntero a una variable que recibe el valor del estado de la tarea actual;
cuentas_programadas : puntero a una variable que recibe el valor del contador, cuántas veces se ha agregado la tarea al planificador;
prioridad : un puntero a una variable para obtener la prioridad de la tarea;
preferencia - un puntero a una variable para las opciones de desplazar una tarea de menor prioridad;
NU_PREEMPT indica que la tarea se puede desplazar y
NU_NO_PREEMPT indica que la tarea no se puede desplazar;
time_slice : puntero a una variable para obtener el valor del tiempo de la tarea cuántica; un valor de 0 indica que la cuantificación del tiempo no es posible para esta tarea;
stack_base : puntero a una variable para obtener la dirección de la pila de tareas;
stack_size : puntero a una variable para obtener el tamaño de la pila de tareas;
minimum_stack : un puntero a una variable para obtener el número mínimo de bytes que quedan en la pila.
Valor de retorno:
NU_SUCCESS - llamada completada con éxito;
NU_INVALID_TASK : puntero no válido a la tarea.
Llamar información de tareas en Nucleus SEEsta llamada admite la funcionalidad principal de la API Nucleus PLUS.
Prototipo de llamada de servicio:
STATUS NUSE_Task_Information (tarea NUSE_TASK, U8 * tarea_estado, U16 * cuenta_programada, ADDR * stack_base, U16 * stack_size);Parámetros:
tarea : índice de la tarea sobre la que se solicita información;
task_status : un puntero a una variable
U8 que recibe el valor actual del estado de la tarea (si el estado de espera de la tarea no está disponible, no se devuelve nada);
cuentas_programadas : puntero a la variable
U16 , que recibe el valor del contador del número de tareas agregadas al planificador (si el contador de tareas programadas está deshabilitado, no se devuelve nada);
stack_base : un puntero a una variable
ADDR que recibe la dirección de la pila de tareas (si se usa el planificador RTC, no se devuelve nada);
stack_size es un puntero a una variable
U16 que obtiene el tamaño de la pila de tareas (si se usa el planificador RTC, no se devuelve nada).
Valor de retorno:
NUSE_SUCCESS - llamada completada con éxito;
NUSE_INVALID_TASK : índice de tarea no válido;
NUSE_INVALID_POINTER : los parámetros del puntero (uno o más) son incorrectos.
Implemente la recuperación de información de tareas en Nucleus SEImplementar esta llamada a la API es bastante simple:

La función devuelve el estado de la tarea, teniendo en cuenta varias opciones de configuración.
Obtener el número de tareas
Esta llamada de servicio devuelve información sobre la cantidad de tareas configuradas en la aplicación. Mientras que en Nucleus RTOS este número puede cambiar, y el valor de retorno representará el número actual de tareas en este momento, en Nucleus SE el valor de retorno se establece durante el ensamblaje y ya no cambia.
El desafío de obtener la cantidad de tareas en Nucleus RTOSPrototipo de llamada de servicio:
NU_SIGNED NU_Established_Tasks (VOID);Parámetros:
Están ausentes
Valor de retorno:
El número de tareas instaladas (creadas y no eliminadas) en la aplicación.
El desafío de obtener el número de tareas en Nucleus SEEsta llamada a la API admite la funcionalidad principal de la API Nucleus PLUS.
Prototipo de llamada de servicio:
U8 NUSE_Task_Count (nulo);Parámetros:
Están ausentes
Valor de retorno:
El número de tareas configuradas en la aplicación.
ImplementaciónLa implementación de esta llamada a la API es bastante simple: se
devuelve el valor de la directiva
#define NUSE_TASK_NUMBER .
El siguiente artículo analizará las estructuras de datos en Nucleus SE relacionadas con tareas y algunas llamadas API estándar que no son compatibles con Nucleus SE.
Sobre el autor: Colin Walls ha trabajado en la industria electrónica durante más de treinta años, dedicando la mayor parte de su tiempo al firmware. Ahora es ingeniero de firmware en Mentor Embedded (una división de Mentor Graphics). Colin Walls a menudo habla en conferencias y seminarios, autor de numerosos artículos técnicos y dos libros sobre firmware. Vive en el Reino Unido.
Blog profesional
de Colin , correo electrónico: colin_walls@mentor.com.
Acerca de la traducción: esta serie de artículos parecía interesante porque, a pesar de los enfoques desactualizados descritos en algunos lugares, el autor, en un lenguaje muy comprensible, presenta al lector poco capacitado las características del sistema operativo en tiempo real. Yo mismo pertenezco al equipo de creadores del
RTOS ruso , que
pretendemos liberar , y espero que el ciclo sea útil para los desarrolladores novatos.