FastLED 3.9.15
Loading...
Searching...
No Matches
delay.cpp.hpp
Go to the documentation of this file.
1
3
4// Define this before including headers to prevent duplicate specializations in delay_cycles_generic.h
5#define FL_DELAY_CPP_SPECIALIZATIONS
6
7#include "fl/stl/stdint.h"
8#include "fl/system/delay.h"
9#include "platforms/cycle_type.h"
12#include "fl/stl/chrono.h"
13
14// ============================================================================
15// Platform-specific includes
16// ============================================================================
17
18#include "platforms/delay.h"
19#include "platforms/time_platform.h"
20#include "platforms/coroutine_runtime.h"
21
22#if SKETCH_HAS_LARGE_MEMORY
23#include "fl/task/executor.h"
24#endif
25
26// Include stub time header for delay override check (only on stub platform)
27#if defined(FASTLED_STUB_IMPL) && (!defined(ARDUINO) || defined(FASTLED_USE_STUB_ARDUINO))
28// IWYU pragma: begin_keep
29#include "platforms/stub/time_stub.h" // ok platform headers
30// IWYU pragma: end_keep // ok platform headers (stub-specific delay override check)
31#endif
32
33namespace fl {
34
35// ============================================================================
36// Internal platform-specific delay helpers
37// ============================================================================
38// (Moved to fl::platforms::delay() - no longer needed here)
39
40// ============================================================================
41// Runtime delayNanoseconds implementations
42// ============================================================================
43
44void delayNanoseconds(fl::u32 ns) FL_NOEXCEPT {
45 delayNanoseconds_impl(ns);
46}
47
48void delayNanoseconds(fl::u32 ns, fl::u32 hz) FL_NOEXCEPT {
49 delayNanoseconds_impl(ns, hz);
50}
51
52// ============================================================================
53// delaycycles template specializations
54// ============================================================================
55// These pre-instantiated specializations optimize compilation time and code size
56// for common cycle counts.
57
58// Specializations for small negative and zero cycles
70
71// Specializations for small positive cycles
72// Note: These MUST NOT use FASTLED_FORCE_INLINE because with LTO enabled,
73// inline functions don't generate external symbols that the linker can resolve.
74// Using just inline or no storage class allows the linker to find these.
75template<> void delaycycles<1>() FL_NOEXCEPT { FL_NOP; }
76template<> void delaycycles<2>() FL_NOEXCEPT { FL_NOP2; }
77template<> void delaycycles<3>() FL_NOEXCEPT {
78 FL_NOP;
79 FL_NOP2;
80}
81template<> void delaycycles<4>() FL_NOEXCEPT {
82 FL_NOP2;
83 FL_NOP2;
84}
85template<> void delaycycles<5>() FL_NOEXCEPT {
86 FL_NOP2;
87 FL_NOP2;
88 FL_NOP;
89}
90
91template<> void delaycycles<6>() FL_NOEXCEPT {
92 FL_NOP2;
93 FL_NOP2;
94 FL_NOP2;
95}
96template<> void delaycycles<7>() FL_NOEXCEPT {
97 FL_NOP2;
98 FL_NOP2;
99 FL_NOP2;
100 FL_NOP;
101}
102template<> void delaycycles<8>() FL_NOEXCEPT {
103 FL_NOP2;
104 FL_NOP2;
105 FL_NOP2;
106 FL_NOP2;
107}
108template<> void delaycycles<9>() FL_NOEXCEPT {
109 FL_NOP2;
110 FL_NOP2;
111 FL_NOP2;
112 FL_NOP2;
113 FL_NOP;
114}
115template<> void delaycycles<10>() FL_NOEXCEPT {
116 FL_NOP2;
117 FL_NOP2;
118 FL_NOP2;
119 FL_NOP2;
120 FL_NOP2;
121}
122
123// Larger cycle counts (9-50) to ensure linker can resolve symbols
124// These are commonly generated by template instantiation
165
166// SPI timing optimizations removed: binary splitting now handles these efficiently
167// delaycycles<14>() → splits to delaycycles<7>() + delaycycles<7>()
168// delaycycles<23>() → splits to delaycycles<11>() + delaycycles<12>()
169// delaycycles<37>() → splits to delaycycles<18>() + delaycycles<19>()
170
171// ============================================================================
172// Millisecond and Microsecond delay implementations
173// ============================================================================
174
175namespace detail {
176
177void delay_impl(u32 ms, bool run_async) FL_NOEXCEPT {
178#if SKETCH_HAS_LARGE_MEMORY
179 // Check if delay override is active (for fast testing with stub platform)
180 // When override is active, skip async pumping and use platform delay directly
181#if defined(FASTLED_STUB_IMPL) && (!defined(ARDUINO) || defined(FASTLED_USE_STUB_ARDUINO))
182 if (isDelayOverrideActive()) {
183 fl::platforms::delay(ms); // Use platform override directly
184 return;
185 }
186#endif
187
188 if (run_async && ms > 0) {
189 task::run(ms * 1000);
190 } else {
191 fl::platforms::delay(ms); // Use platform layer for raw delay
192 }
193#else
194 (void)run_async; // Suppress unused parameter warning
195 fl::platforms::delay(ms); // Use platform layer for raw delay
196#endif
197}
198
199} // namespace detail
200
202 // Legacy function - no async pumping (backward compatibility)
203 detail::delay_impl(ms, false);
204}
205
207 // Direct pass-through to platform layer (no async pumping for microsecond precision)
208 fl::platforms::delayMicroseconds(us);
209}
210
211
212
213} // namespace fl
FastLED chrono implementation - duration types for time measurements.
Delay utilities for FastLED Includes nanosecond-precision delays, cycle counting, and microsecond del...
Task executor — runs registered task runners and manages the run loop.
void delay_impl(u32 ms, bool run_async)
Internal delay implementation used by the public fl::delay wrapper.
void run(fl::u32 microseconds, ExecFlags flags)
Run selected task subsystems.
void delaycycles< 14 >() FL_NOEXCEPT
void delaycycles< 37 >() FL_NOEXCEPT
void delaycycles< 31 >() FL_NOEXCEPT
void delaycycles< 40 >() FL_NOEXCEPT
void delaycycles< 50 >() FL_NOEXCEPT
FASTLED_FORCE_INLINE void delayNanoseconds() FL_NOEXCEPT
Delay for a compile-time constant number of nanoseconds.
Definition delay.h:47
void delaycycles< 2 >() FL_NOEXCEPT
Definition delay.cpp.hpp:76
void delaycycles< 30 >() FL_NOEXCEPT
void delaycycles< 35 >() FL_NOEXCEPT
void delaycycles< 44 >() FL_NOEXCEPT
void delaycycles< 26 >() FL_NOEXCEPT
void delaycycles< 43 >() FL_NOEXCEPT
void delaycycles< 25 >() FL_NOEXCEPT
void delaycycles< 27 >() FL_NOEXCEPT
void delaycycles< 8 >() FL_NOEXCEPT
void delaycycles< 29 >() FL_NOEXCEPT
void delaycycles< 19 >() FL_NOEXCEPT
void delaycycles< 4 >() FL_NOEXCEPT
Definition delay.cpp.hpp:81
void delaycycles< 9 >() FL_NOEXCEPT
void delaycycles< 33 >() FL_NOEXCEPT
FASTLED_FORCE_INLINE void delaycycles< 0 >() FL_NOEXCEPT
Definition delay.cpp.hpp:69
void delaycycles< 1 >() FL_NOEXCEPT
Definition delay.cpp.hpp:75
void delaycycles< 49 >() FL_NOEXCEPT
void delaycycles< 18 >() FL_NOEXCEPT
void delaycycles< 32 >() FL_NOEXCEPT
void delaycycles< 24 >() FL_NOEXCEPT
void delaycycles< 46 >() FL_NOEXCEPT
void delaycycles< 23 >() FL_NOEXCEPT
void delaycycles< 28 >() FL_NOEXCEPT
void delaycycles< 47 >() FL_NOEXCEPT
void delaycycles< 38 >() FL_NOEXCEPT
void delaycycles< 21 >() FL_NOEXCEPT
void delayMillis(u32 ms) FL_NOEXCEPT
Delay for a given number of milliseconds (legacy - no async pumping)
void delaycycles< 13 >() FL_NOEXCEPT
void delaycycles< 48 >() FL_NOEXCEPT
void delaycycles< 34 >() FL_NOEXCEPT
void delaycycles< 6 >() FL_NOEXCEPT
Definition delay.cpp.hpp:91
void delaycycles< 45 >() FL_NOEXCEPT
void delaycycles< 17 >() FL_NOEXCEPT
void delaycycles< 41 >() FL_NOEXCEPT
void delaycycles< 12 >() FL_NOEXCEPT
void delaycycles< 16 >() FL_NOEXCEPT
void delaycycles< 22 >() FL_NOEXCEPT
void delaycycles< 11 >() FL_NOEXCEPT
void delaycycles< 39 >() FL_NOEXCEPT
void delaycycles< 20 >() FL_NOEXCEPT
void delaycycles< 42 >() FL_NOEXCEPT
void delaycycles< 36 >() FL_NOEXCEPT
void delaycycles< 10 >() FL_NOEXCEPT
void delaycycles() FL_NOEXCEPT
Forward declaration of delaycycles template.
void delaycycles< 3 >() FL_NOEXCEPT
Definition delay.cpp.hpp:77
void delaycycles< 7 >() FL_NOEXCEPT
Definition delay.cpp.hpp:96
void delaycycles< 5 >() FL_NOEXCEPT
Definition delay.cpp.hpp:85
void delayMicroseconds(u32 us)
Delay for a given number of microseconds.
void delaycycles< 15 >() FL_NOEXCEPT
Base definition for an LED controller.
Definition crgb.hpp:179
#define FASTLED_FORCE_INLINE
#define FL_NOEXCEPT