Ошибка Guru meditation загрузка запрещена, esp32s. При использовании Fastled
Я сталкиваюсь с ошибкой Guru meditation, загрузка запрещена в моем текущем скетче для esp32s.
Вот код:
#include <FastLED.h>
#define NUM_LEDS 120
#define LED_PIN 3
CRGB leds[NUM_LEDS];
int H1[12][10] = {
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
{10, 11, 12, 13, 14, 15, 16, 17, 18, 19},
{20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
{30, 31, 32, 33, 34, 35, 36, 37, 38, 39},
{40, 41, 42, 43, 44, 45, 46, 47, 48, 49},
{50, 51, 52, 53, 54, 55, 56, 57, 58, 59},
{60, 61, 62, 63, 64, 65, 66, 67, 68, 69},
{70, 71, 72, 73, 74, 75, 76, 77, 78, 79},
{80, 81, 82, 83, 84, 85, 86, 87, 88, 89},
{90, 91, 92, 93, 94, 95, 96, 97, 98, 99},
{100, 101, 102, 103, 104, 105, 106, 107, 108, 109},
{110, 111, 112, 113, 114, 115, 116, 117, 118, 119}
};
int connections[7][6] = { // не забудьте изменить 7 на количество концентраторов
{2,3,4,5,6,7},
{1,7,3,0,0,0},
{1,2,4,0,0,0},
{1,3,5,0,0,0},
{1,4,6,0,0,0},
{1,5,7,0,0,0},
{1,2,6,0,0,0}
};
int const life = 3;
int numHubs = 7;
void setup() {
}
void loop() {
path_taker(path_picker(numHubs, connections), H1);
delay(500);
}
int* path_picker(int numHubs,int connections[7][6]){ // не забудьте изменить 7 на количество концентраторов!
int hub = random(1,numHubs)-1;
int i = 1;
int path[life];
int a = 0;
path[0] = hub;
while (i <= life){
a = connections[hub][random(0,6)];
if (a != 0){
path[i] = a;
hub = a;
i = i+1;
}
}
return path;
}
void path_taker(int path[life], int H1[12][10]){
int ini = 0;
int fin = 0;
int rod[10];
for (int i = 0; i < sizeof(path) - 1; i++){
ini = path[i];
fin = path[i+1];
switch (ini){
case 1:
switch (fin){
case 2:
lightup(arrayBuilder(0, H1, false));
break;
case 3:
lightup(arrayBuilder(4, H1, false));
break;
case 4:
lightup(arrayBuilder(3, H1, true));
break;
case 5:
lightup(arrayBuilder(5, H1, false));
break;
case 6:
lightup(arrayBuilder(8, H1, true));
break;
case 7:
lightup(arrayBuilder(9, H1, false));
break;
}
break;
case 2:
switch (fin){
case 1:
lightup(arrayBuilder(0, H1, true));
break;
case 3:
lightup(arrayBuilder(1, H1, false));
break;
case 7:
lightup(arrayBuilder(11, H1, true));
break;
}
break;
case 3:
switch (fin){
case 1:
lightup(arrayBuilder(4, H1, true));
break;
case 2:
lightup(arrayBuilder(1, H1, true));
break;
case 4:
lightup(arrayBuilder(2, H1, false));
break;
}
break;
case 4:
switch (fin){
case 1:
lightup(arrayBuilder(3, H1, false));
break;
case 3:
lightup(arrayBuilder(2, H1, true));
break;
case 5:
lightup(arrayBuilder(6, H1, true));
break;
}
break;
case 5:
switch (fin){
case 1:
lightup(arrayBuilder(5, H1, true));
break;
case 4:
lightup(arrayBuilder(6, H1, false));
break;
case 6:
lightup(arrayBuilder(7, H1, false));
break;
}
break;
case 6:
switch (fin){
case 1:
lightup(arrayBuilder(8, H1, false));
break;
case 5:
lightup(arrayBuilder(7, H1, true));
break;
case 7:
lightup(arrayBuilder(10, H1, true));
break;
}
break;
case 7:
switch (fin){
case 1:
lightup(arrayBuilder(9, H1, true));
break;
case 2:
lightup(arrayBuilder(11, H1, false));
break;
case 6:
lightup(arrayBuilder(10, H1, false));
break;
}
break;
}
}
}
int* arrayBuilder(int row, int hexigon[12][10], bool reverse){
int rod[10];
if (reverse){
for (int i=9; i>=0;i--){
rod[i] = hexigon[row][i];
}
}else{
for (int i=0; i<10;i++){
rod[i] = hexigon[row][i];
}
}
return rod;
}
void lightup(int rod[10]){
int i = 0;
while (i<10){
EVERY_N_MILLISECONDS(50){
leds[rod[i]] = leds[i] = CHSV(255, 255, 255);
fadeToBlackBy( leds, NUM_LEDS, 10);
}
}
FastLED.show();
}
Вот декодированное исключение из декодера исключений:
EXCVADDR: 0x00000000 Decoding stack results 0x400d0cc7:
path_taker(int*, int (*) [10]) at C:\Users\****\Documents\Arduino\Wall_Art_MKI/Wall_Art_MKI.ino line 75
0x400d0d3e: loop() at C:\Users\****\Documents\Arduino\Wall_Art_MKI/Wall_Art_MKI.ino line 44
0x400d1315: loopTask(void*) at C:\Users\*****\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\cores\esp32\main.cpp line 23
0x40085d81: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143
Я опубликовал это на Reddit, и пользователь предположил, что ошибка произошла в строке 201. Проблема в том, что я пытаюсь вернуть указатель на локальную переменную внутри функции ArrayBuilder.
Я проводил исследования на эту тему, но до сих пор не могу понять, как устранить ошибку.
Я был бы очень признателен за любой совет!
@The Learning Coder, 👍-1
1 ответ
Вместо того, чтобы пытаться вернуть указатель на локальную переменную (что всегда обречено на неудачу, поскольку в итоге вы получаете указатель на мусор), вы должны создать свой массив вне функции и передать указатель на него в качестве параметра, а затем заполнить этот массив через указатель:
void arrayBuilder(int row, int hexigon[12][10], bool reverse, int *rod){
if (reverse){
for (int i=9; i>=0;i--){
rod[i] = hexigon[row][i];
}
}else{
for (int i=0; i<10;i++){
rod[i] = hexigon[row][i];
}
}
}
Затем...
int rod[10];
arrayBuilder(rownum, myhex, false, rod);
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания