DualCore dando reboot

Projetos de ESP32
Hachid Cury
Novato
Mensagens: 1
Registrado em: 14/Jun/2019, 13:43

DualCore dando reboot

Mensagem por Hachid Cury » 12/Nov/2019, 03:20

Boa noite, estou com um problema aqui no qual minha esp32 fica dando reboot quando estou executando uma task no core 0 dela. mandarei o código e o erro abaixo:

Neste script estou lendo a porta serial no core 0 e girando um motor caso chegue a string 'Girar', e no core 1 estou escrevendo os valores de umas leituras analógicas no formato JSON

_____CÓDIGO______
TaskHandle_t Task1;
TaskHandle_t Task2;
// Motor Nema17
int dirPin1=2;
int stepPin1=4;

String recebido;

#define stepsPerRevolution 200
#define Velo 450

#define SensorLaranja 12
#define SensorPrata 14
#define SensorRoxo 27
#define SensorRosaEscuro 26
#define SensorRosaClaro 33
#define Luximetro 32
#define Presenca 35

String leStringSerial(){
String conteudo = "";
char caractere;

// Enquanto receber algo pela serial
while(Serial.available() > 0) {
// Lê byte da serial
caractere = Serial.read();
// Ignora caractere de quebra de linha
if (caractere != '\n'){
// Concatena valores
conteudo.concat(caractere);
}
// Aguarda buffer serial ler próximo caractere
delay(10);
}

Serial.print("Recebi: ");
Serial.println(conteudo);

return conteudo;
}

void setup() {
Serial.begin(9600);
pinMode(stepPin1, OUTPUT);
pinMode(dirPin1, OUTPUT);

pinMode(SensorLaranja, INPUT);
pinMode(SensorPrata, INPUT);
pinMode(SensorRoxo, INPUT);
pinMode(SensorRosaEscuro, INPUT);
pinMode(Presenca, INPUT);
pinMode(SensorRosaClaro, INPUT);
pinMode(Luximetro, INPUT);

//create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
xTaskCreatePinnedToCore(Task1code,"Task1",10000,NULL,3,&Task1,0); /* pin task to core 0 */
delay(500);
xTaskCreatePinnedToCore(Task2code,"Task2",10000,NULL,2,&Task2,1); /* pin task to core 1 */
delay(500);
}

void girar(int dirPin, int stepPin) {

for (int i = 0; i < 5*10* stepsPerRevolution; i++) {

digitalWrite(stepPin, HIGH);
delayMicroseconds(Velo);
digitalWrite(stepPin, LOW);
delayMicroseconds(Velo);
}
}

void loop() {}

void Task1code( void * pvParameters ){
for(;;){

// Se receber algo pela serial
if (Serial.available() > 0){
// Lê toda string recebida
recebido = leStringSerial();
}
if (recebido=="Girar") {
digitalWrite(dirPin1, LOW);
girar(dirPin1,stepPin1);
digitalWrite(dirPin1, HIGH);
girar(dirPin1,stepPin1);
}
}
}

void Task2code( void * pvParameters ){
for(;;){
Serial.println("{");
Serial.print("\"SensorSolo1\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(SensorRosaEscuro));
Serial.println("\",");

Serial.print("\"SensorSolo2\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(SensorRosaClaro));
Serial.println("\",");

Serial.print("\"SensorSolo3\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(SensorPrata));
Serial.println("\",");

Serial.print("\"SensorSolo4\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(SensorLaranja));
Serial.println("\",");

Serial.print("\"SensorSolo5\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(SensorRoxo));
Serial.println("\",");

Serial.print("\"Presença\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(Presenca));
Serial.println("\",");

Serial.print("\"Luximetro\"");
Serial.print(" : ");
Serial.print("\"");
Serial.print(analogRead(Luximetro));
Serial.println("\"");
Serial.println("}");
Serial.println("");
delay(1000);
}
}
________FIM___________

Ele escreve normalmente o valor das leituras analógicas porém fica reiniciando. Creio que seja por causa do watchdog in time, mas não ativei ele, como faço para desligar ele e pq ele ativou nesse código meu?

_______ERRO__________
{
"SensorSolo1" : "0",
"SensorSolo2" : "0",
"SensorSolo3" : "0",
"SensorSolo4" : "0",
"SensorSolo5" : "0",
"Presença" : "0",
"Luximetro" : "200"
}

E (410536) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (410536) task_wdt: - IDLE0 (CPU 0)
E (410536) task_wdt: Tasks currently running:
E (410536) task_wdt: CPU 0: Task1
E (410536) task_wdt: CPU 1: loopTask
E (410536) task_wdt: Aborting.
abort() was called at PC 0x400d6297 on core 0

Backtrace: 0x40089170:0x3ffbe160 0x4008939d:0x3ffbe180 0x400d6297:0x3ffbe1a0 0x40081a0d:0x3ffbe1c0 0x4008341f:0x3ffb4640 0x4008148f:0x3ffb4660 0x400814cf:0x3ffb4680 0x400d0dad:0x3ffb46a0 0x400d0eb9:0x3ffb46c0 0x40087cbd:0x3ffb46f0

Rebooting...

Mateus Gomes
Novato
Mensagens: 1
Registrado em: 19/Nov/2019, 06:16

Re: DualCore dando reboot

Mensagem por Mateus Gomes » 19/Nov/2019, 06:28

Acredito que seja com o delay (). Num dos meus primeiros projetos com task, eu tinha esse mesmo problema. Resolvi adicionando um delay assim como você fez. Mas quando se usa tasks do FreeRTOS, o delay(tempo) é dado por vTaskDelay(tempo/portTICK_PERIOD_MS). Basta substituir.

Responder