目录
1,介绍
ESP32是ESP8266 的一个升级、改进的版本(花时间玩ESP32 后,发现比ESP8266更快,功能更加丰富)。ESP32 的一个特点是其他单片机不能比的是它支持双核。以下的演示将为您展示如何在arduino中配置ESP32 多核。
2.硬件
- ESP32开发板
3.代码设计
我们将重用Queue教程,在本演示中,我们创建了2个任务,1个任务称为“sendTask”,1个任务称为“receiveTask”。“sendTask”固定在核心0上。“receiveTask”固定在核心1上。“sendTask”将每秒通过Queue将数据发送到“receiveTask” 。
API xTaskCreatePinnedToCore的最后一个参数是该任务固定的核心。除此之外,我们可以使用API函数xTaskGetAffinity来了解任务固定到哪个核心。这个函数有一个参数。这是使用xTaskCreatePinnedToCore创建的任务处理程序。
/* 保存数据的结构*/
typedef struct{int sender;
char *msg;
}Data;
/* 这个变量保持队列句柄 */
xQueueHandle xQueue;
TaskHandle_t xTask1;
TaskHandle_t xTask2;
void setup() {
Serial.begin(112500);
/* 创建队列,其大小可包含5个元素Data */
xQueue = xQueueCreate(5, sizeof(Data));
xTaskCreatePinnedToCore(
sendTask,
"sendTask", /* 任务名称. */10000, /* 任务的堆栈大小 */NULL, /* 任务的参数 */1, /* 任务的优先级 */
&xTask1, /* 跟踪创建的任务的任务句柄 */0); /* pin任务到核心0 */
xTaskCreatePinnedToCore(
receiveTask,
"receiveTask",
10000,
NULL,
1,
&xTask2,
1);
}
void loop() {
}
void sendTask( void * parameter )
{
/*保持发送数据的状态 */
BaseType_t xStatus;
/* 阻止任务的时间,直到队列有空闲空间 */const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
/* 创建要发送的数据 */
Data data;
/* sender 1的id为1 */
data.sender = 1;
for(;;){
Serial.print("sendTask run on core ");
/* 获取任务被固定到 */
Serial.print(xTaskGetAffinity(xTask1));
Serial.println(" is sending data");
data.msg = (char *)malloc(20);
memset(data.msg, 0, 20);
memcpy(data.msg, "hello world", strlen("hello world"));
/* 将数据发送到队列前面*/
xStatus = xQueueSendToFront( xQueue, &data, xTicksToWait );
/* 检查发送是否正常 */if( xStatus == pdPASS ) {
/* 增加发送方1 */
Serial.println("sendTask sent data");
}
/* 我们在这里延迟,以便receiveTask有机会接收数据 */
delay(1000);
}
vTaskDelete( NULL );
}
void receiveTask( void * parameter )
{
/*保持接收数据的状态 */
BaseType_t xStatus;
/* 阻止任务的时间,直到数据可用 */const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
Data data;
for(;;){
/*从队列接收数据 */
xStatus = xQueueReceive( xQueue, &data, xTicksToWait );
/* 检查接收是否正常 */if(xStatus == pdPASS){
Serial.print("receiveTask run on core ");
/*获取任务固定的核心 */
Serial.print(xTaskGetAffinity(xTask2));
/* 将数据打印到终端*/
Serial.print(" got data: ");
Serial.print("sender = ");
Serial.print(data.sender);
Serial.print(" msg = ");
Serial.println(data.msg);
free(data.msg);
}
}
vTaskDelete( NULL );
}
我想学习一下