taches-cooperatives.py

Raspberry Pi Pico · Archivo : taches-cooperatives.py · Lenguaje : Python · Uso : Ordonnanceur de tâches non bloquant pour animer plusieurs broches

Tres tareas periódicas (LED 2 Hz, pitido 1 Hz, medida cada 5 s) se ejecutan en un mini planificador cooperativo de 15 líneas. Este patrón sustituye a los delay() anidados en cuanto un proyecto anima más de un pin.

Hardware

Una Raspberry Pi Pico (RP2040 doble Cortex-M0+ @ 133 MHz) con MicroPython instalado, alimentada por USB. 1 LED + 330 Ω en GP25, 1 zumbador pasivo en GP2 (opcional, quita la tarea si no).

Cableado

LED en GP25 con 330 Ω a GND; zumbador entre GP2 y GND. Adapta los pines a los libres según el proyecto.

Funcionamiento

Cada tarea guarda su vencimiento; el bucle compara con time.ticks_diff (robusto ante el desbordamiento de 32 bits) y reprograma el siguiente. sleep_ms(1) evita ocupar la CPU al 100%.

Ejecución

Instala MicroPython si hace falta (mantén BOOTSEL, conecta el USB, suelta el archivo .uf2) y copia el script en la unidad de la placa o vía Thonny. El script arranca solo si se llama main.py.

Variantes

Añade tareas sobre la marcha con creer(), o pasa a uasyncio (asyncio de MicroPython) para tareas orientadas a eventos con esperas no bloqueantes.

taches-cooperatives.py

# Ordonnanceur cooperatif : plusieurs taches sans fil ni RTOS.
# Chaque tache est appelee a sa frequence ; aucune ne bloque les autres.
from machine import Pin, ADC
import time

led = Pin(25, Pin.OUT)
buzz = Pin(2, Pin.OUT)
adc = ADC(4)

taches = []

def creer(periodo_ms, fonction):
    taches.append([time.ticks_ms() + periodo_ms, periodo_ms, fonction])

def clignoter():
    led.value(not led.value())

def bip_court():
    buzz.on()
    time.sleep_ms(20)
    buzz.off()

def mesurer():
    v = adc.read_u16() * 3.3 / 65535.0
    t = 27.0 - (v - 0.706) / 0.001721
    print("T = %.1f C" % t)

creer(500, clignoter)     # 2 Hz
creer(1000, bip_court)    # 1 Hz
creer(5000, mesurer)      # toutes les 5 s

print("Ordonnanceur demarre (%d taches)" % len(taches))
while True:
    maintenant = time.ticks_ms()
    for tache in taches:
        if time.ticks_diff(maintenant, tache[0]) >= 0:
            tache[0] = time.ticks_add(tache[0], tache[1])
            tache[2]()
    time.sleep_ms(1)   # cede la main : evite la pleine charge CPU

← Volver a la ficha