Bird
Raised Fist0
FreeRTOSprogramming~20 mins

Why tasks are the building blocks in FreeRTOS - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
FreeRTOS Task Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Why are tasks considered the building blocks in FreeRTOS?

In FreeRTOS, tasks are fundamental. Which statement best explains why tasks are called the building blocks?

ATasks are only used to initialize hardware and then stop running.
BTasks are used only for memory management and do not affect program flow.
CTasks replace interrupts and handle all hardware events directly.
DTasks allow multiple functions to run independently and share CPU time, enabling multitasking.
Attempts:
2 left
💡 Hint

Think about how FreeRTOS manages different jobs at the same time.

❓ Predict Output
intermediate
2:00remaining
What is the output of this FreeRTOS task creation code?

Consider the following FreeRTOS code snippet. What will be the output on the console?

FreeRTOS
void vTaskCode( void * pvParameters ) {
    for( ;; ) {
        printf("Task running\n");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

int main(void) {
    xTaskCreate(vTaskCode, "Task1", 1000, NULL, 1, NULL);
    vTaskStartScheduler();
    return 0;
}
ATask running (printed every second indefinitely)
BProgram crashes because vTaskDelay is called outside a task
CCompilation error due to missing task handle
DNo output because the task is never started
Attempts:
2 left
💡 Hint

Remember that vTaskStartScheduler starts the tasks created.

🔧 Debug
advanced
2:00remaining
Identify the error in this FreeRTOS task creation snippet

Look at the code below. What error will occur when running this code?

FreeRTOS
void vTaskCode( void * pvParameters ) {
    for( ;; ) {
        // Task code here
    }
}

int main(void) {
    BaseType_t result = xTaskCreate(vTaskCode, "Task1", 1000, NULL, 1, NULL);
    if (result != pdPASS) {
        printf("Task creation failed\n");
    }
    // Missing vTaskStartScheduler call
    return 0;
}
AThe program will run normally and print "Task creation failed"
BCompilation error due to missing task function prototype
CThe task will never run because vTaskStartScheduler is not called
DRuntime error because task stack size is too small
Attempts:
2 left
💡 Hint

Think about what starts the FreeRTOS scheduler.

📝 Syntax
advanced
2:00remaining
Which option correctly creates a FreeRTOS task?

Choose the code snippet that correctly creates a FreeRTOS task named "Task1" with priority 2.

AxTaskCreate(Task1Function, "Task1", 512, NULL, 2, NULL);
BxTaskCreate(Task1Function, Task1, 512, NULL, 2, NULL);
CxTaskCreate("Task1", Task1Function, 512, NULL, 2, NULL);
DxTaskCreate(Task1Function, "Task1", 512, NULL, "2", NULL);
Attempts:
2 left
💡 Hint

Check the order and types of parameters for xTaskCreate.

🚀 Application
expert
2:00remaining
How many tasks are running after this code executes?

Given the code below, how many tasks will be running after vTaskStartScheduler() is called?

FreeRTOS
void vTask1(void *pvParameters) { for(;;) {} }
void vTask2(void *pvParameters) { for(;;) {} }

int main(void) {
    xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL);
    xTaskCreate(vTask2, "Task2", 1000, NULL, 1, NULL);
    vTaskStartScheduler();
    return 0;
}
A1
B3
C2
D0
Attempts:
2 left
💡 Hint

Don't forget the idle task created automatically by the scheduler.

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