I am using FRDM-KL25Z arm board from freescale and I have successfully Written LED blink program using code warrior IDE. I am also able to run all the sample program from freescale start up kit. Now I am writing A MQX Lite program to blink LED's using MQX tasks. I made three tasks One for Initialising and 2 other for blinkin the LEDs on the board using task. The task declaration in task_template_list.c is below
#define TASK_TEMPLATE_LIST_END {0, 0, 0, 0, 0, 0, 0}
/* MQX task template list */
const TASK_TEMPLATE_STRUCT MQX_template_list[] =
{
/* Task: InitTask */
{
/* Task number */ INITTASK_TASK,
/* Entry point */ (TASK_FPTR)InitTask,
/* Stack size */ INITTASK_TASK_STACK_SIZE,
/* Task priority */ 8U,
/* Task name */ "inittask",
/* Task attributes */ (MQX_AUTO_START_TASK),
/* Task parameter */ (uint32_t)(0)
},
/* Task: LEDTask */
{
/* Task number */ LEDTASK_TASK,
/* Entry point */ (TASK_FPTR)LEDTask,
/* Stack size */ LEDTASK_TASK_STACK_SIZE,
/* Task priority */ 10U,
/* Task name */ "ledtask",
/* Task attributes */ (0),
/* Task parameter */ (uint32_t)(0)
},
/* Task: GR_LED_ON */
{
/* Task number */ GR_LED_ON_TASK,
/* Entry point */ (TASK_FPTR)GR_LED_ON,
/* Stack size */ GR_LED_ON_TASK_STACK_SIZE,
/* Task priority */ 9U,
/* Task name */ "gr_led_on",
/* Task attributes */ (0),
/* Task parameter */ (uint32_t)(0)
},
TASK_TEMPLATE_LIST_END
};
Now in the mqx_tasks.c I have written a code like below
/* ###################################################################
** Filename : mqx_tasks.c
** Project : ProcessorExpert
** Processor : MKL25Z128VLK4
** Component : Events
** Version : Driver 01.00
** Compiler : GNU C Compiler
** Date/Time : 2013-05-27, 17:44, # CodeGen: 0
** Abstract :
** This is user's event module.
** Put your event handler code here.
** Settings :
** Contents :
** InitTask - void InitTask(uint32_t task_init_data);
**
** ###################################################################*/
/*!
** @file mqx_tasks.c
** @version 01.00
** @brief
** This is user's event module.
** Put your event handler code here.
*/
/*!
** @addtogroup mqx_tasks_module mqx_tasks module documentation
** @{
*/
/* MODULE mqx_tasks */
#include "Cpu.h"
#include "Events.h"
#include "mqx_tasks.h"
#ifdef __cplusplus
extern "C" {
#endif
/* User includes (#include below this line is not maintained by Processor Expert) */
#define RED_LED_LOC (1<<18)
#define GREEN_LED_LOC (1<<19)
#define BLUE_LED_LOC (1<<1)
#define RED_LED_OFF GPIOB_PSOR = RED_LED_LOC
#define RED_LED_ON GPIOB_PCOR = RED_LED_LOC
void Delay(int Ticks)
{
int i;
for(i=0;i<Ticks;i++)
{
}
}
/*
** ===================================================================
** Event : InitTask (module mqx_tasks)
**
** Component : Task1 [MQXLite_task]
** Description :
** MQX task routine. The routine is generated into mqx_tasks.c
** file.
** Parameters :
** NAME - DESCRIPTION
** task_init_data -
** Returns : Nothing
** ===================================================================
*/
void InitTask(uint32_t task_init_data)
{
//First order of business is to enable the Clocks to the ports!
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTD_MASK;
//Now, setup the port mux for GPIO! See Page 163 and 183 of KL25 Sub-Family Reference Manual, Rev. 3, September 2012
PORTB_PCR18 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
PORTB_PCR19 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
PORTD_PCR1 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
//Set the GPIO to outputs in the data direction register
//See Page 778 of KL25 Sub-Family Reference Manual, Rev. 3, September 2012
GPIOB_PDDR |= RED_LED_LOC | GREEN_LED_LOC;
GPIOD_PDDR |= BLUE_LED_LOC;
RED_LED_OFF;
/* _task_id task_id;
task_id=_task_create_at(0, LEDTASK_TASK, 0, LEDTask_task_stack, LEDTASK_TASK_STACK_SIZE);
if(task_id=MQX_NULL_TASK_ID){
printf("\n can not create led task");
}else{
printf("\n LED task created");
}
task_id=_task_create_at(0, GR_LED_ON_TASK, 0, GR_LED_ON_task_stack, GR_LED_ON_TASK_STACK_SIZE);
if(task_id=MQX_NULL_TASK_ID){
printf("\n can not create led task");
}else{
printf("\n LED task created");
}*/
_task_create_at(0, GR_LED_ON_TASK, 0, GR_LED_ON_task_stack, GR_LED_ON_TASK_STACK_SIZE);
_task_create_at(0, LEDTASK_TASK, 0, LEDTask_task_stack, LEDTASK_TASK_STACK_SIZE);
}
/*
** ===================================================================
** Event : LEDTask (module mqx_tasks)
**
** Component : Task2 [MQXLite_task]
** Description :
** MQX task routine. The routine is generated into mqx_tasks.c
** file.
** Parameters :
** NAME - DESCRIPTION
** task_init_data -
** Returns : Nothing
** ===================================================================
*/
void LEDTask(uint32_t task_init_data)
{
int value=0;
while(TRUE)
{
//The dedicated GPIO Set and clear registers make bit banging easier. Just write to the port what bits
//you want set or cleared. The or-ing / not-anding is done in *hardware*
//see pages 775 - 778 of KL25 Sub-Family Reference Manual, Rev. 3, September 2012
// RED_LED_OFF;
// Delay(1000000);
GPIOB_PSOR = GREEN_LED_LOC;
Delay(1000000);
GPIOD_PSOR = BLUE_LED_LOC;
Delay(1000000);
// RED_LED_ON;
// Delay(1000000);
GPIOB_PCOR = GREEN_LED_LOC;
Delay(1000000);
GPIOD_PCOR = BLUE_LED_LOC;
Delay(1000000);
value=value^1;
}
}
/*
** ===================================================================
** Event : GR_LED_ON (module mqx_tasks)
**
** Component : Task3 [MQXLite_task]
** Description :
** MQX task routine. The routine is generated into mqx_tasks.c
** file.
** Parameters :
** NAME - DESCRIPTION
** task_init_data -
** Returns : Nothing
** ===================================================================
*/
void GR_LED_ON(uint32_t task_init_data)
{
int value=0;
while(TRUE)
{
//The dedicated GPIO Set and clear registers make bit banging easier. Just write to the port what bits
//you want set or cleared. The or-ing / not-anding is done in *hardware*
//see pages 775 - 778 of KL25 Sub-Family Reference Manual, Rev. 3, September 2012
/* GPIOB_PSOR = GREEN_LED_LOC;
Delay(1000000);
GPIOD_PSOR = BLUE_LED_LOC;
Delay(1000000);*/
RED_LED_ON;
Delay(1000000);
/* GPIOB_PCOR = GREEN_LED_LOC;
Delay(1000000);
GPIOD_PCOR = BLUE_LED_LOC;
Delay(1000000);*/
RED_LED_OFF;
Delay(1000000);
value=value^1;
}
}
/* END mqx_tasks */
#ifdef __cplusplus
} /* extern "C" */
#endif
/*!
** @}
*/
/*
** ###################################################################
**
** This file was created by Processor Expert 10.2 [05.06]
** for the Freescale Kinetis series of microcontrollers.
**
** ###################################################################
*/
**
But when I debug the program I only blinks the LED of the higher priority and the other task is not working ..... Can anyone suggest me what mistake I am doing . Thanks**
You've made a fatal mistake with your Delay() function ! What you have written in Delay() is an active loop that consumes all the CPU, leaving no CPU time available for threads with lower priorities.
Please use _time_delay() (MQX API) instead of your Delay() function, then everything should be OK.