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:

Mutex con MQX KDS 3.0 SDK 1.2

Descripción del programa

El programa mostrado a continuación, permite coordinar tres tareas, las cuales iluminan el LED RGB en Azul, Rojo y Verde, utilizando los comandos _mutex_init(), _mutex_lock() y  _mutex_unlock().



Código

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

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

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

MUTEX_STRUCT mutex;    //Sedeclaraunaestructuramutex

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,  700,    9,        "init",   MQX_AUTO_START_TASK, 0,     0 },
    { RED_TASK,     red_task,   700,    8,        "red",    0,                   0,     0 },
    { GREEN_TASK,   green_task, 700,    8,        "green",  0,                   0,     0 },
    { BLUE_TASK,    blue_task,  700,    8,        "blue",   0,                   0,     0 },
    { 0 }
};

void init_task
   (
      uint32_t initial_data
   )
{
int counter = 0;
   _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");
   }
   _mutex_init(&mutex, NULL);   //Seinicializamutexconlosvalorespredeterminados
   _task_abort(_task_get_id());  //Seterminalatarea

   while(1) {
       counter++;
     }
}

void red_task
   (
      uint32_t initial_data
   )
{
int counter = 0;

while(1){
printf("\n Rojo\n");
counter++;
_mutex_lock(&mutex);                                  //Sebloquea el recurso
GPIO_DRV_ClearPinOutput(BOARD_GPIO_LED_RED);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_GREEN);
GPIO_DRV_SetPinOutput(BOARD_GPIO_LED_BLUE);
_time_delay_ticks(100);
_mutex_unlock(&mutex);
}
}

void green_task
   (
      uint32_t initial_data
   )
{
int counter = 0;

//_task_block();

while(1){
counter++;
   _mutex_lock(&mutex);
printf("\n 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(100);
_mutex_unlock(&mutex);
}
}

void blue_task
   (
      uint32_t initial_data
   )
{
int counter = 0;

//_task_block();

while(1){
counter++;
_mutex_lock(&mutex);
printf("\n 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(100);
   _mutex_unlock(&mutex);
}
}
/* EOF */


Referencias


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


jueves, 16 de julio de 2015

Eventos con MQX KDS 3.0 SDK 1.2

Descripción del Programa


El programa demuestra el uso de eventos para coordinar tres tareas que iluminan el LED RGB en rojo, verde y azul, mediante los comandos _lwevent_wait_for()_lwevent_set().

Código


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

/* Task IDs */
/* Task IDs */
#define INIT_TASK  5
#define RED_TASK  6
#define GREEN_TASK  7
#define BLUE_TASK  8
#define ROJO 1
#define VERDE 2
#define AZUL 4
#define t_out      200

LWEVENT_STRUCT lwevent;

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 }
};

/*TASK*-----------------------------------------------------
*
* Task Name    : world_task
* Comments     :
*    This task creates rgb_task and then prints " World ".
*
*END*-----------------------------------------------------*/

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");
   }

   int counter = 0;
   _lwevent_create(&lwevent,LWEVENT_AUTO_CLEAR);  //Poneencero a los bits delevento
   _lwevent_set(&lwevent,ROJO);                    //activa el bit ROJO
   _task_abort(_task_get_id());

   while(1) {
       counter++;
   /* Write your code here ... */
     }

}


/*TASK*-----------------------------------------------------
*
* Task Name    : rgb_task
* Comments     :
*    This task prints " Hello".
*
*END*-----------------------------------------------------*/

void red_task
   (
      uint32_t initial_data
   )
{
int counter = 0;
_lwevent_wait_for(&lwevent,ROJO,FALSE,NULL);
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);
_lwevent_set(&lwevent,VERDE);
}

void green_task
   (
      uint32_t initial_data
   )
{
int counter = 0;
_lwevent_wait_for(&lwevent,VERDE,FALSE,NULL);
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);
_lwevent_set(&lwevent,AZUL);
}

void blue_task
   (
      uint32_t initial_data
   )
{
int counter = 0;
_lwevent_wait_for(&lwevent,AZUL,FALSE,NULL);
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);
_lwevent_set(&lwevent,ROJO);
}


/* EOF */

Referencias

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

Essentials of MQX RTOS, LWEvents

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

Essentials Course of MQX

Tareas con MQX KDS 3.0 SDK 1.2

Descripción del Programa

El objetivo es alternar los colores del LED RGB a rojo, verde y azul, mediante tres tareas y utilizando los comandos _task_ready() y _task_block().


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

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,  700,    9,        "init",   MQX_AUTO_START_TASK, 0,     0 },
    { RED_TASK,     red_task,   700,    8,        "red",    0,                   0,     0 },
    { GREEN_TASK,   green_task, 700,    8,        "green",  0,                   0,     0 },
    { BLUE_TASK,    blue_task,  700,    8,        "blue",   0,                   0,     0 },
    { 0 }
};

/*TASK*-----------------------------------------------------
*
* Task Name    : world_task
* Comments     :
*    This task creates rgb_task and then prints " World ".
*
*END*-----------------------------------------------------*/

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");
   }
   _task_block();

}


/*TASK*-----------------------------------------------------
*
* Task Name    : rgb_task
* Comments     :
*    This task prints " Hello".
*
*END*-----------------------------------------------------*/

void red_task
   (
      uint32_t initial_data
   )
{
_task_id red_task_id;
red_task_id = _task_get_id();
red_ptr = _task_get_td(red_task_id);

while(1){
printf("\n Red\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(100);
_task_ready(green_ptr);
_task_block();
}
}

void green_task
   (
      uint32_t initial_data
   )
{
_task_id green_task_id;
green_task_id = _task_get_id();
green_ptr = _task_get_td(green_task_id);
_task_block();

while(1){
printf("\n Green\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(100);
_task_ready(blue_ptr);
_task_block();
}
}

void blue_task
   (
      uint32_t initial_data
   )
{
_task_id blue_task_id;
blue_task_id = _task_get_id();
blue_ptr = _task_get_td(blue_task_id);
_task_block();

while(1){
printf("\n Blue\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(100);
_task_ready(red_ptr);
_task_block();
}
}
/* EOF */


Referencias

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

Essentials of MQX RTOS, Task Management

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

Essentials Course of MQX