Esp32 模块中已经提供了 FreeRTOS(实时操作系统)固件。FreeRTOS有助于提高系统性能和管理模块的资源。FreeRTOS允许用户处理多项任务,如测量传感器读数,发出网络请求,控制电机速度等,所有这些任务都可以同时独立运行。
FreeRTOS为不同的应用程序提供了多个API。这些 API 可用于创建任务并使其在不同内核上运行。您需要创建任务以将代码的特定部分分配给特定内核。您还可以确定代码将在哪个内核上运行的优先级。优先级值以 level_0 开头。
每当我们在Arduino IDE上运行代码时,默认情况下,它会在core_1上运行。
您可以使用一个函数来检查代码在哪个内核上运行。xPortGetCoreID()

//wifi在core0,其他在core1;1为大核
void setup()

{

Serial.begin(115200);

Serial.print( ” setup() is running on: Core_” );

Serial.println( xPortGetCoreID() );

delay(1000);

}

void loop()

{

Serial.print( ” loop() is running on: Core_” );

Serial.println( xPortGetCoreID() );

delay(1000);

}

这段代码中,我们将使用两个led由不同的核心处理。

TaskHandle_t task1;
TaskHandle_t task2;
//将gpio引脚分配给led
const int led1 = LED_BUILTIN;
const int led2 = 25;
void setup() {
Serial.begin(115200 );
pinMode( led1, OUTPUT );
pinMode( led2, OUTPUT );
//创建一个在Task1code()函数中执行的任务,优先级为1,在核心1上执行
xTaskCreatePinnedToCore(task_1code, // Task function.
“Task1”,//任务名称
10000, //任务的堆栈大小
NULL,//任务的参数
1, //任务的优先级
&task1,//跟踪创建任务的任务句柄
1); //指定核心1的任务
delay(1000);
创建一个在Task2code()函数中执行的任务,优先级为1,并在核心1上执行
xTaskCreatePinnedToCore(task_2code, //Task function.
“task2”,//任务名称
10000,  //任务的堆栈大小
NULL, //任务的参数
1,//任务的优先级
&task2,//跟踪创建任务的任务句柄
0); //指定核心1的任务
delay(1000);
}
//task_1code: LED每1000毫秒闪烁一次
void task_1code( void * pvParameters ){
Serial.print( “task1 running on: core ” );
Serial.println( xPortGetCoreID() );
for(;;)
{
digitalWrite( led1, HIGH);
delay(1000);
digitalWrite(led1, LOW);
delay(1000);
}
}
//task_2code: LED每500毫秒闪烁一次
void task_2code( void * pvParameters )
{
Serial.print( “task2 running on: core ” );
Serial.println(xPortGetCoreID() );
for(;;){
digitalWrite(led2, HIGH );
delay(500);
digitalWrite(led2, LOW );
delay(500);
}
}
void loop()
{
Serial.print( ” loop() is running on: Core ” );
Serial.println( xPortGetCoreID() );
delay(1000);
}