mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Reduce RAM usage for scheduled tasks (#9180)
This commit is contained in:
		| @@ -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); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user