ESP32 и MicroPython Използване на двете ядра за паралелна работа

ESP32 и MicroPython Използване на двете ядра за паралелна работа

Въведение

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 може да изпълнява две задачи паралелно на двете си ядра, като използва едното ядро за независим цикъл. Това е полезно за създаване на проекти, изискващи едновременни действия.

Translate »