ESP32 Dual Core - Realmente Roda Independente

Projetos de ESP32
jomasil
Novato
Mensagens: 2
Registrado em: 27/Jan/2019, 03:30

ESP32 Dual Core - Realmente Roda Independente

Mensagem por jomasil » 27/Jan/2019, 04:05

Vi sua vídeo aula sobre Esp32 - "Programação Multi-Core - Pt1", gostei muito, parabéns. Mas resolvi testar o funcionamento dos dois cores em rodar rotinas simultâneas. Acho que erei em alguma coisa. Imaginei assim: criei um task para rodar no core 0 com um contador em while infinito e no loop que naturalmente roda no core 1 outro contador com while infinito, ambos imprimindo resultado na porta serial. Como o loop tem maior prioridade o contador foi ate uns 28, neste momento o sistema (acredito eu) deu oportunidade para o core 0 mostrar o resultado do contador, achei que também iria ver o contador próximo dos 28, mas para minha surpresa ele iniciou a contagem do zero. Com isso as duas rotinas não rodão simultaneamente, uma só inicia quando a outra para. Um núcleo fica inativo enquanto outro trabalha.
Alguém sabe me enviar um código em que os dois núcleos rodem simultâneos, tipo assim, dois relógios ou dois contadores um em cada núcleo e ambos marcando os mesmos valores, logico pois os dois devem estar rodando ao mesmo tempo.
Agradeço a colaboração de todos.

sara
Novato
Mensagens: 2
Registrado em: 28/Jan/2019, 16:00

Re: ESP32 Dual Core - Realmente Roda Independente

Mensagem por sara » 19/Fev/2019, 00:51

Olá Jomasil!

Não sei se entendi direito como fez o código (se quiser postar aqui eu dou uma olhada) mas embora a Serial seja acessível (visível) nos dois cores ela é um único recurso. Lembre-se que a serial é uma UART, portanto é impossível escrever na serial ao mesmo tempo de dois cores. O que acaba acontecendo é que o freeRTOS divide para que cada core utilize o recurso num dado momento. Já vi um código inclusive que o programador utiliza a serial dentro de um mutex utilizando o freeRTOS.
Maaaaas, o esp32 conta com 3 canais de uart. Se você tiver um conversor TTL - 5V sobrando pode usar a biblioteca hardware serial e conseguir ter duas seriais independentes e aí as chances de você ter de fato uma escrita simultânea é bem grande.

Espero ter ajudado!
Abraços,
Sara Monteiro

jomasil
Novato
Mensagens: 2
Registrado em: 27/Jan/2019, 03:30

Re: ESP32 Dual Core - Realmente Roda Independente

Mensagem por jomasil » 19/Mar/2019, 18:37

Sara, muito obrigado pela resposta, e desculpa pela demora eu já tinha desistido e parei com estudo sobre este tema .... sua observação sobre a porta serial foi importante e alertar que eu poderia ter duas seriais independente para observar foi mais ainda apesar de ter que estudar para ver com faço isso mas parece ser bem simples rsss. Mas quero observar os dois núcleos rodando um contador ou um time e as duas informações na tela. Veja se para rodar nos núcleos eu tenho que definir prioridade, significa que roda o de maior prioridade e depois o outro, juntos não daria. Eu usei esta adaptação de rotina como teste ... não sou experiente desculpe alguma falha. gostaria muito de sua opinião e criticas. abraço.

static int taskCore = 0;
int Vconta = 0;
int VcontaT = 0;
int VcontaT1 = 0;
int VcontaT2 = 0;
String taskMessage = "Task rodando no core ==> ";
String taskMessage1 = "Task rodando no core ==> ";
void coreTask( void * pvParameters ){


while(true){

Serial.println("Rodando no core... ");
String taskMessage = "Rotina rodando no core ==> ";
taskMessage = taskMessage + xPortGetCoreID();
Serial.println(taskMessage);
VcontaT++;

Serial.print("Contador ===> ");
Serial.println(VcontaT);

// delay(1000);
}

}


void coreTask2( void * pvParameters ){


while(true){

Serial.println("Rodando no core... ");
String taskMessage1 = "Rotina rodando no core ==> ";
taskMessage1 = taskMessage1 + xPortGetCoreID();
Serial.println(taskMessage1);
VcontaT2++;

Serial.print("Contador ===> ");
Serial.println(VcontaT2);

// delay(1000);
}

}
void setup() {

Serial.begin(112500);
delay(1000);

Serial.print("Iniciando e criando task no core ==> ");
Serial.println(taskCore);

xTaskCreatePinnedToCore(
coreTask, /* Function to implement the task */
"coreTask", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
NULL, /* Task handle. */
0); /* Core where the task should run */

Serial.println("Task 0 criado...");

xTaskCreatePinnedToCore(
coreTask2, /* Function to implement the task */
"coreTask2", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
NULL, /* Task handle. */
1); /* Core where the task should run */

Serial.println("Task 1 criado...");
}

void loop() {

Serial.println("Iniciando meu LOOP...");
String taskMessage2 = "Loop rodando no core ==> ";
taskMessage2 = taskMessage2 + xPortGetCoreID();
// Serial.println(taskMessage2);
while (true){


delay(1000);

Vconta++;
Serial.println("**********************");
Serial.println(taskMessage);
Serial.println("**********************");
Serial.print("Contando no Task 0 ==> ");
Serial.println(VcontaT);
Serial.println("**********************");
Serial.println(" ");



Serial.println("---------------------");
Serial.println(taskMessage1);
Serial.println("---------------------");
Serial.print("Contando no Task 1 ==> ");
Serial.println(VcontaT2);
Serial.println("---------------------");
Serial.println(" ");


}

}

Responder