mirror of
https://github.com/esphome/esphome.git
synced 2026-05-26 03:07:04 +08:00
[host] Move HAL bodies into components/host/hal.cpp + inline trivial dispatches (#16115)
CI / Create common environment (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check import esphome.__main__ time (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.11) (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.14) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.11) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.13) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.14) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.11) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.14) (push) Has been cancelled
CI / Determine which jobs to run (push) Has been cancelled
CI / Run integration tests (${{ matrix.bucket.name }}) (push) Has been cancelled
CI / Run C++ unit tests (push) Has been cancelled
CI / Run CodSpeed benchmarks (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Run script/clang-tidy for ZEPHYR (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Test components batch (${{ matrix.components }}) (push) Has been cancelled
CI / pre-commit.ci lite (push) Has been cancelled
CI / Build target branch for memory impact (push) Has been cancelled
CI / Build PR branch for memory impact (push) Has been cancelled
CI / Comment memory impact (push) Has been cancelled
CI / CI Status (push) Has been cancelled
CI / Create common environment (push) Has been cancelled
CI / Check pylint (push) Has been cancelled
CI / Run script/ci-custom (push) Has been cancelled
CI / Check import esphome.__main__ time (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.11) (push) Has been cancelled
CI / Run pytest (macOS-latest, 3.14) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.11) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.13) (push) Has been cancelled
CI / Run pytest (ubuntu-latest, 3.14) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.11) (push) Has been cancelled
CI / Run pytest (windows-latest, 3.14) (push) Has been cancelled
CI / Determine which jobs to run (push) Has been cancelled
CI / Run integration tests (${{ matrix.bucket.name }}) (push) Has been cancelled
CI / Run C++ unit tests (push) Has been cancelled
CI / Run CodSpeed benchmarks (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 IDF (push) Has been cancelled
CI / Run script/clang-tidy for ESP8266 (push) Has been cancelled
CI / Run script/clang-tidy for ZEPHYR (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 1/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 2/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 3/4 (push) Has been cancelled
CI / Run script/clang-tidy for ESP32 Arduino 4/4 (push) Has been cancelled
CI / Test components batch (${{ matrix.components }}) (push) Has been cancelled
CI / pre-commit.ci lite (push) Has been cancelled
CI / Build target branch for memory impact (push) Has been cancelled
CI / Build PR branch for memory impact (push) Has been cancelled
CI / Comment memory impact (push) Has been cancelled
CI / CI Status (push) Has been cancelled
This commit is contained in:
@@ -1,74 +1,16 @@
|
|||||||
#ifdef USE_HOST
|
#ifdef USE_HOST
|
||||||
|
|
||||||
#include "esphome/core/application.h"
|
#include "esphome/core/application.h"
|
||||||
#include "esphome/core/hal.h"
|
|
||||||
#include "esphome/core/helpers.h"
|
|
||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <sched.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <cstdlib>
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
volatile sig_atomic_t s_signal_received = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
volatile sig_atomic_t s_signal_received = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
void signal_handler(int signal) { s_signal_received = signal; }
|
void signal_handler(int signal) { s_signal_received = signal; }
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace esphome {
|
// HAL functions live in hal.cpp.
|
||||||
|
|
||||||
void HOT yield() { ::sched_yield(); }
|
|
||||||
uint32_t IRAM_ATTR HOT millis() {
|
|
||||||
struct timespec spec;
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &spec);
|
|
||||||
return static_cast<uint32_t>(spec.tv_sec * 1000ULL + spec.tv_nsec / 1000000);
|
|
||||||
}
|
|
||||||
uint64_t millis_64() {
|
|
||||||
struct timespec spec;
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &spec);
|
|
||||||
return static_cast<uint64_t>(spec.tv_sec) * 1000ULL + static_cast<uint64_t>(spec.tv_nsec) / 1000000ULL;
|
|
||||||
}
|
|
||||||
void HOT delay(uint32_t ms) {
|
|
||||||
struct timespec ts;
|
|
||||||
ts.tv_sec = ms / 1000;
|
|
||||||
ts.tv_nsec = (ms % 1000) * 1000000;
|
|
||||||
int res;
|
|
||||||
do {
|
|
||||||
res = nanosleep(&ts, &ts);
|
|
||||||
} while (res != 0 && errno == EINTR);
|
|
||||||
}
|
|
||||||
uint32_t IRAM_ATTR HOT micros() {
|
|
||||||
struct timespec spec;
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &spec);
|
|
||||||
return static_cast<uint32_t>(spec.tv_sec * 1000000ULL + spec.tv_nsec / 1000);
|
|
||||||
}
|
|
||||||
void IRAM_ATTR HOT delayMicroseconds(uint32_t us) {
|
|
||||||
struct timespec ts;
|
|
||||||
ts.tv_sec = us / 1000000U;
|
|
||||||
ts.tv_nsec = (us % 1000000U) * 1000U;
|
|
||||||
int res;
|
|
||||||
do {
|
|
||||||
res = nanosleep(&ts, &ts);
|
|
||||||
} while (res != 0 && errno == EINTR);
|
|
||||||
}
|
|
||||||
void arch_restart() { exit(0); }
|
|
||||||
void arch_init() {
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
void HOT arch_feed_wdt() {
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t arch_get_cpu_cycle_count() {
|
|
||||||
struct timespec spec;
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &spec);
|
|
||||||
time_t seconds = spec.tv_sec;
|
|
||||||
uint32_t us = spec.tv_nsec;
|
|
||||||
return ((uint32_t) seconds) * 1000000000U + us;
|
|
||||||
}
|
|
||||||
uint32_t arch_get_cpu_freq_hz() { return 1000000000U; }
|
|
||||||
|
|
||||||
} // namespace esphome
|
|
||||||
|
|
||||||
void setup();
|
void setup();
|
||||||
void loop();
|
void loop();
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
#ifdef USE_HOST
|
||||||
|
|
||||||
|
#include "esphome/core/hal.h"
|
||||||
|
#include "esphome/core/helpers.h"
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <cerrno>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
// Empty host namespace block to satisfy ci-custom's lint_namespace check.
|
||||||
|
// HAL functions live in namespace esphome (root) — they are not part of the
|
||||||
|
// host component's API.
|
||||||
|
namespace esphome::host {} // namespace esphome::host
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
|
||||||
|
// yield(), arch_init(), arch_feed_wdt(), arch_get_cpu_freq_hz() inlined in
|
||||||
|
// core/hal/hal_host.h.
|
||||||
|
|
||||||
|
uint32_t IRAM_ATTR HOT millis() {
|
||||||
|
struct timespec spec;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &spec);
|
||||||
|
return static_cast<uint32_t>(spec.tv_sec * 1000ULL + spec.tv_nsec / 1000000);
|
||||||
|
}
|
||||||
|
uint64_t millis_64() {
|
||||||
|
struct timespec spec;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &spec);
|
||||||
|
return static_cast<uint64_t>(spec.tv_sec) * 1000ULL + static_cast<uint64_t>(spec.tv_nsec) / 1000000ULL;
|
||||||
|
}
|
||||||
|
void HOT delay(uint32_t ms) {
|
||||||
|
struct timespec ts;
|
||||||
|
ts.tv_sec = ms / 1000;
|
||||||
|
ts.tv_nsec = (ms % 1000) * 1000000;
|
||||||
|
int res;
|
||||||
|
do {
|
||||||
|
res = nanosleep(&ts, &ts);
|
||||||
|
} while (res != 0 && errno == EINTR);
|
||||||
|
}
|
||||||
|
uint32_t IRAM_ATTR HOT micros() {
|
||||||
|
struct timespec spec;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &spec);
|
||||||
|
return static_cast<uint32_t>(spec.tv_sec * 1000000ULL + spec.tv_nsec / 1000);
|
||||||
|
}
|
||||||
|
void IRAM_ATTR HOT delayMicroseconds(uint32_t us) {
|
||||||
|
struct timespec ts;
|
||||||
|
ts.tv_sec = us / 1000000U;
|
||||||
|
ts.tv_nsec = (us % 1000000U) * 1000U;
|
||||||
|
int res;
|
||||||
|
do {
|
||||||
|
res = nanosleep(&ts, &ts);
|
||||||
|
} while (res != 0 && errno == EINTR);
|
||||||
|
}
|
||||||
|
void arch_restart() { exit(0); }
|
||||||
|
|
||||||
|
uint32_t arch_get_cpu_cycle_count() {
|
||||||
|
struct timespec spec;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &spec);
|
||||||
|
time_t seconds = spec.tv_sec;
|
||||||
|
uint32_t ns = static_cast<uint32_t>(spec.tv_nsec);
|
||||||
|
return static_cast<uint32_t>(seconds) * 1000000000U + ns;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace esphome
|
||||||
|
|
||||||
|
#endif // USE_HOST
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#ifdef USE_HOST
|
#ifdef USE_HOST
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <sched.h>
|
||||||
|
|
||||||
#define IRAM_ATTR
|
#define IRAM_ATTR
|
||||||
#define PROGMEM
|
#define PROGMEM
|
||||||
@@ -13,17 +14,18 @@ namespace esphome {
|
|||||||
/// Host has no ISR concept.
|
/// Host has no ISR concept.
|
||||||
__attribute__((always_inline)) inline bool in_isr_context() { return false; }
|
__attribute__((always_inline)) inline bool in_isr_context() { return false; }
|
||||||
|
|
||||||
void yield();
|
__attribute__((always_inline)) inline void yield() { ::sched_yield(); }
|
||||||
|
|
||||||
void delay(uint32_t ms);
|
void delay(uint32_t ms);
|
||||||
uint32_t micros();
|
uint32_t micros();
|
||||||
uint32_t millis();
|
uint32_t millis();
|
||||||
uint64_t millis_64();
|
uint64_t millis_64();
|
||||||
|
|
||||||
void delayMicroseconds(uint32_t us); // NOLINT(readability-identifier-naming)
|
void delayMicroseconds(uint32_t us); // NOLINT(readability-identifier-naming)
|
||||||
void arch_feed_wdt();
|
|
||||||
uint32_t arch_get_cpu_cycle_count();
|
uint32_t arch_get_cpu_cycle_count();
|
||||||
void arch_init();
|
|
||||||
uint32_t arch_get_cpu_freq_hz();
|
__attribute__((always_inline)) inline void arch_init() {}
|
||||||
|
__attribute__((always_inline)) inline void arch_feed_wdt() {}
|
||||||
|
__attribute__((always_inline)) inline uint32_t arch_get_cpu_freq_hz() { return 1000000000U; }
|
||||||
|
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user