logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wieloplatformowy projekt w PlatformIO - ESP32 i Windows w jednym pliku

p.kaczmarek2 21 Sie 2025 12:14 648 0

TL;DR

  • W jednym projekcie PlatformIO połączono „Hello world” dla ESP32 i Windows, tak by kompilować oba warianty bez przełączania plików ani edycji kodu.
  • Osobne środowisko natywne wymagało zastąpienia Arduino.h, millis(), delay oraz setup/loop odpowiednikami z stdio.h, time.h, Sleep i main().
  • Kompilacja wymagała też GCC w systemowym PATH, a czas od startu programu liczono przez time(NULL) zamiast millis().
  • Po zmianach kod zbudował się i uruchomił jako EXE na Windows, zachowując odliczanie „Hello world [0]” do „[3]”.
Wygenerowane przez model językowy.
REKLAMA
📢 Słuchaj (AI):
  • Widok edytora PlatformIO z otwartym plikiem main.cpp do kompilacji na ESP32 i Windows
    Czy próbowaliście kiedyś skompilować jeden i ten sam kod pod dwie różne platformy? Z pozoru może wydawać się to trudne, zwłaszcza w przypadku tak różnych od siebie platform jak mikrokontroler ESP32 i system Windows, ale tutaj pokażę, że podstawowy mechanizm kompilacji takiego programu wcale nie musi być skomplikowany. Zacznę tu od prostego 'Hello world' na ESP32 a potem spróbuję je przenieść na Windows tak, aby oba projekty można było kompilować z poziomu PIO bez przełączania plików i edycji kodu.

    Punktem wyjściowym jest Hello World na ESP32:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mamy wtedy następujący plik platformio.ini:
    Kod: Ini
    Zaloguj się, aby zobaczyć kod

    Taki kod się kompiluje, wgrywa na ESP32 i kolejno odlicza:
    
    Hello world [0]
    Hello world [1]
    Hello world [2]
    Hello world [3]
    


    Teraz pytanie, jak do tego dodać drugą platformę?

    Dodajemy osobne środowisko w platformio - natywne. GCC musi być w ścieżce PATH systemowej i działać z poziomu linii komend.
    Kod: Ini
    Zaloguj się, aby zobaczyć kod

    Po chwili pojawi się nowy "task" projektu:
    Widok edytora VS Code z otwartym projektem PlatformIO dla ESP32
    Tam też mamy opcję Build, czyli kompilacji - teraz zakończy się ona błędami:
    Widok PlatformIO z wybranym zadaniem Build dla środowiska Windows
    Wynika to z tego, że kod z ESP32 nie zadziała sam z siebie na Windows - brakuje nagłówków, funkcji, bibliotek. Nie mamy m. in:
    - Arduino.h
    - millis()
    - delay()
    - nie ma co wywoływać loop i setup(), zamiast tego jest main, itd.
    Trzeba te funkcje zastąpić. Kolejno:
    - nagłówki załączam obecne na Windows - <stdio.h> itd
    - millis() zastąpiłem poprzez użycie time(NULL) z nagłówka time.h, objąłem to funkcją tak by móc pobierać czas w sekundach od startu programu
    - delay zastąpiłem poprzez Sleep (na systemach unixowych jest z kolei usleep)
    - loop i setup ręcznie wywołałem z main()
    Rezultat:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kompilujemy, uruchamiamy exe i... działa:
    Widok edytora VS Code z kodem C++ i otwartym panelem PlatformIO po lewej
    W ten sposób mamy dwie bardzo różne platformy w jednym projekcie. Teraz należałoby dodać jakąś prostą warstwę abstrakcji i wydzielić ją do osobnych plików i nagłówków, ale o tym innym razem...

    Podsumowując, PlatformIO jest w stanie obsłużyć wiele środowisk w ramach jednego projektu i pozwala na współdzielenie kodu między zupełnie różnymi platformami – od mikrokontrolera aż po system operacyjny. Dzięki sprytnemu wykorzystaniu dyrektyw preprocesora całość można ładnie wydzielić i opakować, co wkrótce też pokażę.
    Czy widzicie jakieś zastosowania dla tego typu mechanizmu?
    Mi przychodzi na myśl stary temat o API pogody:
    Jak pobrać pogodę z OpenWeatherMap API na samych socketach? Tutorial API, JSON, C
    Tam powoływałem się na zgodność podstawowego API socketów na różnych platformach i pokazywałem, jak można to wykorzystać.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14627 postów o ocenie 12646, pomógł 655 razy. Jest z nami od 2014 roku.
  • REKLAMA
📢 Słuchaj (AI):
REKLAMA