Bird
Raised Fist0
FreeRTOSprogramming~5 mins

Why tasks are the building blocks in FreeRTOS

Choose your learning style10 modes available
Introduction

Tasks let your program do many things at once. They help organize work into small, easy parts.

When you want your device to read sensors and control motors at the same time.
When you need to handle user input while also sending data over the network.
When your program must keep track of time and respond quickly to events.
When you want to separate different jobs so they don't block each other.
When you want your program to be easier to understand and fix.
Syntax
FreeRTOS
BaseType_t xTaskCreate(
  TaskFunction_t pvTaskCode,
  const char * const pcName,
  configSTACK_DEPTH_TYPE usStackDepth,
  void *pvParameters,
  UBaseType_t uxPriority,
  TaskHandle_t *pxCreatedTask
);

pvTaskCode is the function the task will run.

uxPriority sets how important the task is compared to others.

Examples
This creates a simple task that runs forever doing its job.
FreeRTOS
void Task1(void *pvParameters) {
  while(1) {
    // do something
  }
}

xTaskCreate(Task1, "Task One", 1000, NULL, 1, NULL);
This task blinks an LED every 500 milliseconds with higher priority.
FreeRTOS
void BlinkLED(void *pvParameters) {
  while(1) {
    // toggle LED
    vTaskDelay(500 / portTICK_PERIOD_MS);
  }
}

xTaskCreate(BlinkLED, "LED Blink", 500, NULL, 2, NULL);
Sample Program

This program creates two tasks that print messages at different speeds. It shows how tasks run independently.

FreeRTOS
#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>

void TaskA(void *pvParameters) {
  for(int i = 0; i < 3; i++) {
    printf("Task A running %d\n", i+1);
    vTaskDelay(1000 / portTICK_PERIOD_MS);
  }
  vTaskDelete(NULL);
}

void TaskB(void *pvParameters) {
  for(int i = 0; i < 3; i++) {
    printf("Task B running %d\n", i+1);
    vTaskDelay(500 / portTICK_PERIOD_MS);
  }
  vTaskDelete(NULL);
}

int main(void) {
  xTaskCreate(TaskA, "Task A", 1000, NULL, 1, NULL);
  xTaskCreate(TaskB, "Task B", 1000, NULL, 1, NULL);
  vTaskStartScheduler();
  return 0;
}
OutputSuccess
Important Notes

Each task has its own stack to keep data safe.

Tasks run one at a time but switch fast to look like they run together.

Use priorities to decide which task runs first.

Summary

Tasks break your program into small jobs that run independently.

They help your device do many things at once smoothly.

Creating tasks correctly is key to using FreeRTOS well.

Practice

(1/5)
1. Why are tasks considered the building blocks in FreeRTOS?
easy
A. Because tasks store data permanently in memory.
B. Because tasks allow the program to run multiple jobs independently and smoothly.
C. Because tasks handle hardware interrupts directly.
D. Because tasks compile the program faster.

Solution

  1. Step 1: Understand the role of tasks in FreeRTOS

    Tasks divide a program into small, independent jobs that can run at the same time.
  2. Step 2: Recognize the benefit of tasks

    This division helps the device perform many things smoothly without waiting for one job to finish.
  3. Final Answer:

    Because tasks allow the program to run multiple jobs independently and smoothly. -> Option B
  4. Quick Check:

    Tasks = Independent jobs running smoothly [OK]
Hint: Tasks run jobs independently for smooth multitasking [OK]
Common Mistakes:
  • Thinking tasks store data permanently
  • Confusing tasks with interrupt handlers
  • Believing tasks speed up compilation
2. Which of the following is the correct way to create a task in FreeRTOS?
easy
A. xTaskCreate(TaskFunction, "TaskName", StackSize, NULL, Priority, &TaskHandle);
B. CreateTask(TaskFunction, Priority, StackSize);
C. task_create(TaskFunction, StackSize, Priority);
D. StartTask(TaskFunction, "TaskName", Priority);

