![ESP32 и MicroPython Използване на двете ядра за паралелна работа](http://ardudevelop.eu/wp-content/uploads/2024/10/ESP32-и-MicroPython-Използване-на-двете-ядра-за-паралелна-работа.png)
Въведение
ESP32 е мощен микроконтролер с две ядра, което позволява изпълнението на две задачи едновременно. В тази статия ще разгледаме как да използваме едновременно двете ядра, като илюстрираме с примерен код, който контролира две LED светлини независимо една от друга.
Може да намерите повече информация за този процесор, неговата спецификация и диаграма на пиновете в нашето ревю: ESP32 Wroom 30/38 pins
Свързване на компонентите
- LED1: Свържете положителния край през съпротивление 220om на LED1 към Pin 2 и отрицателния към земя (GND).
- LED2: Свържете положителния край отново през съпротивление 220om на LED2 към Pin 4 и отрицателния към земя (GND).
Използвани библиотеки
machine
: За контрол на GPIO пиновете.time
: За добавяне на забавяне._thread
: За управление на нишки и използване на второто ядро.
Основен код за ESP32 и MicroPython за използване на двете ядра за паралелна работа
from machine import Pin
from time import sleep
import _thread
led = Pin(2 , Pin.OUT)
led2 = Pin(4 , Pin.OUT)
#-----/ Core 1 function\------
def Core_1_function():
while True:
led.value(1)
sleep(0.1)
led.value(0)
sleep(0.1)
#-----/ Core 1 start \------
_thread.start_new_thread(Core_1_function, ())
#-----/ Core 0 \------
while True:
led2.value(1)
sleep(0.5)
led2.value(0)
sleep(0.5)
Обяснение на кода
Импортиране на библиотеки:
from machine import Pin
from time import sleep
import _thread
Инициализация на пинове:
led = Pin(2 , Pin.OUT)
led2 = Pin(4 , Pin.OUT)
led
и led2
са дефинирани като изходи за управление на двата светодиода.
Функция за Core 1:
#-----/ Core 1 function\------
def Core_1_function():
while True:
led.value(1)
sleep(0.1)
led.value(0)
sleep(0.1)
Core_1_function()
е функция, която ще бъде изпълнена на второто ядро. Тя включва и изключва LED1 с бързо премигване (0.1 секунди).
Стартиране на Core 1:
#-----/ Core 1 start \------
_thread.start_new_thread(Core_1_function, ())
С _thread.start_new_thread
стартираме функцията Core_1_function()
на второто ядро, позволявайки изпълнението ѝ паралелно с основния код.
Основен цикъл на Core 0:
#-----/ Core 0 \------
while True:
led2.value(1)
sleep(0.5)
led2.value(0)
sleep(0.5)
Основната програма (основният цикъл) работи на първото ядро (0) и управлява втория светодиод (LED2), като го включва и изключва със забавяне от 0.5 секунди.
Защо първото ядро продължава да работи след спиране на програмата?
Когато използваме _thread
за стартиране на втора функция, второто ядро продължава да работи независимо, дори и ако основният цикъл на първото ядро бъде спрян. Това е така, защото второто ядро има своя собствена независима нишка на изпълнение.
Заключение
С този пример показахме как ESP32 и MicroPython може да изпълнява две задачи паралелно на двете си ядра, като използва едното ядро за независим цикъл. Това е полезно за създаване на проекти, изискващи едновременни действия.