mirror of
https://github.com/esphome/esphome.git
synced 2025-07-29 06:36:45 +00:00
Reduce RAM usage for scheduled tasks (#9180)
This commit is contained in:
parent
04f592ba6d
commit
7fc5bfd787
@ -319,13 +319,17 @@ bool HOT Scheduler::cancel_item_(Component *component, const std::string &name,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
uint64_t Scheduler::millis_() {
|
uint64_t Scheduler::millis_() {
|
||||||
|
// Get the current 32-bit millis value
|
||||||
const uint32_t now = millis();
|
const uint32_t now = millis();
|
||||||
|
// Check for rollover by comparing with last value
|
||||||
if (now < this->last_millis_) {
|
if (now < this->last_millis_) {
|
||||||
|
// Detected rollover (happens every ~49.7 days)
|
||||||
this->millis_major_++;
|
this->millis_major_++;
|
||||||
ESP_LOGD(TAG, "Incrementing scheduler major at %" PRIu64 "ms",
|
ESP_LOGD(TAG, "Incrementing scheduler major at %" PRIu64 "ms",
|
||||||
now + (static_cast<uint64_t>(this->millis_major_) << 32));
|
now + (static_cast<uint64_t>(this->millis_major_) << 32));
|
||||||
}
|
}
|
||||||
this->last_millis_ = now;
|
this->last_millis_ = now;
|
||||||
|
// Combine major (high 32 bits) and now (low 32 bits) into 64-bit time
|
||||||
return now + (static_cast<uint64_t>(this->millis_major_) << 32);
|
return now + (static_cast<uint64_t>(this->millis_major_) << 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,12 +29,16 @@ class Scheduler {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct SchedulerItem {
|
struct SchedulerItem {
|
||||||
|
// Ordered by size to minimize padding
|
||||||
Component *component;
|
Component *component;
|
||||||
std::string name;
|
|
||||||
enum Type { TIMEOUT, INTERVAL } type;
|
|
||||||
uint32_t interval;
|
uint32_t interval;
|
||||||
|
// 64-bit time to handle millis() rollover. The scheduler combines the 32-bit millis()
|
||||||
|
// with a 16-bit rollover counter to create a 64-bit time that won't roll over for
|
||||||
|
// billions of years. This ensures correct scheduling even when devices run for months.
|
||||||
uint64_t next_execution_;
|
uint64_t next_execution_;
|
||||||
|
std::string name;
|
||||||
std::function<void()> callback;
|
std::function<void()> callback;
|
||||||
|
enum Type : uint8_t { TIMEOUT, INTERVAL } type;
|
||||||
bool remove;
|
bool remove;
|
||||||
|
|
||||||
static bool cmp(const std::unique_ptr<SchedulerItem> &a, const std::unique_ptr<SchedulerItem> &b);
|
static bool cmp(const std::unique_ptr<SchedulerItem> &a, const std::unique_ptr<SchedulerItem> &b);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user