Hello,
I am working on Digikey's Introduction to RTOS Series, and I'm currently on the Deadlock and Starvation video. I'm using Arduino IDE 2.3.2 and the ESP32-DevKit V3.0 board. The espressif ESP32 library, which includes FreeRTOS instructions, has been installed. I went through all of the previous exercises without problems.
I've been trying to run many files from this video, but most of them don't seem to generate Serial outputs for me. For example, the following code (which came from here) produces no serial output for me.
/**
* ESP32 Deadlock Demo
*
* Demonstrate deadlock with 2 tasks.
*
* Date: February 8, 2021
* Author: Shawn Hymel
* License: 0BSD
*/
// You'll likely need this on vanilla FreeRTOS
//#include <semphr.h>
// Use only core 1 for demo purposes
#if CONFIG_FREERTOS_UNICORE
static const BaseType_t app_cpu = 0;
#else
static const BaseType_t app_cpu = 1;
#endif
// Globals
static SemaphoreHandle_t mutex_1;
static SemaphoreHandle_t mutex_2;
//*****************************************************************************
// Tasks
// Task A (high priority)
void doTaskA(void *parameters) {
// Loop forever
while (1) {
// Take mutex 1 (introduce wait to force deadlock)
xSemaphoreTake(mutex_1, portMAX_DELAY);
Serial.println("Task A took mutex 1");
vTaskDelay(1 / portTICK_PERIOD_MS);
// Take mutex 2
xSemaphoreTake(mutex_2, portMAX_DELAY);
Serial.println("Task A took mutex 2");
// Critical section protected by 2 mutexes
Serial.println("Task A doing some work");
vTaskDelay(500 / portTICK_PERIOD_MS);
// Give back mutexes
xSemaphoreGive(mutex_2);
xSemaphoreGive(mutex_1);
// Wait to let the other task execute
Serial.println("Task A going to sleep");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
// Task B (low priority)
void doTaskB(void *parameters) {
// Loop forever
while (1) {
// Take mutex 2 (introduce wait to force deadlock)
xSemaphoreTake(mutex_2, portMAX_DELAY);
Serial.println("Task B took mutex 2");
vTaskDelay(1 / portTICK_PERIOD_MS);
// Take mutex 1
xSemaphoreTake(mutex_1, portMAX_DELAY);
Serial.println("Task B took mutex 1");
// Critical section protected by 2 mutexes
Serial.println("Task B doing some work");
vTaskDelay(500 / portTICK_PERIOD_MS);
// Give back mutexes
xSemaphoreGive(mutex_1);
xSemaphoreGive(mutex_2);
// Wait to let the other task execute
Serial.println("Task A going to sleep");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
//*****************************************************************************
// Main (runs as its own task with priority 1 on core 1)
void setup() {
// Configure Serial
Serial.begin(115200);
// Wait a moment to start (so we don't miss Serial output)
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.println();
Serial.println("---FreeRTOS Deadlock Demo---");
// Create mutexes before starting tasks
mutex_1 = xSemaphoreCreateMutex();
mutex_2 = xSemaphoreCreateMutex();
// Start Task A (high priority)
xTaskCreatePinnedToCore(doTaskA,
"Task A",
1024,
NULL,
2,
NULL,
app_cpu);
// Start Task B (low priority)
xTaskCreatePinnedToCore(doTaskB,
"Task B",
1024,
NULL,
1,
NULL,
app_cpu);
// Delete "setup and loop" task
vTaskDelete(NULL);
}
void loop() {
// Execution should never get here
}
The expected output is
---FreeRTOS Deadlock Demo---
Task A took mutex 1
Task B took mutex 2
and then the code should stop there since the taken mutexes create a deadlock.
I'm currently using a Windows laptop for this, but I've also tried using a Mac to run the same code without getting output. Are there settings I should be aware of for the code to produce proper serial output?
Thank you for your help in advance.