Запуск веб-сервера Async с многоядерным потоком на Raspberry Pi Pico WPython

Программы на Python
Ответить
Anonymous
 Запуск веб-сервера Async с многоядерным потоком на Raspberry Pi Pico W

Сообщение Anonymous »

Я работаю над проектом с использованием Raspberry Pi Pico W 2, который предполагает отображение данных с датчиков BLE на веб-странице, при этом все работает на Pico.
Мое намерение: чтобы:
  • Запустить асинхронный веб-сервер на Core 0.
  • Использовать поток на Core 1 для обработки взаимодействия датчиков .
Обмен данными между ядрами основан на модели общей памяти с блокировкой (это не является частью моей проблемы).
Чтобы проверить это, я использовал пример сценария из Случайные обучающие программы для Nerd, заменяющие все аппаратные вводы-выводы распечатками консоли, так что для теста нужен только сам Pico. Веб-сервер прекрасно работает сам по себе, но когда я добавляю тривиальную задачу для запуска на Core 1, возникают следующие проблемы:
  • Вывод консоли отображается как ожидается.
  • Веб-сервер становится недоступным.
  • Pico полностью блокируется, и для загрузки любого нового кода требуется полный сброс с помощью flash_nuke.uf2.
Проблема
Что может быть причиной сбоя Pico при добавлении потока в ядро ​​1 и как я могу решить эту проблему?Проблема
Что может быть причиной сбоя Pico при добавлении потока в ядро ​​1 и как я могу решить эту проблему?Проблема
Что может быть причиной сбоя Pico при добавлении потока в ядро ​​1 и как я могу решить эту проблему?Проблема
Что может быть причиной сбоя Pico при добавлении потока в ядро ​​1 и как я могу решить эту проблему?Проблема
Что может быть причиной сбоя Pico при добавлении потока в ядро ​​1 и как я могу решить эту проблему? p>
Тестовый код:
Вот измененный код:

Код: Выделить всё

# Modified from Random Nerd Tutorials
# https://randomnerdtutorials.com/raspberry-pi-pico-w-asynchronous-web-server-micropython/

import network
import asyncio
import time
from machine import Pin
import _thread

# Wi-Fi credentials
ssid = "wifi-name"
password = "wifi-password"

# Onboard LED setup
led_control = Pin("LED", Pin.OUT)

# Shared variables
state = "OFF"
random_value = 0

# HTML template
def webpage(random_value, state):
return f"""



Pico Web Server



Pico Web Server
LED state: {state}
Random value: {random_value}


"""

# Initialize Wi-Fi
def init_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
for _ in range(10):
if wlan.status() >= 3:
print('Wi-Fi connected')
print('IP address:', wlan.ifconfig()[0])
return True
time.sleep(1)
print('Wi-Fi connection failed')
return False

# Asynchronous web server
async def handle_client(reader, writer):
global state, random_value
request = await reader.readline()
if '/lighton' in request:
led_control.value(1)
state = "ON"
elif '/lightoff' in request:
led_control.value(0)
state = "OFF"
elif '/value' in request:
random_value = random.randint(0, 20)
response = webpage(random_value, state)
writer.write('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
writer.write(response)
await writer.drain()
await writer.wait_closed()

# Blink task
async def blink_led():
while True:
print("Blinking LED")
await asyncio.sleep(1)

# Core 1 task
def parallel_core_task():
while True:
print("Running on Core 1")
time.sleep(2)

# Main function
async def main():
if not init_wifi(ssid, password):
return
server = await asyncio.start_server(handle_client, "0.0.0.0", 80)
asyncio.create_task(blink_led())
async with server:
await server.serve_forever()

# Start Core 1 thread
_thread.start_new_thread(parallel_core_task, ())

# Start asyncio event loop
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

консоль вывод:

Код: Выделить всё

MPY: soft reboot
Running on Core 1
Wi-Fi connected
IP address: 192.168.0.3
Blinking LED
Running on Core 1
...
Дополнительные примечания:
  • Проблема возникает при добавлении _thread.start_new_thread(). .
  • Без потока Core 1 сервер работает отлично.
  • Любая информация о том, почему добавление потока приводит к сбою и как это исправить, будет полезна быть оценены по достоинству.


Подробнее здесь: https://stackoverflow.com/questions/793 ... -pi-pico-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»