#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_task_wdt.h" #include "Arduino.h" #if (ARDUINO_USB_CDC_ON_BOOT|ARDUINO_USB_MSC_ON_BOOT|ARDUINO_USB_DFU_ON_BOOT) && !ARDUINO_USB_MODE #include "USB.h" #if ARDUINO_USB_MSC_ON_BOOT #include "FirmwareMSC.h" #endif #endif #ifndef ARDUINO_LOOP_STACK_SIZE #ifndef CONFIG_ARDUINO_LOOP_STACK_SIZE #define ARDUINO_LOOP_STACK_SIZE 8192 #else #define ARDUINO_LOOP_STACK_SIZE CONFIG_ARDUINO_LOOP_STACK_SIZE #endif #endif TaskHandle_t loopTaskHandle = NULL; #if CONFIG_AUTOSTART_ARDUINO #if CONFIG_FREERTOS_UNICORE void yieldIfNecessary(void){ static uint64_t lastYield = 0; uint64_t now = millis(); if((now - lastYield) > 2000) { lastYield = now; vTaskDelay(5); //delay 1 RTOS tick } } #endif bool loopTaskWDTEnabled; __attribute__((weak)) size_t getArduinoLoopTaskStackSize(void) { return ARDUINO_LOOP_STACK_SIZE; } void loopTask(void *pvParameters) { setup(); for(;;) { #if CONFIG_FREERTOS_UNICORE yieldIfNecessary(); #endif if(loopTaskWDTEnabled){ esp_task_wdt_reset(); } loop(); if (serialEventRun) serialEventRun(); } } extern "C" void app_main() { #if ARDUINO_USB_CDC_ON_BOOT && !ARDUINO_USB_MODE Serial.begin(); #endif #if ARDUINO_USB_MSC_ON_BOOT && !ARDUINO_USB_MODE MSC_Update.begin(); #endif #if ARDUINO_USB_DFU_ON_BOOT && !ARDUINO_USB_MODE USB.enableDFU(); #endif #if ARDUINO_USB_ON_BOOT && !ARDUINO_USB_MODE USB.begin(); #endif loopTaskWDTEnabled = false; initArduino(); xTaskCreateUniversal(loopTask, "loopTask", getArduinoLoopTaskStackSize(), NULL, 1, &loopTaskHandle, ARDUINO_RUNNING_CORE); } #endif