Amruta (talk) 13:43, 8 April 2015 (IST)


Intro

In last tutorial we saw the effect of vTaskDelay() function.

Now we will see how kernel does task switching depending upon the priorities.

If you are not familiar with what is task switching, check this.

Code

You can find more examples on task switching here.

/***************************************************************************************************
ExploreEmbedded
****************************************************************************************************
* File: main.c (FreeRTOS)
* Version: 15.0
* Author: ExploreEmbedded
* Website: http://www.exploreembedded.com/wiki
* Description: Program to demonstrate the task switching between the three tasks depending upon priorities
The libraries have been tested on ExploreEmbedded development boards. We strongly believe that the
library works on any of development boards for respective controllers. However, ExploreEmbedded
disclaims any kind of hardware failure resulting out of usage of libraries, directly or indirectly.
Files may be subject to change without prior notice. The revision history contains the information
related to updates.
GNU GENERAL PUBLIC LICENSE:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Errors and omissions should be reported to codelibraries@exploreembedded.com
**************************************************************************************************/
/* Scheduler include files. */
#include "FreeRtOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
#include "croutine.h"
#include "uart.h" // Explore Embedded UART library
xTaskHandle TaskHandle_1;
xTaskHandle TaskHandle_2;
xTaskHandle TaskHandle_3;
xTaskHandle TaskHandle_4;
xTaskHandle TaskHandle_5;
/* Local Tasks declaration */
static void MyTask1(void* pvParameters);
static void MyTask2(void* pvParameters);
static void MyTask3(void* pvParameters);
static void MyTask4(void* pvParameters);
static void MyTask5(void* pvParameters);
static void MyIdleTask(void* pvParameters);
#define LED_IdleTask 0x01u
#define LED_Task1 0x02u
#define LED_Task2 0x04u
#define LED_Task3 0x08u
#define LED_Task4 0x10u
#define LED_Task5 0x20u
#define LED_PORT LPC_GPIO2->FIOPIN
int main(void)
{
SystemInit(); /* Initialize the controller */
UART_Init(38400); /* Initialize the Uart module */
LPC_GPIO2->FIODIR = 0xffffffffu;
/* Create the 2 tasks with priorities 1 and 3. */
xTaskCreate( MyTask1, ( signed char * )"Task1", configMINIMAL_STACK_SIZE, NULL, 1, &TaskHandle_1);
xTaskCreate( MyTask3, ( signed char * )"Task3", configMINIMAL_STACK_SIZE, NULL, 3, &TaskHandle_3 );
xTaskCreate( MyIdleTask, ( signed char * )"IdleTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
UART_Printf("\n\rIn main function, invoking scheduler");
vTaskStartScheduler(); /* Start the schedular */
while(1);
}
static void MyTask1(void* pvParameters)
{
LED_PORT = LED_Task1; /* Led to indicate the execution of Task1*/
UART_Printf("\n\rIn Task1");
vTaskDelete(TaskHandle_1);
}
static void MyTask2(void* pvParameters)
{
LED_PORT = LED_Task2; /* Led to indicate the execution of Task2*/
UART_Printf("\n\rIn Task2 ");
vTaskDelete(TaskHandle_2);
}
static void MyTask3(void* pvParameters)
{
LED_PORT = LED_Task3; /* Led to indicate the execution of Task3*/
UART_Printf("\n\rTask3, creating new tasks 2");
/* Create two new tasks 2, 4 */
xTaskCreate( MyTask2, ( signed char * )"Task2", configMINIMAL_STACK_SIZE, NULL, 2, &TaskHandle_2);
UART_Printf("\n\rTask3, creating new tasks 4");
xTaskCreate( MyTask4, ( signed char * )"Task4", configMINIMAL_STACK_SIZE, NULL, 4, &TaskHandle_4);
LED_PORT = LED_Task3; /* Led to indicate the execution of Task3*/
UART_Printf("\n\rBack in Task3, Creating Task5");
xTaskCreate( MyTask5, ( signed char * )"Task5", configMINIMAL_STACK_SIZE, NULL, 5, &TaskHandle_5);
LED_PORT = LED_Task3; /* Led to indicate the execution of Task3*/
UART_Printf("\n\rBack in Task3, Exiting task3");
vTaskDelete(TaskHandle_3);
}
static void MyTask4(void* pvParameters)
{
LED_PORT = LED_Task4; /* Led to indicate the execution of Task4*/
UART_Printf("\n\rIn Task4");
vTaskDelete(TaskHandle_4);
}
static void MyTask5(void* pvParameters)
{
LED_PORT = LED_Task5; /* Led to indicate the execution of Task4*/
UART_Printf("\n\rIn Task5");
vTaskDelete(TaskHandle_5);
}
static void MyIdleTask(void* pvParameters)
{
while(1)
{
LED_PORT = LED_IdleTask; /* Led to indicate the execution of Idle Task*/
UART_Printf("\n\rIn idle state");
}
}

Output

Waveform

Waveform

Starting with FreeRTOS

Intro In this tutorial we will see how to setup FREE RTOS keil project for LPC1768 Overview Downloads FreeRTOS V7.2.0 Locating Files for your project...

1. Creating and using a task

Amruta (talk) 13:44, 8 April 2015 (IST) Intro This is our first tutorial with FreeRTOS so start with a simple example of how to create and use a task. Before going to this...

2. Understanding the working of scheduler

Intro In first tutorial we saw how to create and use a task. Now we will see how the scheduler works. As we know, scheduler always executes the highest priority task...

RTOS Basics : TASK

Amruta (talk) 13:41, 8 April 2015 (IST) Intro In RTOS implementation of a design, the program is divided into different independent functions what we call as a task. These functions...