Notas del master
Índice
Entornos inteligentes
Técnicas de diseño de sistemas empotrados basados en microcontroladores
Microkernels
- Introducción a los RTOS
Hoy he aprendido que estas lineas de codigo son:
vTaskdelay(0.1*Tick);
- Introducción a FreeRTOS
- EC21
Modificación de la tarea
GreenLedBlink
.//Esta tarea parpadea el led verde static void GreenLedBlink( void *pvParameters ) { volatile int ArrayDeLaMuerte[200]; int i; //La tarea debe tener un bucle infinito... for( ;; ){ for(i=0; i < 200; i++){ ArrayDeLaMuerte[i]=0; } vTaskDelay(0.1*configTICK_RATE_HZ); GPIO_toggleOutputOnPin(LED2_PORT, LED2_PIN); } }
- ¿Qué ocurre?
- El programa se queda bloqueado y no funciona. Hay un overflow de la pila de memoria producido por la tarea
Greenledblink
. - si pausamos la depuración ¿Dónde se encuentra el programa? ¿A qué es debido esto?
- Se encuetra en la función
vApplicationstackoverflowhook
,para ser exactos en elfor(;;)
. Se debe a que la memoria asignada con macroconfigMINIMAL_STACK_SIZE
es muy baja, lo cual se traduce en un desbordamiento, el valor mínimo para que funcione correctamente es de 121 palabras. - ¿Qué ocurre si desactivo el chequeo de desbordamiento de pila en FreeRTOS (cambiando configCHECKFORSTACKOVERFLOWa 0 en “FreeRTOSConfig.h”?
- El programa se ejectua, pero funciona de forma irregular. El tarea que realiza el blink en el led verde se ejecuta, aparentemente, correctamente, de igual forma con el led rojo, tanto la interrupción del botón como el timer de 8 segundos. Aunque ha dejado de funcionar la comuniciación por el puerto serie. Leyendo el código me da la impresión de que es algo relacionado con la prioridad de las tareas y la forma en la que se lanzan en el main.
- ¿Y si con el chequeo de pila desactivado, modifico el orden en el que se crean las tareas en la función main() y pongo por ejemplo el siguiente orden, qué ocurre?
Modificación del código:
//L22.a Descomentar lo que sigue para crear una tarea nueva... Cambiar el if (xTaskCreate( prvSerialTask, "Ser", 100, NULL, tskIDLE_PRIORITY+1, NULL )!=pdPASS){ while (1); } if (xTaskCreate( RedLedBlink, "RBli", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL )!=pdPASS){ while (1); } /* luego creamos las tareas */ if (xTaskCreate( GreenLedBlink, "GBli", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL )!=pdPASS){ while (1); }
Con la modificación se ejecuta dos veces la tarea "Ser" por lo que recibo dos mensajes por serie y un par de parpadeos del led verde. El rojo no llega a ejecutarse y la interrupción del botón ha dejado de funcionar. Ha funcionado durante un tiempo hasta que el puntero del programa se ha desbordado y se ha ido a otras partes del código como tasks.c o list.c.
- EC23
Si pulsamos varias veces muy rápido el pulsador derecho, que ahora controla el led verde,
- ¿Cuántos parpadeos realiza?
- Como mínimo dos parpadeos si lo muy rápido.
- EC24
- ¿Qué ocurre si intentamos compilar cuando se utilizan semáforos contadores con
configUSE_COUNTING_SEMAPHORES
puesto a 0? - Salta el error
Description Resource Path Location Type unresolved symbol xQueueCreateCountingSemaphore...
- ¿Qué ocurre si intentamos compilar cuando se utilizan semáforos contadores con
- EC25
- ¿Qué ocurre ahora (una vez cambiado el semáforo a contador) al pulsar repetidamente el botón?
- Con el cambio realizado el led parpadea el número de veces que he pulsado el botón. Aunque hay algunos matices que aclarar. Por ejemplo: Puede parpadear más de 15 veces ya que si vemos el semáforo como un buffer, este se vacia conforme se ejecuta la tarea y si continuamos pulsando se incrementará. He hecho la prueba con una cuenta máxima de 3 y he pulsado 10 veces el botón, solo se ha iluminado 6, quiere decir que he generado 4 interrupciones cuando el buffer estaba lleno.
- EC26
- ¿Cuáles son los parámetros de la función xSemaphoreCreateCounting?
- Tiene dos parámetros
uxMaxCount
yuxInitialCount
. El primero es el valor máximo que puede alcanzar, cuando lo consigue no se llena más. El segundo parámetro precarga un valor al crear el semáforo. - ¿Qué ocurre si ponemos el segundo parámetro a 3?
- Es como si se hubieran generado 3 pulsaciones de botón así que se ilumina 3 veces el led.
- EC27
Modifica el código anterior de forma que el led rojo realice un parpadeo bien cuando se pulse el botón o bien cuando se hayan realizado 4 parpadeos del led verde (es decir, 4 iteraciones del bucle de la tarea del led verde).
- EC28
- EC29
- EC21
- Mecanismos de IPC en FreeRTOS
- Proyectos y aplicaciones