I have a very generic cpp code in ESP IDF to be used for a multi rate task program on ESP32 S3.
The code has a base rate of 1 ms and rate1 of 10 ms.
The code builds with no error. However, the board keeps rebooting with the following error:
----------------------------------------------------------------------------------------------
assert failed: xTaskDelayUntil tasks.c:1477 (( xTimeIncrement > 0U ))
Backtrace: 0x40375c92:0x3fcee8f0 0x40379c2d:0x3fcee910 0x4037f0cd:0x3fcee930 0x4037bdde:0x3fceea50 0x42007ac3:0x3fceea70 0x4037c655:0x3fceeaa0
0x40375c92: panic_abort at C:/Espressif/frameworks/esp-idf-v5.0.1/components/esp_system/panic.c:423
0x40379c2d: esp_system_abort at C:/Espressif/frameworks/esp-idf-v5.0.1/components/esp_system/esp_system.c:153
0x4037f0cd: __assert_func at C:/Espressif/frameworks/esp-idf-v5.0.1/components/newlib/assert.c:78
0x4037bdde: xTaskDelayUntil at C:/Espressif/frameworks/esp-idf-v5.0.1/components/freertos/FreeRTOS-Kernel/tasks.c:1477 (discriminator 1)
0x42007ac3: tBaseRate(void*) at C:/Espressif/frameworks/esp-idf-v5.0.1/workspace/Test_TaskDelay/main/main.cpp:43
0x4037c655: vPortTaskWrapper at C:/Espressif/frameworks/esp-idf-v5.0.1/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:154
ELF file SHA256: f70501ea97913d03
Rebooting...
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x3 (RTC_SW_SYS_RST),boot:0xb (SPI_FAST_FLASH_BOOT)
Saved PC:0x403789f2
0x403789f2: esp_cpu_wait_for_intr at C:/Espressif/frameworks/esp-idf-v5.0.1/components/esp_hw_support/cpu.c:110
------------------------------------------------------------------------------------------------------------------------------------------
I also noticed if I change the base rate to 10 ms and rate1 also 10 ms, it runs with no issue. For some reason my board does not like 1 ms rate the way I have set up the tasking.
I know for a fact that this code has no issue even with 1 ms base rate if its flashed and built on the board properly. (I have a package that generates the same code code and flashes it into the board automatically ( I can not see the process of make and build) and the board works fine. So I am wondering if it is something about menuconfig or similar.
I really appreciate any help on this. Here is the full code:
Code: Select all
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/timers.h"
#ifndef STACK_SIZE
#define STACK_SIZE 10240
#endif
TaskHandle_t FreeRTOSTIDs[2];
SemaphoreHandle_t rtTaskSemaphoreList[2];
void tRate1(void *pvParameters)
{
while (1) {
xSemaphoreTake(rtTaskSemaphoreList[1], portMAX_DELAY);
/* Set model inputs associated to subrate here */
/* Step the model for sample time for tid */
/* Get model outputs here */
/* Write model outputs associated to subrate here */
}
}
void tBaseRate(void *pvParameters)
{
const TickType_t vPeriodicTaskPreiod = 1/portTICK_PERIOD_MS;
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
/* For debuging the base rate semaphore release. Ignore */
static int taskCounter[2] = { 0, 0};
int i;
while (1) {
/* Set model base rate here: */
vTaskDelayUntil(&xLastWakeTime, vPeriodicTaskPreiod);
for (i = 1; i < 2; i++) {
if (taskCounter[i] == 0) {
xSemaphoreGive(rtTaskSemaphoreList[i]);
}
}
taskCounter[1]++;
if (taskCounter[1] == 10) {
taskCounter[1]= 0;
}
/* Set model inputs associated with base rate here */
/* Step the model for base rate */
/* Get model outputs here */
}
vSemaphoreDelete(rtTaskSemaphoreList[1]);
vTaskDelete(FreeRTOSTIDs[1]);
/* Disable rt_OneStep() here */
/* Terminate model */
/* Delete the base-rate task */
vTaskDelete(FreeRTOSTIDs[0]);
}
extern "C" void app_main(void)
{
/* Initialize model */
/**
* base_priority variable is used for assigning periodic task priority.
* Note that, for periodic tasks, Priority property in Simulink blocks
* has no effects on task execution order. Fastest rate blocks (smaller
* block's sample time) always have higher priority.
**/
UBaseType_t BaseRateTaskPriority = 1;
rtTaskSemaphoreList[1] = xSemaphoreCreateBinary();
xTaskCreate(tRate1, "tRate1", STACK_SIZE, NULL, 0, &FreeRTOSTIDs[1]);
xTaskCreate(tBaseRate, "tBaseRate", STACK_SIZE, NULL, BaseRateTaskPriority, &FreeRTOSTIDs[0]);
}
here