FreeRTOS para el conmutador SAM Cortex-M3 de Atmel entre tareas

0

Estoy jugando con FreeRTOS en un mcu Cortex-M3 de Atmels y me preguntaba cómo puedo pasar de una tarea actual a otra independientemente de su prioridad. Para ser exactos: envío datos a uno de los puertos USART de mcu. He habilitado la interrupción de RX y escribí el UART_Handler apropiado. El manejador llena un buffer uno por un byte. Cuando el controlador lee '\ n', quiero llamar a la tarea que imprime este búfer. ¿Cómo puedo hacer esto? Lo intenté con taskYIELD pero nada funcionó. ¿Alguna pista con esto?

EDITAR: Olvidé mencionar que soy nuevo en el desarrollo de RTOS. No lo he probado antes.

    
pregunta MrBit

2 respuestas

2

Envíe una señal a la tarea o notificación , como llamadas de FreeRTOS en ese momento.

Pero, lo más probable es que hayas escrito alguna capa de interrupción ahora. Probablemente utilice colas o buffers para enviar los datos a la tarea. Su tarea también puede esperar a que la cola contenga datos.
El código de la cola contendrá los indicadores necesarios para establecer la tarea pendiente.

El rendimiento es otra cosa en el contexto del sistema operativo. Básicamente significa que la tarea finaliza su tiempo dado de CPU pronto. Así que la siguiente tarea está cambiada. Pero esto podría muy bien ser la misma tarea si el diseño es deficiente.

    
respondido por el Jeroen3
2

Tienes que pensar en el diseño de tu tarea. Usted dijo que tiene una tarea que se imprime y aparentemente tiene otra tarea de la que está llamando rendimiento. ¿Cuál es el propósito de esta otra tarea? ¿Cuándo debe ejecutarse cada tarea y cuándo debe cada bloque? ¿Cuáles deberían ser las prioridades relativas de las tareas?

Tomaré una conjetura basada en casi ninguna información. La tarea de impresión debe ejecutarse solo cuando hay algo que imprimir, de lo contrario, debería bloquearse. La otra tarea debe ejecutarse el resto del tiempo, tal vez sea la tarea inactiva o en segundo plano. En este caso, la tarea en segundo plano debe ser de baja prioridad y la tarea de impresión debe tener una prioridad más alta para que la tarea de impresión pueda anticiparse a la tarea en segundo plano cuando haya algo que imprimir.

Use algo como un semáforo o una cola para indicar cuándo se debe ejecutar la tarea de impresión. Si ya ha creado su propio mecanismo de búfer de caracteres y el controlador de interrupciones está comprobando '\ n', entonces un semáforo es probablemente bueno. La tarea de impresión debe obtener / pend / block en el semáforo. El controlador de interrupciones debe establecer / publicar el semáforo cuando se recibe '\ n'. Luego, la tarea de impresión se ejecutará e imprimirá el búfer.

Otro diseño podría ser que cuando el controlador de interrupciones obtiene el '\ n' envía todo el búfer a la tarea de impresión a través de un buzón o cola. Esto desacoplaría la tarea de impresión de tener que leer / manipular la estructura de datos de su búfer.

Otro diseño podría ser que el controlador de interrupciones publique todos los caracteres en una cola y la tarea de impresión se reduzca en la cola y almacene los caracteres en búfer hasta que se reciba un '\ n'. Esto desacoplaría el controlador de interrupciones del trabajo de interpretación de caracteres como '\ n'.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas