FastLED 3.9.15
Loading...
Searching...
No Matches
fastled_progmem.h
Go to the documentation of this file.
1#pragma once
2
3#include "platforms/is_platform.h" // ok platform headers
4#include "fl/stl/int.h" // ok platform headers
5
6#if defined(__EMSCRIPTEN__) || defined(FASTLED_TESTING) || defined(FASTLED_STUB_IMPL)
7#include "platforms/null_progmem.h" // ok platform headers
8#elif defined(ESP8266)
9#include "platforms/esp/8266/progmem_esp8266.h" // ok platform headers
10#elif defined(FL_IS_STM32)
11#include "platforms/arm/stm32/progmem_stm32.h" // ok platform headers
12#else
13
14
15
16
29
30
31
32// This block is used for Doxygen documentation generation,
33// so that the Doxygen parser will be able to find the macros
34// included without a defined platform
35#ifdef FASTLED_DOXYGEN
36#define FASTLED_USE_PROGMEM 1
37#endif
38
43
44
45#if (FASTLED_USE_PROGMEM == 1) || defined(FASTLED_DOXYGEN)
46#ifndef FASTLED_INCLUDE_PGMSPACE
47#define FASTLED_INCLUDE_PGMSPACE 1
48#endif
49
50#if FASTLED_INCLUDE_PGMSPACE == 1
51// IWYU pragma: begin_keep
52#include <avr/pgmspace.h>
53// IWYU pragma: end_keep
54#endif
55
68#if defined(__IMXRT1062__)
69#define FL_PROGMEM
70#else
71#define FL_PROGMEM PROGMEM
72#endif
73
74
84
86#define FL_PGM_READ_BYTE_NEAR(x) (pgm_read_byte_near(x))
88#define FL_PGM_READ_WORD_NEAR(x) (pgm_read_word_near(x))
90#define FL_PGM_READ_DWORD_NEAR(x) (pgm_read_dword_near(x))
91
93
94// Aligned PROGMEM reads using AVR pgm_read_* functions.
95#define FL_PGM_READ_WORD_ALIGNED(addr) ((fl::u16)pgm_read_word_near(addr))
96#define FL_PGM_READ_DWORD_ALIGNED(addr) ((fl::u32)pgm_read_dword_near(addr))
97
98// Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734
99#if __GNUC__ < 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ < 6))
100#ifdef FASTLED_AVR
101#ifdef PROGMEM
102#undef PROGMEM
103#define PROGMEM __attribute__((section(".progmem.data")))
104#endif
105#endif
106#endif
107
108#else
109// If FASTLED_USE_PROGMEM is 0 or undefined,
110// we'll use regular memory (RAM) access.
111
112#include "platforms/null_progmem.h"
113
114#endif
115
136
137#ifndef FL_ALIGN_PROGMEM
138#if defined(FL_IS_ARM) || defined(ESP32) || defined(FASTLED_DOXYGEN)
139#define FL_ALIGN_PROGMEM(N) __attribute__ ((aligned (N)))
140#else
141#define FL_ALIGN_PROGMEM(N)
142#endif
143#endif
144
145#endif // platform progmem selection