Solution

  1. Step 1: Recall the FreeRTOS task creation function

    The correct function to create a task is xTaskCreate with parameters: function, name, stack size, parameters, priority, and handle.
  2. Step 2: Compare options with correct syntax

    Only xTaskCreate(TaskFunction, "TaskName", StackSize, NULL, Priority, &TaskHandle); matches the exact syntax and parameter order of xTaskCreate.
  3. Final Answer:

    xTaskCreate(TaskFunction, "TaskName", StackSize, NULL, Priority, &TaskHandle); -> Option A
  4. Quick Check:

    Correct function and parameters = xTaskCreate(TaskFunction, "TaskName", StackSize, NULL, Priority, &TaskHandle); [OK]
Hint: Remember xTaskCreate with 6 parameters for tasks [OK]
Common Mistakes:
  • Using wrong function names like CreateTask
  • Mixing parameter order
  • Omitting task handle parameter
3. What will be the output of the following FreeRTOS task code snippet?
void Task1(void *pvParameters) {
  for (;;) {
    printf("Task1 running\n");
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

void Task2(void *pvParameters) {
  for (;;) {
    printf("Task2 running\n");
    vTaskDelay(pdMS_TO_TICKS(500));
  }
}
medium
A. Only Task1 will print because Task2 is blocked.
B. Both tasks print at the same time without delay.
C. Task2 will print once, then stop.
D. Task1 running every 1 second, Task2 running every 0.5 seconds, both printing alternately.

Solution

  1. Step 1: Analyze the delay times in each task

    Task1 delays 1000 ms (1 second) between prints; Task2 delays 500 ms (0.5 seconds).
  2. Step 2: Understand task scheduling

    Both tasks run independently and print their messages at their own intervals, so Task2 prints twice as often as Task1.
  3. Final Answer:

    Task1 running every 1 second, Task2 running every 0.5 seconds, both printing alternately. -> Option D
  4. Quick Check:

    Delays control print frequency = Task1 running every 1 second, Task2 running every 0.5 seconds, both printing alternately. [OK]
Hint: Check vTaskDelay times to predict print frequency [OK]
Common Mistakes:
  • Assuming tasks block each other
  • Thinking Task2 stops after one print
  • Ignoring delays causing print timing
4. Identify the error in this FreeRTOS task creation code:
void vTaskCode(void *pvParameters) {
  while(1) {
    // Task code
  }
}

int main() {
  xTaskCreate(vTaskCode, "Task", 1000, NULL, 1, NULL);
  vTaskStartScheduler();
  return 0;
}
medium
A. Task handle parameter is NULL, so task cannot be managed later.
B. The task function should not have an infinite loop.
C. Stack size is too large and causes memory overflow.
D. vTaskStartScheduler() is called before creating the task.

Solution

  1. Step 1: Check task creation parameters

    The last parameter is the task handle pointer; passing NULL means the task handle is not stored.
  2. Step 2: Understand implications of NULL task handle

    Without a task handle, the program cannot control or delete the task later, which is usually needed.
  3. Final Answer:

    Task handle parameter is NULL, so task cannot be managed later. -> Option A
  4. Quick Check:

    Task handle NULL means no task control [OK]
Hint: Always provide a task handle pointer to manage tasks [OK]
Common Mistakes:
  • Thinking infinite loops are wrong in tasks
  • Believing stack size is always too large
  • Assuming scheduler starts before task creation
5. You want to design a FreeRTOS application that reads sensor data, processes it, and updates a display. Why should you use separate tasks for each job?
hard
A. To avoid using queues or synchronization mechanisms.
B. To reduce the total memory used by combining jobs in one task.
C. To ensure each job runs independently and can be scheduled without blocking others.
D. To make the program run faster by running all jobs in a single loop.

Solution

  1. Step 1: Understand task separation benefits

    Separating jobs into tasks allows each to run independently and be scheduled by FreeRTOS efficiently.
  2. Step 2: Recognize multitasking advantages

    This prevents one job from blocking others, improving responsiveness and reliability.
  3. Final Answer:

    To ensure each job runs independently and can be scheduled without blocking others. -> Option C
  4. Quick Check:

    Separate tasks = independent, non-blocking jobs [OK]
Hint: Use separate tasks to avoid blocking and improve multitasking [OK]
Common Mistakes:
  • Thinking combining jobs saves memory always
  • Believing single loop is faster for multitasking
  • Ignoring need for synchronization with multiple tasks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard