🛠 C SDK : cyw43_arch, lwIP threadbackground vs poll, et verrous d'arch

Raspberry Pi Pico W · avance · Schéma : IMG-pico-w-avance-2-picow-sdk-cyw43-lwip.svg — architecture logicielle Pico W : application, pile lwIP, couche cyw43_arch, pilote SPI PIO vers la puce CYW43439, deux variantes filees (thread arriere-plan vs boucle poll) cote a cote

Objectifs

Passer en C pour la maîtrise complète : dans le Pico SDK, le pilote CYW43 est intégré au SDK lui-même (src/rp2_common/pico_cyw43_driver, pico_cyw43_arch) et lwIP y a été déplacé depuis pico-extras (pico_lwip, pico_lwip_arch). La chaîne matérielle est remarquable : cyw43_arch_init alimente le CYW43439 via GP23, charge son firmware depuis ta flash QSPI, et démarre un bus SPI piloté par une machine PIO à ~33 MHz. Ce tuto compare les deux modes d'arch — pico_cyw43_arch_lwip_threadbackground (lwIP dans un thread) vs pico_cyw43_arch_poll (boucle explicite) — et leurs règles de verrouillage, source n°1 de bugs réseau en C.

Matériel

Code complet

// picow_tcp_client.c — squelette basé sur l'exemple officiel
// pico_w/wifi/tcp_client (BSD-3, © Raspberry Pi (Trading) Ltd.)
// CMake : pico_stdlib pico_cyw43_arch_lwip_threadbackground
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"     // Wi-Fi + glue lwIP, désormais dans le SDK
#include "lwip/tcp.h"

#define WIFI_SSID "myssid"
#define WIFI_PASS "mypass"
#define TEST_TCP_SERVER_IP "192.168.1.50"
#define TCP_PORT 4242

int main(void) {
    stdio_init_all;
    // Alimente le CYW43 via GP23, charge le firmware, démarre le SPI PIO 33 MHz
    if (cyw43_arch_init) { printf("failed to initialise\n"); return 1; }
    cyw43_arch_enable_sta_mode;
    if (cyw43_arch_wifi_connect_timeout_ms(
            WIFI_SSID, WIFI_PASS, CYW43_AUTH_WPA2_AES_PSK, 30000)) {
        printf("failed to connect.\n"); return 1;
    }
    printf("Connected.\n");
    // Règle d'or (variante threadbackground) : tout appel lwIP depuis TON
    // code est entouré du verrou d'arch ; depuis un callback lwIP, inutile :
    //   cyw43_arch_lwip_begin;
    //   err_t err = tcp_connect(pcb, &remote, TCP_PORT, cb);
    //   cyw43_arch_lwip_end;
    // Avec pico_cyw43_arch_poll à la place : appeler cyw43_arch_poll
    // régulièrement dans la boucle principale, sinon rien ne bouge.
    // ... tcp_new_ip_type / tcp_connect / tcp_write ...
    cyw43_arch_disable_sta_mode;
    cyw43_arch_deinit;
    return 0;
}

Vérification attendue

Connected. sur la console, et le serveur TCP de test reçoit la connexion. Pour trancher entre les deux variantes : avec threadbackground, ton main peut bloquer (sleep_ms) et lwIP tourne quand même dans son thread ; avec _poll, si tu oublies cyw43_arch_poll dans une boucle de calcul, les callbacks TCP gèlent — symptôme : la connexion se dégrade dès que le CPU est occupé.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels