ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
hal.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP8266
4
5#include <c_types.h>
6#include <core_esp8266_features.h>
7#include <coredecls.h>
8#include <cstdint>
9#include <pgmspace.h>
10
12
13#ifndef PROGMEM
14#define PROGMEM ICACHE_RODATA_ATTR
15#endif
16
17// Forward decls from Arduino's <Arduino.h> for the inline wrappers below.
18// NOLINTBEGIN(google-runtime-int,readability-identifier-naming,readability-redundant-declaration)
19extern "C" void yield(void);
20extern "C" void delay(unsigned long ms);
21extern "C" unsigned long micros(void);
22extern "C" unsigned long millis(void);
23// NOLINTEND(google-runtime-int,readability-identifier-naming,readability-redundant-declaration)
24
25// Forward decl from <user_interface.h> for arch_feed_wdt() inline below.
26// NOLINTNEXTLINE(readability-redundant-declaration)
27extern "C" void system_soft_wdt_feed(void);
28
29namespace esphome::esp8266 {}
30
31namespace esphome {
32
33// Forward decl from helpers.h so this header stays cheap.
34// NOLINTNEXTLINE(readability-redundant-declaration)
36
42__attribute__((always_inline)) inline bool in_isr_context() { return false; }
43
45__attribute__((always_inline)) inline bool is_main_loop_thread() { return can_yield(); }
46
47__attribute__((always_inline)) inline void yield() { ::yield(); }
48__attribute__((always_inline)) inline uint32_t micros() { return static_cast<uint32_t>(::micros()); }
49void delay(uint32_t ms);
51__attribute__((always_inline)) inline uint64_t millis_64() { return Millis64Impl::compute(millis()); }
52
53// ESP8266: pgm_read_* does aligned 32-bit flash reads on Harvard architecture.
54// Inline-forward to the platform macros so the wrappers themselves don't
55// occupy IRAM/flash on every call site.
56__attribute__((always_inline)) inline uint8_t progmem_read_byte(const uint8_t *addr) {
57 return pgm_read_byte(addr); // NOLINT
58}
59__attribute__((always_inline)) inline const char *progmem_read_ptr(const char *const *addr) {
60 return reinterpret_cast<const char *>(pgm_read_ptr(addr)); // NOLINT
61}
62__attribute__((always_inline)) inline uint16_t progmem_read_uint16(const uint16_t *addr) {
63 return pgm_read_word(addr); // NOLINT
64}
65// Bulk PROGMEM copy: routes to the SDK's aligned-flash `memcpy_P` so callers
66// don't have to drop to a byte-by-byte `progmem_read_byte` loop, which on
67// ESP8266 is ~4x as many flash accesses as the bulk path.
68__attribute__((always_inline)) inline void progmem_memcpy(void *dst, const void *src, size_t len) {
69 memcpy_P(dst, src, len); // NOLINT
70}
71
72// NOLINTNEXTLINE(readability-identifier-naming)
73__attribute__((always_inline)) inline void delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); }
74__attribute__((always_inline)) inline void arch_feed_wdt() { system_soft_wdt_feed(); }
75__attribute__((always_inline)) inline void arch_init() {}
76// esp_get_cycle_count() declared in <core_esp8266_features.h>; F_CPU is a
77// compiler-driven macro from the ESP8266 Arduino board defs (-DF_CPU=...).
78__attribute__((always_inline)) inline uint32_t arch_get_cpu_cycle_count() { return esp_get_cycle_count(); }
79__attribute__((always_inline)) inline uint32_t arch_get_cpu_freq_hz() { return F_CPU; }
80
81} // namespace esphome
82
83#endif // USE_ESP8266
struct @66::@67 __attribute__
Wake the main loop task from an ISR. ISR-safe.
Definition main_task.h:45
unsigned long millis(void)
void delay(unsigned long ms)
unsigned long micros(void)
void system_soft_wdt_feed(void)
void yield(void)
uint32_t arch_get_cpu_cycle_count()
Definition hal.cpp:71
void arch_init()
Definition hal.cpp:44
const char * progmem_read_ptr(const char *const *addr)
Definition hal.h:52
void progmem_memcpy(void *dst, const void *src, size_t len)
Definition hal.h:56
const void size_t len
Definition hal.h:68
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
Definition hal.cpp:48
uint32_t arch_get_cpu_freq_hz()
Definition hal.cpp:55
uint64_t millis_64()
Definition hal.cpp:29
uint32_t IRAM_ATTR HOT micros()
Definition hal.cpp:43
void delay_microseconds_safe(uint32_t us)
Delay for the given amount of microseconds, possibly yielding to other processes during the wait.
Definition helpers.cpp:889
void arch_feed_wdt()
Definition hal.cpp:58
uint16_t progmem_read_uint16(const uint16_t *addr)
Definition hal.h:53
const void * src
Definition hal.h:68
void HOT delay(uint32_t ms)
Definition hal.cpp:85
uint32_t IRAM_ATTR HOT millis()
Definition hal.cpp:25
uint8_t progmem_read_byte(const uint8_t *addr)
Definition hal.h:51
static void uint32_t