Embedded · Benchmark na sprzęcie
Ten sam kod źródłowy — panel LED 64×64, FreeRTOS + CycloneTCP — zbudowany pięcioma wariantami toolchaina i zmierzony licznikiem cykli bezpośrednio na STM32F429. Cały eksperyment, od kodu przez kompilacje po pomiar i weryfikację na fizycznym panelu, wykonał agent AI.
Ostatnia aktualizacja:
01 / Punkt wyjścia · Znajome zdanie
Za to zdanie płaci się dwa razy: raz w licencjach (7 565 zł netto rocznie za stanowisko Keil MDK Professional), drugi raz w przekonaniu, że w zamian dostaje się szybszy i mniejszy firmware. Pierwszą pozycję widać na fakturze. Drugą postanowiliśmy po prostu zmierzyć — nie na syntetycznym benchmarku z ulotki, tylko na kompletnym, produkcyjnym firmware z RTOS-em i stosem sieciowym, wgranym na prawdziwą płytkę.
02 / Wynik · Jeden wykres
Każdy punkt to jeden kompletny firmware wgrany i zmierzony na płytce. Ideał — mały i szybki — leży w lewym dolnym rogu. Warianty Keila siedzą w prawej, „ciężkiej” części wykresu i nie schodzą poniżej 194 ms. GCC −O2 tuned łączy mały rozmiar z czasem niedostępnym dla Keila — dominuje wykres w sensie Pareto.
03 / Anatomia · Winowajca
Cykle CPU w podziale na trzy testy (wspólna skala, 100% = GCC −O0). W obu „fabrycznych” buildach GCC czas pożera segment MEM — bajtowe memcpy/memset z newlib-nano. Podmiana tych trzech funkcji (fast_libc.c) skraca pasek o ~40 mln cykli; u Keila analogiczny segment to wciąż 25 mln.
segmenty od lewej: INT (pełny kolor) · FLOAT (72%) · MEM (najjaśniejszy)
04 / Pamięć · Ile zostaje na rozwój
Każdy punkt to 16 kB z 2 MB flasha STM32F429. Firmware z GCC −O2 zajmuje 13 ze 128 bloków; Keil potrzebuje ich prawie trzykrotnie więcej. Wolna przestrzeń to realny zapas na rozwój produktu — kolejne funkcje, fonty, bufory.
05 / Dane · Bez skrótów
| Test | Keil default | Keil −O2+split | GCC −O0 | GCC −O2 | GCC −O2 tuned | Najlepszy |
|---|---|---|---|---|---|---|
| ROM (kod + dane) | 536,7 kB | 509,7 kB | 584,2 kB | 210,2 kB | 219,7 kB | GCC · 2,4× |
| INT — pętla LCG, 200 tys. iteracji | 19 ms | 19 ms | 83 ms | 14 ms | 5 ms | tuned · 3,35× |
| FLOAT — sinf() na FPU, 20 tys. iteracji | 24 ms | 26 ms | 49 ms | 40 ms | 14 ms | tuned · 1,73× |
| MEM — memset+memcpy, 500 × 4 kB | 149 ms | 148 ms | 273 ms | 273 ms | 31 ms | tuned · 4,70× |
| RAZEM | 194 ms | 194 ms | 406 ms | 327 ms | 51 ms | tuned · 3,75× |
Warianty. Keil MDK 5.37 (ARMCC 5.06u7): „default” to domyślna optymalizacja armcc (≈−O2 — jawne ustawienie −O2 nie zmieniło czasów, zmniejszyło tylko ROM przez split sections). GCC: Arm GNU Toolchain 14.2.Rel1, newlib-nano, linker script z SW4STM32.
Wariant „tuned” = GCC −O2 + trzy zmiany: (a) własne słowo-po-słowie memcpy/memset i wielomianowy sinf (fast_libc.c — nadpisują bajtowe wersje newlib-nano przy linkowaniu), (b) -ffast-math -funroll-loops (główny zysk w INT), (c) prefetch flasha (FLASH_ACR_PRFTEN).
Uczciwość porównania. Prefetch włączono w kodzie wspólnym i Keil został z nim przebudowany i zmierzony ponownie — wynik identyczny co do ~0,001% (pętle mieszczą się w I-cache ART). Ta sama technika fast_libc.c dołączona do projektu Keila poprawiłaby i jego wynik — ale kompilator open-source już teraz robi to samo zadanie szybciej, mniejszym binarium i za darmo.
Weryfikacja. Każdy wariant flashowany na płytkę i sprawdzony: baner SWO (toolchain + wyniki DWT), animacja scrollującego tekstu na kamerze RTSP, ping i panel HTTP. Pomiar: DWT→CYCCNT @ 168 MHz, jednorazowo po starcie, sekcja krytyczna bez sieci.
06 / Koszty · Cena toolchaina
Benchmark wyżej pokazuje, że open source jest szybszy i mniejszy. Cennik dopowiada resztę: Keil MDK jest dziś sprzedawany wyłącznie w subskrypcji per stanowisko, a Arm GNU Toolchain — ten sam, który wygrał ten benchmark — jest bezpłatny również w projektach komercyjnych.
Zespół 5 inżynierów, horyzont 3 lat — same licencje toolchaina (PLN netto)
| Licencja | Model | Cena katalogowa | W PLN netto | Status |
|---|---|---|---|---|
| MDK v6 Community | subskrypcja | 0 $ | 0 zł | tylko projekty niekomercyjne |
| MDK v6 Essential | subskrypcja / rok / stanowisko | 999 $ / rok | 3 780 zł / rok | w sprzedaży |
| MDK v6 Professional | subskrypcja / rok / stanowisko | 1 999 $ / rok | 7 565 zł / rok | w sprzedaży |
| MDK v5 Essential | wieczysta node-locked + 20% / rok maintenance | 3 840 $ | ≈14 600 zł | wycofana — sprzedaż do 30.06.2025 |
| MDK v5 Plus | wieczysta node-locked + 20% / rok maintenance | 6 600 $ | ≈25 100 zł | wycofana |
| MDK v5 Professional | wieczysta node-locked (floating ~20% drożej) | 9 500 $ | ≈36 100 zł | wycofana |
| Arm GNU Toolchain (GCC) | open source — Twój firmware na dowolnej licencji | 0 $ | 0 zł | bez ograniczeń komercyjnych |
Subskrypcje MDK v6: oficjalny sklep Arm (store.arm.com), ceny wyświetlane w PLN netto, stan: lipiec 2026 (katalogowo 999 $ Essential i 1 999 $ Professional rocznie). Subskrypcja 3-letnia ok. 20% taniej; u dystrybutorów (np. DigiKey) bywa ok. 15% drożej. Darmowa edycja Community obejmuje wyłącznie projekty niekomercyjne.
Licencje wieczyste MDK v5 (już niedostępne): ceny wg archiwalnych cenników dystrybutorów Keil (USD; zbieżne z archiwalnym sklepem Arm), przeliczone po ~3,8 zł/USD. Arm zakończył ich sprzedaż 30 czerwca 2025, a odnowienia maintenance przyjmuje tylko do 30 czerwca 2026. Maintenance kosztował 20% ceny licencji rocznie (40% przy wznowieniu po przerwie); pierwszy rok był wliczony.
Wykres „5 inżynierów × 3 lata”: licencje node-locked per stanowisko, ceny bieżące ze sklepu Arm (5 × 3 × 7 565 zł ≈ 113 tys. zł; 5 × 3 × 3 780 zł ≈ 57 tys. zł), bez rabatów wolumenowych i bez kosztów administracji licencjami.
07 / Puenta · Za kulisami
Dopisanie benchmarku do firmware, pięć kompilacji dwoma toolchainami, flashowanie, pomiary na sprzęcie i weryfikacja obrazu na fizycznym panelu LED — agent zrobił to wszystko sam, sterując narzędziami z linii poleceń.
Agentowe programowanie embedded działa też na komercyjnym stacku. Keil ma CLI (UV4.exe -r), STM32CubeProgrammer flashuje i czyta SWO z konsoli — agent w pętli edytuje kod, buduje, wgrywa i czyta logi ITM szybciej, niż człowiek zdąży przeklikać się przez µVision. Każda iteracja „zmiana → build → flash → dowód w SWO” zamykała się w ~2 minuty, a numer buildu w banerze startowym dawał twardy dowód, że na płytce działa właściwy firmware.
Keil w tej pętli pozostaje wąskim gardłem: zamknięty kompilator bez wglądu w biblioteki, licencja per stanowisko, tylko Windows. Agent może go obsługiwać, ale nie może z nim współpracować. Z narzędziami open-source pętla domyka się w całości:
memcpy okazał się bajtowy, agent to zobaczył w źródle i napisał zamiennik, zamiast zgadywać, co robi czarna skrzynka;printf przez SWO, zero dodatkowego sprzętu;Zamknięte IDE ogranicza agenta do roli klikacza. Otwarty toolchain robi z niego inżyniera: może przeczytać źródło biblioteki, zmierzyć skutek na sprzęcie i poprawić wynik — w jednej, samodzielnej pętli.
Do startu nie potrzeba nic, czego już nie macie: toolchain jest darmowy, płytka leży na biurku — a jak wdrażamy takie pętle w zespołach, opisujemy na stronie AI dla embedded.
Pomiar: 16.07.2026 · DWT→CYCCNT @ 168 MHz · Keil MDK 5.37 (ARMCC 5.06u7) · Arm GNU Toolchain 14.2.Rel1 · weryfikacja: SWO + kamera RTSP + HTTP
08 / Czytaj dalej
Ten sam workflow build → flash → weryfikacja, spakowany do pobrania — z konfiguratorem pod Twoją płytkę.
Jak wdrażamy agentów AI w zespołach firmware i elektroniki.
Warsztat na żywym kodzie Twojego zespołu — z weryfikacją na prawdziwym sprzęcie.
Wdrożenie u Was
Bierzemy jeden Wasz projekt, uruchamiamy agentową pętlę build → flash → pomiar na Waszym sprzęcie i pokazujemy liczby: czas iteracji, rozmiar binarki, koszt licencji. Audyt 90 minut wystarczy, żeby ustalić, od czego zacząć — bez zobowiązań.