ESP32-S3 tasks not working

User avatar
stevenbennett
Posts: 34
Joined: Sun May 19, 2024 7:30 am
Location: High Bentham, UK

Re: ESP32-S3 tasks not working

Postby stevenbennett » Fri Aug 30, 2024 1:18 pm

After more testing it looks like the library EasyNeoPixels.h somehow interferes with the normal operation of creating and running RTOS tasks, could it have a bug? However the library Adafruit_NeoPixel.h does pretty much the same things but works perfectly with multiple RTOS tasks - who would have guessed!
Last edited by stevenbennett on Fri Aug 30, 2024 2:01 pm, edited 1 time in total.

chegewara
Posts: 2376
Joined: Wed Jun 14, 2017 9:00 pm

Re: ESP32-S3 tasks not working

Postby chegewara » Fri Aug 30, 2024 2:44 pm

There is nothing wrong with library. You probably need to read logs more carefully.
FreeRTOS: FreeRTOS Task "flash_task" should not return, Aborting now!
Some other logs says it crashed due to stack smashing, which mean the stack is too small or you are trying to create local too big local array.

User avatar
stevenbennett
Posts: 34
Joined: Sun May 19, 2024 7:30 am
Location: High Bentham, UK

Re: ESP32-S3 tasks not working

Postby stevenbennett » Fri Aug 30, 2024 4:02 pm

OK thanks I will do next time now that I have found out how to enable logs in Visual Studio. I did try various stack sizes from 2000 to 10000, which should be enough, but without success. Not sure what you mean by array but it's a very simple sketch, just flashes a single Neo Pixel.

chegewara
Posts: 2376
Joined: Wed Jun 14, 2017 9:00 pm

Re: ESP32-S3 tasks not working

Postby chegewara » Fri Aug 30, 2024 4:07 pm

stevenbennett wrote:
Fri Aug 30, 2024 4:02 pm
OK thanks I will do next time now that I have found out how to enable logs in Visual Studio. I did try various stack sizes from 2000 to 10000, which should be enough, but without success. Not sure what you mean by array but it's a very simple sketch, just flashes a single Neo Pixel.
couple tips:
- if you want to use printf, sprintf, serial logs etc in task code then min stack is 3.5-4k
- big arrays allocate with malloc, or as static arrays or just use global variables
- its better to start with bigger stack, just not too big, 10k may be too much, but +/-6k is good starting point

User avatar
Basalt
Posts: 28
Joined: Wed Aug 16, 2023 7:59 pm

Re: ESP32-S3 tasks not working

Postby Basalt » Fri Aug 30, 2024 6:32 pm

chegewara wrote:
Fri Aug 30, 2024 2:44 pm
There is nothing wrong with library. You probably need to read logs more carefully.
FreeRTOS: FreeRTOS Task "flash_task" should not return, Aborting now!

You have and did show the log already, it said that flashTask() returned instead of looping forever.
And that does correspond to the code you posted (the while loop is missing):

Code: Select all

void flashTask(void *pvParameter)
{
digitalWrite(RGB_BUILTIN, HIGH); // Turn the RGB LED white
delay(1000);
digitalWrite(RGB_BUILTIN, LOW); // Turn the RGB LED off
delay(1000);
}
In later code you did fix the loop, so maybe it's not the root cause.
But it did cause some confusion anyway.

User avatar
stevenbennett
Posts: 34
Joined: Sun May 19, 2024 7:30 am
Location: High Bentham, UK

Re: ESP32-S3 tasks not working

Postby stevenbennett » Sat Aug 31, 2024 5:55 am

Sorry about the confusion I was trying different things to get tasks working and it made no difference to the symptoms of the problem. My objective was to get tasks working on an ESP32-S3 as I had had no problems with an ESP32. I wasn't interested in flashing NeoPixels particularly. So I wasn't that interested in finding out why the FastLED.h library did not work for me when the Adafruit_NeoPixel.h worked flawlessly out of the box - stuffing mushrooms came to mind. Anyway after some tinkering everything is working perfectly so for anyone wanting a template for tasks on an S3 and possibly flash a NeoPixel this is the final code:

/*
* This sketch uses two RTOS tasks to print to serial and flash the on-board NeoPixel
* Adafruit_NeoPixel Class Reference: https://adafruit.github.io/Adafruit_Neo ... pixel.html
* NOTE: On ESP32xx MCUs delay() calls vTaskDelay() and is therefore interchangeable,
* see: https://github.com/espressif/arduino-es ... #L202-L204
*/
#include <Adafruit_NeoPixel.h> // A library to control one, or more, NeoPixel LEDs

int PIN = 48; // The NeoPixel RGB LED is connected to pin 48 on the ESP32_S3_DevKitC_1 module, and is a WS2812B device, see: https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf
int DELAYVAL = 500; // Common delay value between colour changes
int count = 0; // A test value

Adafruit_NeoPixel pixels(
1, // Number of NeoPixel LEDs
PIN, // GPIO pin connected to NeoPixel
NEO_GRB + // Define type of NeoPixel, in this case RGB means RED, GREEN & BLUE, some are GRB. For pixels.Color NEO_RGB = (G,R,B) and NEO_GRB = (R,G,B) strangely! Probably only impacts strings of NeoPixels.
NEO_KHZ800 // Interface speed for NeoPixel device, usually 400 or 800
);

void setup() {

Serial.begin(115200);
pixels.begin(); // INITIALIZE NeoPixel object (REQUIRED)
xTaskCreate(printTask, "print_task", 5000, NULL, 1, NULL); // Create print_task
xTaskCreate(flashTask, "flash_task", 5000, NULL, 1, NULL); // Create flash_task
}

static void printTask(void *pvParameter)
{
while (1) {
Serial.print("printing = ");
Serial.print(count);
Serial.println();
vTaskDelay(15000 / portTICK_PERIOD_MS); // Delay for 15000mS
}
}

static void flashTask(void *pvParameter)
{
while (1) {
Serial.println("flashing");

pixels.clear(); // Set all pixel colours to 'off'
pixels.show(); // Send the updated pixel colours to the hardware.
vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay for 1000mS

// The first NeoPixel in a strand is #0, second is 1 et cetera
// pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255

pixels.setPixelColor(0, pixels.Color(10, 0, 0)); // Red using NEO_GRB
pixels.show(); // Send the updated pixel colours to the hardware.
delay(DELAYVAL); // Pause before next pass through loop

pixels.setPixelColor(0, pixels.Color(0, 10, 0)); // Green using NEO_GRB
pixels.show(); // Send the updated pixel colours to the hardware.
delay(DELAYVAL); // Pause before next pass through loop

pixels.setPixelColor(0, pixels.Color(0, 0, 10)); // Blue using NEO_GRB
pixels.show(); // Send the updated pixel colours to the hardware.
delay(DELAYVAL); // Pause before next pass through loop
}
}

void loop() {
count++; // This variable starts at 0 and increments every 1000mS
vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay for 1000mS
}

Who is online

Users browsing this forum: No registered users and 23 guests