Мое намерение: чтобы:
- Запустить асинхронный веб-сервер на 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
Мобильная версия