ESP32 – la utilización de los ambos huesos CPU para proyectos propios

Today I want to el show which "power resources" are en at ESP32. It is much less known that our ESP32 microcontroller is la necesidad al single processor but rather a multi-processor with 2 cores. En the ESP are working 2 Xtensa 32-bit LX6 CPU sharing RAM y la ROM. Thus it differs from its predecessor, the ESP8266. The two cores have different names. El CPU 0 is called Protocol CPU (PRO_CPU) y el CPU 1 el Application CPU (APP_CPU). The el CPU 0 controls the WLAN, Bluetooth y other internal peripherals busca el as SPI, I2C, ADC, etc., while the el CPU 1 is available to our el usuario propesar. Skits that we write en Meno the loop y upload to the ESP are always executed on the el CPU 1 without exception.The APP_CPU (CPU 0) is omitted by default for the application el código. The following pesar de diapositiva shows el estándar the la distribución of tasks between the CPUs:

It can lagos that 2 core, which el este de pasto alpino dobles the performance of ESP32, is la necesidad directly available for free use.

However, the ESP Framework provides functions with the Arduino IDE that allow to distribute individual tasks to the ESP32 CPUs y thus to the CPU.

TaskHandle_t NamedesTaskhadle;

 to disposal. To create a new task, we use the function xTaskCreatePinnedToCore with the following options:

 

xTaskCreatePinnedToCore (
CoreTask0, / - Task function to called - /
"Task1", ​/-el nombre of the task Any el nombre /
En 1000, / - available heap memory of the task - /
CERO, / - possibly el parámetro of the task - /
1, / - task priority - /
& Core0TaskHnd, / - used task actúa - /

 

Our goal is to execute custom el código el as a task on the CPU1, según el as shown below, our el código runs el as a task on the CPU1 independent of the CPU0, el as illustrated en the following la imagen:

 

 

We now enter the following el código example en our IDE y upload it to the ESP32:

 

 

TaskHandle_t  Core0TaskHnd ;  
TaskHandle_t  Core1TaskHnd ; 

void Setup() 
{   Serial.begin(9600);     xTaskCreatePinnedToCore(CoreTask0,"CPU_0",1000,CERO,1,&Core0TaskHnd,0);   xTaskCreatePinnedToCore(CoreTask1,"CPU_1",1000,CERO,1,&Core0TaskHnd,1);
}

void loop() 
{   Serial.print ("Application CPU is on core:");   Serial.println (xPortGetCoreID());   delay (500);
}  

void CoreTask0( void * parámetro ) 
{    for (;;)    {      Serial.print("CoreTask0 runs on Core:");      Serial.println(xPortGetCoreID());      yield();     delay (600);   } 
} 

void CoreTask1( void * parámetro ) 
{    for (;;)    {      Serial.print("CoreTask1 runs on Core:");      Serial.println(xPortGetCoreID());      delay (700);   } 
}

 

 

.

Con ESP la función interna xPortGetCoreID () podemos dejarnos distribuir el número de hueso en el cual nuestra sección de código corre precisamente. Este número de hueso puede aceptar o el valor 0 o 1. Nosotros utilizamos esta función para distribuir en serie la información aquello en qué Core de Task corre precisamente:

Serial la producción total shows which task is running on which core

Ahora miramos en el gasto recorrer en total 3 Tasks. Task con el nombre „el CoreTask 0“ por el CPU 0, Task con el nombre „CoreTask1“ por el CPU 1 así como nuestro Hauptscheifentask (loop) en Core 1.

Hasta ahora todo suena demasiado bien para ser verdadero. En efecto tenemos con la utilización de los CPU 0 un problema al cual tenemos que regalar atención: Como en la imagen superior mostrado, recorre por el CPU 0 también de Kernel el acta Task., Entre otras cosas, este Task se ocupa también de WiFi y TCP/IP Stack. Si de este tiempo más largo no es exportado porque, por ejemplo, nuestro Task exige demasiado tiempo CPU, el sistema puede ponerse inestable en total y despeñarse. Debemos por ello la preocupación resiste que nuestro Task propio no recibe a nadie o sólo como máximo muy un poquito delay instrucciones medidas, para que Kernel el acta siente Task bastante tiempo de rastrillo asignado.

 

al lector atento em un otro problema del código habrá llamado la atención: El programa produce 3 Tasks, independientemente uno de otro z. T. en CPU’s diferente corren, se dividen sin embargo sin embargo un recurso (el puerto COM de ESP‘s). Dado que básicamente Tasks no "saben" nada uno de otro y por lo tanto tampoco cuándo un recurso es cubierto por otro Task o es cambiado., colisiones pueden producirse aquí. Éstas causan un resultado no predecible, dado que no puede exactamente ser determinado, a cual tiempo qué Task usa el recurso. Luego tales constelaciones saben en el mejor caso o en una programática Condición Race o incluso en uno Deadlock acaban. Lo que es exactamente un Deadlock, explica esto Problema de filósofo, where 5 philosophers sit around a espaguetis table, very vivid. I want to avoid mutually exclusion mutual issues through mutual exclusion ( mutex ) y collisions when accessing shared resources search el as variable or interfaces avoid,

That puts us en the middle of the topic of interprocess communication . We've learned a la sonda about tasks y multitasking.

More about task en la generación y the Realmente Time la operación el sistema (RTOS) is available en the second part of this series or on::

https://exploreembedded.com/wiki/index.php?title=Hello%20World%20with%20ESP32%20Explained

Y now have fun experimenting.


 

 

Esp-32Software básico

3 comentarios

doob

doob

{
Serial.begin(9600);
xTaskCreatePinnedToCore(CoreTask0,“CPU_0”,1000,NULL,1,&Core0TaskHnd,0);
xTaskCreatePinnedToCore(CoreTask1,“CPU_1”,1000,NULL,1,&Core0TaskHnd,1);
}
noch ein Tippfehler? sollte es beim zweiten pinning nicht Core1TaskHnd heißen?

Sven

Sven

CPU 1 ist für das Anwenderprogramm verantwortlich.

Der Tippfehler wird bestimmt zeitnah korrigiert.

veit

veit

Diese Namentliche Unterscheidung wird getroffen, um zu verdeutlichen, dass die CPU 0 das WLAN, Bluetooth und andere interne Peripheriegeräte wie SPI, I2C, ADC usw. steuert, während die CPU 0 für unser Anwenderprogramm zur Verfügung steht.

bitte korrigieren …. irgendwas müsste von cpu 1 gemacht werden

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas