я сейчас на таблетках сижу,(лечусь! а то неправильно поймут)))) и сознание измененное, и отупел от них,))) выходит что чуда не будет ?))) нельзя баг использовать как фичу ?))) я бы тогда временно даже ядро скачал бы для esp32 3+ версии)))
при встрече может произойти так что у тебя выдернут из рук устройство, и скажут иди от сюда)))) не заплатив!
было бы чудесно если например кнопку нажал, и код удалился, и потом что не считывай все равно не покажет нечего…
как то вроде пытался сделать такое, но не помню получилось или нет… скорее всего не вышло, и esp с psram нет…
проверять код только если не жалко esp! а то может еще что с ней случится)))
// Никаких специальных атрибутов НЕ СТАВИТЬ!
// Весь код автоматически загрузится в PSRAM
#include <esp_private/cache_utils.h>
#include <esp_cache.h>
const int LED_PIN = 2;
volatile unsigned long counter = 0;
const unsigned long MAX_COUNTER = 500000; // При достижении стираем функцию
// Функция, которую будем стирать по достижению счетчика
void heavyTask() {
for (int i = 0; i < 1000; i++) {
counter += i;
}
}
// Функция стирания только heavyTask()
void eraseHeavyTask() {
Serial.println("\n⚠️ СТИРАЮ ФУНКЦИЮ heavyTask()!");
// 1. Получаем адрес начала функции
uint32_t funcAddr = (uint32_t)heavyTask;
Serial.printf("Адрес heavyTask(): 0x%08X\n", funcAddr);
// 2. Определяем размер функции (приблизительно)
// Берем 256 байт - достаточно для любой небольшой функции
size_t funcSize = 256;
// 3. Отключаем кеш перед записью в PSRAM
uint32_t cacheReg = READ_PERI_REG(DPORT_CACHE_CONFIG_REG);
WRITE_PERI_REG(DPORT_CACHE_CONFIG_REG, cacheReg & ~DPORT_CACHE_CONFIG_PSRAM);
// 4. Записываем инструкции "останов" в начало функции
// 0xFEEDBEEF - невалидная инструкция, вызовет панику при вызове
uint32_t* ptr = (uint32_t*)funcAddr;
for (size_t i = 0; i < funcSize / 4; i++) {
ptr[i] = 0xFEEDBEEF; // Стираем весь код функции
}
// 5. Включаем кеш обратно
WRITE_PERI_REG(DPORT_CACHE_CONFIG_REG, cacheReg);
// 6. Сбрасываем кеш инструкций
asm volatile("ISB");
asm volatile("DSB");
Serial.println("✅ Функция heavyTask() УСПЕШНО СТЕРТА!");
Serial.println("При следующем вызове произойдет сбой (Guru Meditation)");
}
// Функция проверки, стерта ли heavyTask()
void checkHeavyTaskStatus() {
uint32_t funcAddr = (uint32_t)heavyTask;
uint32_t firstWord = *((uint32_t*)funcAddr);
if (firstWord == 0xFEEDBEEF || firstWord == 0) {
Serial.println("🔴 heavyTask() СТЕРТА (0xFEEDBEEF)");
} else {
Serial.printf("🟢 heavyTask() ЦЕЛА: 0x%08X\n", firstWord);
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
Serial.println("=== САМОУНИЧТОЖЕНИЕ ФУНКЦИИ ===");
Serial.printf("Адрес setup(): %p\n", (void*)setup);
Serial.printf("Адрес loop(): %p\n", (void*)loop);
Serial.printf("Адрес heavyTask(): %p\n", (void*)heavyTask);
Serial.printf("Счетчик до стирания: %lu\n", MAX_COUNTER);
Serial.println("При достижении - heavyTask() будет стерта!");
Serial.println("----------------------------------------");
}
void loop() {
// ПРОВЕРКА: жива ли еще функция?
static bool functionErased = false;
// Если функция еще жива - вызываем
if (!functionErased) {
heavyTask();
} else {
// Если функция стерта - пропускаем вызов
Serial.println("⚠️ heavyTask() стерта, пропускаем вызов");
delay(100);
return;
}
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
Serial.printf("Счетчик: %lu / %lu", counter, MAX_COUNTER);
// Проверяем статус функции каждые 10000 итераций
if (counter % 10000 == 0) {
checkHeavyTaskStatus();
}
// ДОСТИГЛИ ЛИМИТА - СТИРАЕМ ФУНКЦИЮ!
if (counter >= MAX_COUNTER) {
Serial.println("\n🔥 ДОСТИГНУТ ЛИМИТ! СТИРАЮ heavyTask()!");
// Стираем функцию
eraseHeavyTask();
functionErased = true;
// Проверяем, что функция стерта
checkHeavyTaskStatus();
Serial.println("✅ heavyTask() больше НЕ СУЩЕСТВУЕТ!");
Serial.println("Продолжаем работу без heavyTask()");
Serial.println("----------------------------------------");
}
delay(10);
}
если сработает, можно наверное попытаться уже и полностью перезаписать память, а не только начало…
но скорее всего не выйдет)))
код не проверял, просто описал теоретический способ ии как можно попытаться реализовать… но поймет ли, и позволит это компилятор…)))