jueves, 23 de julio de 2015

Semáforo con MQX KDS 3.0 SDK 1.2

Descripción del Programa

Este programa realiza la coordinación del encendido del LED RGB en sus colores rojo, verde y azul, utilizando los comandos _lwsem_create(), _lwsem_post() y _lwsem_wait().


Código


#include <stdio.h>
#include <mqx.h>
#include <bsp.h>

/* Task IDs */
/* Task IDs */
#define INIT_TASK  5
#define RED_TASK  6
#define GREEN_TASK  7
#define BLUE_TASK  8
#define t_out      100

LWSEM_STRUCT my_lwsem;

extern void init_task(uint32_t);
extern void red_task(uint32_t);
extern void green_task(uint32_t);
extern void blue_task(uint32_t);

TD_STRUCT_PTR red_ptr, green_ptr, blue_ptr;

const TASK_TEMPLATE_STRUCT  MQX_template_list[] =
{
   /* Task Index,   Function,   Stack,   Priority, Name,     Attributes,          Param, Time Slice */
    { INIT_TASK,    init_task,  1000,    8,        "init",   MQX_AUTO_START_TASK, 0,     0 },
    { RED_TASK,     red_task,   1000,    9,        "red",    MQX_AUTO_START_TASK, 0,     0 },
    { GREEN_TASK,   green_task, 1000,    9,        "green",  MQX_AUTO_START_TASK, 0,     0 },
    { BLUE_TASK,    blue_task,  1000,    9,        "blue",   MQX_AUTO_START_TASK, 0,     0 },
    { 0 }
};

void init_task
   (
      uint32_t initial_data
   )
{
   _task_id red_task_id, green_task_id,blue_task_id;
   GPIO_DRV_Init(switchPins,ledPins);

   red_task_id = _task_create(0, RED_TASK, 0);
   if (red_task_id == MQX_NULL_TASK_ID) {
      printf ("\n Could not create red_task\n");
   }

   green_task_id = _task_create(0, GREEN_TASK, 0);
   if (green_task_id == MQX_NULL_TASK_ID) {
      printf ("\n Could not create green_task\n");
   }

   blue_task_id = _task_create(0, BLUE_TASK, 0);
   if (blue_task_id == MQX_NULL_TASK_ID) {
      printf ("\n Could not create blue_task\n");
   }

   _lwsem_create(&my_lwsem, 1);
   _task_abort(_task_get_id());

}

void red_task
   (
      uint32_t initial_data
   )
{
_mqx_uint result;

while(1){
result = _lwsem_wait(&my_lwsem);
printf("Rojo\n");
GPIO_DRV_ClearPinOutput(BOARD_GPIO_LED_RED);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_GREEN);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_BLUE);
_time_delay_ticks(t_out);
_lwsem_post(&my_lwsem);
}
}

void green_task
   (
      uint32_t initial_data
   )
{
_mqx_uint result;

while(1){
result = _lwsem_wait(&my_lwsem);
printf("Verde\n");
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_RED);
GPIO_DRV_ClearPinOutput(BOARD_GPIO_LED_GREEN);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_BLUE);
_time_delay_ticks(t_out);
_lwsem_post(&my_lwsem);
}
}

void blue_task
   (
      uint32_t initial_data
   )
{
_mqx_uint result;

while(1){
result = _lwsem_wait(&my_lwsem);
printf("Azul\n");
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_RED);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_GREEN);
GPIO_DRV_ClearPinOutput(BOARD_GPIO_LED_BLUE);
_time_delay_ticks(t_out);
   _lwsem_post(&my_lwsem);
}
}

/* EOF */


Referencias

Para mayor información sobre el uso de los SEMAFOROS, visita la página:

Essentials of MQX RTOS, Semaphores

Para conocer el curso completo de Essentials Course of MQX, visita la página:

No hay comentarios:

Publicar un comentario