ESPHome 2026.1.0-dev
Loading...
Searching...
No Matches
core.cpp
Go to the documentation of this file.
1#ifdef USE_ESP32
2
4#include "esphome/core/hal.h"
6#include "preferences.h"
7#include <esp_clk_tree.h>
8#include <esp_cpu.h>
9#include <esp_idf_version.h>
10#include <esp_ota_ops.h>
11#include <esp_task_wdt.h>
12#include <esp_timer.h>
13#include <freertos/FreeRTOS.h>
14#include <freertos/task.h>
15
16void setup(); // NOLINT(readability-redundant-declaration)
17void loop(); // NOLINT(readability-redundant-declaration)
18
19// Weak stub for initArduino - overridden when the Arduino component is present
20extern "C" __attribute__((weak)) void initArduino() {}
21
22namespace esphome {
23
24void IRAM_ATTR HOT yield() { vPortYield(); }
25uint32_t IRAM_ATTR HOT millis() { return (uint32_t) (esp_timer_get_time() / 1000ULL); }
26void IRAM_ATTR HOT delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); }
27uint32_t IRAM_ATTR HOT micros() { return (uint32_t) esp_timer_get_time(); }
28void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); }
30 esp_restart();
31 // restart() doesn't always end execution
32 while (true) { // NOLINT(clang-diagnostic-unreachable-code)
33 yield();
34 }
35}
36
37void arch_init() {
38 // Enable the task watchdog only on the loop task (from which we're currently running)
39 esp_task_wdt_add(nullptr);
40
41 // Handle OTA rollback: mark partition valid immediately unless USE_OTA_ROLLBACK is enabled,
42 // in which case safe_mode will mark it valid after confirming successful boot.
43#ifndef USE_OTA_ROLLBACK
44 esp_ota_mark_app_valid_cancel_rollback();
45#endif
46}
47void IRAM_ATTR HOT arch_feed_wdt() { esp_task_wdt_reset(); }
48
49uint8_t progmem_read_byte(const uint8_t *addr) { return *addr; }
50uint32_t arch_get_cpu_cycle_count() { return esp_cpu_get_cycle_count(); }
52 uint32_t freq = 0;
53 esp_clk_tree_src_get_freq_hz(SOC_MOD_CLK_CPU, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &freq);
54 return freq;
55}
56
57TaskHandle_t loop_task_handle = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
58
59void loop_task(void *pv_params) {
60 setup();
61 while (true) {
62 loop();
63 }
64}
65
66extern "C" void app_main() {
67 initArduino();
69#if CONFIG_FREERTOS_UNICORE
70 xTaskCreate(loop_task, "loopTask", ESPHOME_LOOP_TASK_STACK_SIZE, nullptr, 1, &loop_task_handle);
71#else
72 xTaskCreatePinnedToCore(loop_task, "loopTask", ESPHOME_LOOP_TASK_STACK_SIZE, nullptr, 1, &loop_task_handle, 1);
73#endif
74}
75
76} // namespace esphome
77
78#endif // USE_ESP32
struct @65::@66 __attribute__
void setup()
void loop()
void setup_preferences()
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint32_t arch_get_cpu_cycle_count()
Definition core.cpp:50
void arch_init()
Definition core.cpp:37
void app_main()
Definition core.cpp:66
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
Definition core.cpp:28
void IRAM_ATTR HOT yield()
Definition core.cpp:24
uint32_t arch_get_cpu_freq_hz()
Definition core.cpp:51
TaskHandle_t loop_task_handle
Definition core.cpp:57
uint32_t IRAM_ATTR HOT micros()
Definition core.cpp:27
void IRAM_ATTR HOT delay_microseconds_safe(uint32_t us)
Delay for the given amount of microseconds, possibly yielding to other processes during the wait.
Definition helpers.cpp:736
void IRAM_ATTR HOT arch_feed_wdt()
Definition core.cpp:47
void IRAM_ATTR HOT delay(uint32_t ms)
Definition core.cpp:26
uint32_t IRAM_ATTR HOT millis()
Definition core.cpp:25
void arch_restart()
Definition core.cpp:29
void loop_task(void *pv_params)
Definition core.cpp:59
uint8_t progmem_read_byte(const uint8_t *addr)
Definition core.cpp:49