ESP32的雙核
ESP32上是有兩個核心的,配備了2個 Xtensa 32 位 LX6 微處理器:核心0和核心1,默認是運行在核心1的,我們可以在代碼中創建一個任務在核心0上面運行,進行并行的多任務處理。
我們看一下官方的芯片資源框圖,這里是有兩個Core的:
我們可以通過一個函數來識別代碼在哪個內核中運行
xPortGetCoreID()
這個函數會返回運行的Core ID號。
我們通過以下代碼測試一下
void setup() {
Serial.begin(115200);
Serial.print("setup() running on core ");
Serial.println(xPortGetCoreID());
}
void loop() {
Serial.print("loop() running on core ");
Serial.println(xPortGetCoreID());
}
我們看一下打印的情況
Arduino for ESP32是運行在FreeRTOS實時操作系統上的,我們的loop()函數就是內核1的一個任務,我們在創建任務的時候,可以指定運行在哪個核心。下面的需要一點FreeRTOS的基礎,如果沒接觸的可以先自行了解一下,這里推薦野火的《FreeRTOS內核實現與應用開發實戰指南》這本書,講的非常棒!
新建任務
創建任務句柄
我們這里創建一個Task1
TaskHandle_t Task1;
創建任務
設置任務的執行函數,優先級,堆棧大小,運行在哪個內核等參數
xTaskCreatePinnedToCore(
Task1code, /* Function to implement the task */
"Task1", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
&Task1, /* Task handle. */
0); /* Core where the task should run */
具體的任務函數
這里是一個無限循環,任務1的代碼在這里實現,然后每隔一段時間片,就去執行當前更高優先級的任務。
Void Task1code( void * parameter) {
for(;;) {
Code for task 1
(...)
}
}
任務刪除
vTaskDelete(Task1);
多任務案例
下面的代碼,我們以不同的時間讓LED燈閃爍,然后Task1運行在core0,Task運行在core1。
/*
* Created on: 20220316
* Author: 公眾號:跳動的字節
* Function 12 ESP32的雙核
* Version: V1.0
*
* ,%%%%%%%%,
* ,%%/%%%%/%%
* ,%%%c''''J/%%%
* %. %%%%/ o o %%%
* `%%. %%%% |%%%
* `%% `%%%%(__Y__)%%'
* // ;%%%%`-/%%%'
* (( / `%%%%%%%'
* .' |
* / | |
* / ) | |
* /_ | |__
* (____________))))))) 攻城獅
*
*/
TaskHandle_t Task1;
TaskHandle_t Task2;
// LED pins
const int led1 = 2;
const int led2 = 4;
void setup() {
Serial.begin(115200);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
//create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
xTaskCreatePinnedToCore(
Task1code, /* Task function. */
"Task1", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task1, /* Task handle to keep track of created task */
0); /* pin task to core 0 */
delay(500);
//create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
xTaskCreatePinnedToCore(
Task2code, /* Task function. */
"Task2", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&Task2, /* Task handle to keep track of created task */
1); /* pin task to core 1 */
delay(500);
}
//Task1code: blinks an LED every 1000 ms
void Task1code( void * pvParameters ){
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
digitalWrite(led1, HIGH);
delay(1000);
digitalWrite(led1, LOW);
delay(1000);
}
}
//Task2code: blinks an LED every 500 ms
void Task2code( void * pvParameters ){
Serial.print("Task2 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
delay(500);
}
}
void loop() {
}
實際效果
串口打印:
硬件連接非常簡單,IO2與IO4各接一個LED燈即可,我們看看效果:
led1每1秒閃爍一次,led2每500ms閃爍一次,這樣就是真正的兩個內核同時運行兩個不同的任務。
到這里,12篇基礎教程已經講完了,大家對ESP32也有所了解了,接下來我們講進階教程,開始玩起WiFi和藍牙以及各種傳感器以及屏幕等,有了WiFi,我們就可以與外界進行通信,能做一些超級好玩的項目。
感謝大家,關于ESP32的學習,希望大家Enjoy!
-
芯片
+關注
關注
456文章
51140瀏覽量
426150 -
微處理器
+關注
關注
11文章
2273瀏覽量
82652 -
雙核
+關注
關注
0文章
37瀏覽量
15228 -
Arduino
+關注
關注
188文章
6477瀏覽量
187572 -
ESP32
+關注
關注
18文章
977瀏覽量
17463
發布評論請先 登錄
相關推薦
評論