Automaticke pouziti ICACHE_RAM_ATTR a IRAM_ATTR na zaklade verze Core.

This commit is contained in:
Pavel Brychta 2022-02-23 08:37:44 +01:00
parent 919f7ef218
commit db3c9fa429
3 changed files with 39 additions and 13 deletions

View File

@ -28,12 +28,17 @@ License along with NeoPixel. If not, see
#include <Arduino.h> #include <Arduino.h>
#if defined(ARDUINO_ARCH_ESP8266) #if defined(ARDUINO_ARCH_ESP8266)
#include <eagle_soc.h> # include <eagle_soc.h>
# if (ARDUINO_ESP8266_MAJOR < 3)
# define INRAM ICACHE_RAM_ATTR
# else
# define INRAM IRAM_ATTR
# endif
#endif #endif
// ESP32 doesn't define ICACHE_RAM_ATTR // ESP32 doesn't define ICACHE_RAM_ATTR
#ifndef ICACHE_RAM_ATTR #ifndef INRAM
#define ICACHE_RAM_ATTR IRAM_ATTR # define INRAM IRAM_ATTR
#endif #endif
inline uint32_t _getCycleCount() inline uint32_t _getCycleCount()
@ -53,7 +58,7 @@ inline uint32_t _getCycleCount()
# define CYCLES_800 (F_CPU / 900000) // 1.25us per bit # define CYCLES_800 (F_CPU / 900000) // 1.25us per bit
#endif #endif
void ICACHE_RAM_ATTR send_pixels_800(uint8_t* pixels, size_t count, uint8_t pin) void INRAM send_pixels_800(uint8_t* pixels, size_t count, uint8_t pin)
{ {
const uint32_t pinRegister = _BV(pin); const uint32_t pinRegister = _BV(pin);
uint8_t mask; uint8_t mask;

View File

@ -11,11 +11,17 @@
# define T0H 14 // 0 bit high time # define T0H 14 // 0 bit high time
# define T1H 52 // 1 bit high time # define T1H 52 // 1 bit high time
# define TL 52 // low time for either bit # define TL 52 // low time for either bit
# define INRAM IRAM_ATTR
#endif #endif
#if defined(ARDUINO_ARCH_ESP8266) #if defined(ARDUINO_ARCH_ESP8266)
// due to linker overriding the ICACHE_RAM_ATTR for cpp files, these methods are // due to linker overriding the ICACHE_RAM_ATTR for cpp files, these methods are
// moved into a C file so the attribute will be applied correctly // moved into a C file so the attribute will be applied correctly
extern "C" void ICACHE_RAM_ATTR send_pixels_800(uint8_t* pixel, size_t count, uint8_t pin); #if (ARDUINO_ESP8266_MAJOR < 3)
# define INRAM ICACHE_RAM_ATTR
#else
# define INRAM IRAM_ATTR
#endif
extern "C" void INRAM send_pixels_800(uint8_t* pixel, size_t count, uint8_t pin);
#endif #endif
// TODO: Proverit ESP32 s https://github.com/adafruit/Adafruit_NeoPixel/blob/master/esp.c // TODO: Proverit ESP32 s https://github.com/adafruit/Adafruit_NeoPixel/blob/master/esp.c
// ... a s https://github.com/Freenove/Freenove_WS2812_Lib_for_ESP32 // ... a s https://github.com/Freenove/Freenove_WS2812_Lib_for_ESP32
@ -30,12 +36,18 @@ static const uint16_t LB[] PROGMEM = {
0x12d , 0x12a , 0x126 , 0x123 , 0x11f , 0x11c , 0x11a , 0x117 , 0x115 , 0x112 , 0x110 , 0x10e , 0x10c , 0x10b , 0x109 , 0x108 , 0x107 , 0x105 , 0x104 , 0x203 , 0x102 , 0x201 , 0x2900 0x12d , 0x12a , 0x126 , 0x123 , 0x11f , 0x11c , 0x11a , 0x117 , 0x115 , 0x112 , 0x110 , 0x10e , 0x10c , 0x10b , 0x109 , 0x108 , 0x107 , 0x105 , 0x104 , 0x203 , 0x102 , 0x201 , 0x2900
}; };
static void ICACHE_RAM_ATTR ledTrampoline(wsLED *ptr) static void INRAM ledTrampoline(wsLED *ptr)
{ {
ptr->rtLed(); ptr->rtLed();
} }
inline bool wsLED::canShow(void)
{
return (micros() - _endtime) >= 70L;
}
void wsLED::show(void) void wsLED::show(void)
{ {
uint8_t color[3]; uint8_t color[3];
@ -45,6 +57,8 @@ void wsLED::show(void)
uint16_t c = (uint16_t)_color[i] * (1 + (uint16_t)_scale); uint16_t c = (uint16_t)_color[i] * (1 + (uint16_t)_scale);
color[i] = (uint8_t)(c >> 8); color[i] = (uint8_t)(c >> 8);
} }
while (!canShow())
__asm__ volatile ("nop");
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
uint32_t bits_to_send = ((uint32_t)color[0] << 16) | ((uint32_t)color[1] << 8) | (uint32_t)color[2]; uint32_t bits_to_send = ((uint32_t)color[0] << 16) | ((uint32_t)color[1] << 8) | (uint32_t)color[2];
uint32_t mask = 1 << (BITS_PER_LED_CMD - 1); uint32_t mask = 1 << (BITS_PER_LED_CMD - 1);
@ -61,16 +75,21 @@ void wsLED::show(void)
send_pixels_800(color, 1, _pin); send_pixels_800(color, 1, _pin);
interrupts(); interrupts();
#endif #endif
_endtime = micros();
} }
wsLED::wsLED(int pin, int order) : _pin(pin), _order(order), _ledState(LED_STOP) wsLED::wsLED(int pin, int order)
{ : _pin(pin)
} , _order(order)
, _ledState(LED_STOP)
{}
wsLED::wsLED(void) : _pin(NOT_A_PIN), _order(RGB), _ledState(LED_STOP) wsLED::wsLED(void)
{ : _pin(NOT_A_PIN)
} , _order(RGB)
, _ledState(LED_STOP)
{}
void wsLED::begin(int pin) void wsLED::begin(int pin)
{ {
@ -118,7 +137,7 @@ void wsLED::setColor(LEDRGB color)
_color[_order & 7] = color.b; _color[_order & 7] = color.b;
} }
void ICACHE_RAM_ATTR wsLED::rtLed(void) void INRAM wsLED::rtLed(void)
{ {
uint32_t timing; uint32_t timing;

View File

@ -148,9 +148,11 @@ protected:
rmt_item32_t led_data_buffer[LED_BUFFER_ITEMS]; rmt_item32_t led_data_buffer[LED_BUFFER_ITEMS];
SemaphoreHandle_t _mutex; SemaphoreHandle_t _mutex;
#endif #endif
uint32_t _endtime;
void show(void); void show(void);
void setColor(LEDRGB color); void setColor(LEDRGB color);
bool canShow(void);
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
portMUX_TYPE _mux = portMUX_INITIALIZER_UNLOCKED; portMUX_TYPE _mux = portMUX_INITIALIZER_UNLOCKED;
#endif #endif