mirror of
https://github.com/esphome/esphome.git
synced 2026-05-27 11:56:11 +08:00
[rp2040] Use SmallBufferWithHeapFallback for preferences (#13501)
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "esphome/core/helpers.h"
|
#include "esphome/core/helpers.h"
|
||||||
#include "esphome/core/log.h"
|
#include "esphome/core/log.h"
|
||||||
@@ -25,6 +24,9 @@ static bool s_flash_dirty = false; // NOLINT(cppcoreguidelines-avoid-no
|
|||||||
|
|
||||||
static const uint32_t RP2040_FLASH_STORAGE_SIZE = 512;
|
static const uint32_t RP2040_FLASH_STORAGE_SIZE = 512;
|
||||||
|
|
||||||
|
// Stack buffer size for preferences - covers virtually all real-world preferences without heap allocation
|
||||||
|
static constexpr size_t PREF_BUFFER_SIZE = 64;
|
||||||
|
|
||||||
extern "C" uint8_t _EEPROM_start;
|
extern "C" uint8_t _EEPROM_start;
|
||||||
|
|
||||||
template<class It> uint8_t calculate_crc(It first, It last, uint32_t type) {
|
template<class It> uint8_t calculate_crc(It first, It last, uint32_t type) {
|
||||||
@@ -42,12 +44,14 @@ class RP2040PreferenceBackend : public ESPPreferenceBackend {
|
|||||||
uint32_t type = 0;
|
uint32_t type = 0;
|
||||||
|
|
||||||
bool save(const uint8_t *data, size_t len) override {
|
bool save(const uint8_t *data, size_t len) override {
|
||||||
std::vector<uint8_t> buffer;
|
const size_t buffer_size = len + 1;
|
||||||
buffer.resize(len + 1);
|
SmallBufferWithHeapFallback<PREF_BUFFER_SIZE> buffer_alloc(buffer_size);
|
||||||
memcpy(buffer.data(), data, len);
|
uint8_t *buffer = buffer_alloc.get();
|
||||||
buffer[buffer.size() - 1] = calculate_crc(buffer.begin(), buffer.end() - 1, type);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < len + 1; i++) {
|
memcpy(buffer, data, len);
|
||||||
|
buffer[len] = calculate_crc(buffer, buffer + len, type);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < buffer_size; i++) {
|
||||||
uint32_t j = offset + i;
|
uint32_t j = offset + i;
|
||||||
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
||||||
return false;
|
return false;
|
||||||
@@ -60,22 +64,23 @@ class RP2040PreferenceBackend : public ESPPreferenceBackend {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool load(uint8_t *data, size_t len) override {
|
bool load(uint8_t *data, size_t len) override {
|
||||||
std::vector<uint8_t> buffer;
|
const size_t buffer_size = len + 1;
|
||||||
buffer.resize(len + 1);
|
SmallBufferWithHeapFallback<PREF_BUFFER_SIZE> buffer_alloc(buffer_size);
|
||||||
|
uint8_t *buffer = buffer_alloc.get();
|
||||||
|
|
||||||
for (size_t i = 0; i < len + 1; i++) {
|
for (size_t i = 0; i < buffer_size; i++) {
|
||||||
uint32_t j = offset + i;
|
uint32_t j = offset + i;
|
||||||
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
||||||
return false;
|
return false;
|
||||||
buffer[i] = s_flash_storage[j];
|
buffer[i] = s_flash_storage[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t crc = calculate_crc(buffer.begin(), buffer.end() - 1, type);
|
uint8_t crc = calculate_crc(buffer, buffer + len, type);
|
||||||
if (buffer[buffer.size() - 1] != crc) {
|
if (buffer[len] != crc) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(data, buffer.data(), len);
|
memcpy(data, buffer, len);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user