WindWiz

En GSM-uppkopplad vindmätare

Size matters

Flygsäsongen lider mot sitt slut, åtminstone för alla oss som ogillar att flyga i minusgrader. Någon vindmätare finns fortfarande inte ute på fältet, vilket är lite av en besvikelse. Arbetet fortgår dock fortfarande, om än långsamt.

I föregående vecka har jag slutfört arbetet med bootladdaren och det utökade stödet för flashladdning över en mjukvaruserieport. I all hast adderade jag även en grundläggande integritetskontroll för serielänken, vilket delvis kan användas för att verifiera serieportsimplementationen, och givetvis för att förhindra timmar av meningslös debugging som orsakats av att inkorrekt programvara skrivits ner i flashminnet på vindmätaren. Ett enstaka bitfel här och där kan kanske verka ofarligt, men tro mig — MYCKET kan gå snett.

Med denna nya funktionalitet på plats i Magboot kan jag nu återgå till att hacka på själva vindmätaren igen! Hurray!

Avslutar med lite Magboot-statistik som jag utvunnit ur mitt källkodsförråd. Nedan plot visar binärstorlek för Magboot mot en tidslinje (uttryckt i commit, i kronologisk ordning). Man kan tolka grafen som programmets storlek över tid, sedan jag började utvecklingen i slutet av Februari.

I och med introduktionen av stöd för mjukvaruserieport bygger Magboot numera två binärer, en med stöd för hårdvaruserieport (”HWUART”-versionen) och en med det nya mjukvaruserieportsstödet (”SWUART”-versionen). Den blå linjen visar SWUART-storlek och den röda representerar HWUART-storlek. Båda versionerna integrerar givetvis det nya verifieringsstödet. Grafen är egentligen ganska meningslös att titta på, men man kan dra några slutsatser:

  1. Ingen version överstiger 1024 bytes, vilket är den övre smärtgränsen. En tidig version av Magboot vägde faktiskt in under 512 byte och fick därmed plats i en ännu mindre bootsektor, men fick skrotas i förmån för mer läsbar kod och ny funktionalitet.
  2. SWUART-versionen väger in på ca 100 bytes mer — ganska nätt med tanke på hur mycket mer mjukvara det handlar om.
  3. Commit #4 adderade stöd för sidbuffring av serieportsdata. Detta gjorde överföringar betydligt mer tillförlitliga.
  4. Commit #8, #10 minskar storleken genom att plocka bort överflöda kommandon och viss EEPROM-hantering, som Magboot ändå inte har stöd för.
  5. Commit #11 ökar förvånadsvärt mycket för den lilla kodmängd som tillförs. Det handlar om en funktion som gör att Magboot ej exekverar utan lämnar över till programmet i flash, förutsatt att vissa villkor uppfylls. Används för att snabba upp ”normal” omstart av enhet. Detta är ett typiskt ställe i koden där man troligtvis skulle kunna optimera ytterligare för binärstorlek.
  6. Vid commit #21 introduceras SWUART-versionen, som även får HWUART-versionen att minska något i storlek, vilket jag inte kan förklara. Skillnaden är att viss kod brutits ut i en separat fil. Min erfarenhet av kompilatorer är att optimeringsrutinerna oftast fungerar bäst när kod samlas i samma fil. Detta beror på att ”whole-program optimization”, dvs att optimering även sker i länkfasen av körning, ännu är en omogen teknologi i GCC. Förvisso har AVRs GCC port troligtvis fallit väldigt långt bakom vad det gäller optimeringar, vilket är trist. Håller ett öga på LLVMs AVR port, that’s for sure!
  7. Likt #8 plockar commit #22 bort ännu ett kommando som blivit överflödigt under utvecklingen. Den bidrar till ett välkomnat drop i filstorlek.
  8. Sist men absolut störst är #25, som adderar det nya stödet för integritetskontroll. En ökning på ca 100 bytes, vilket är i överkant. Jag kommer förmodligen bli tvingad att se över koden igen, checksummeringsrutinen är långt ifrån ”optimerad för storlek”. Det är i stunder som dessa när högnivåprogrammeraren i mig skriker: ”Men jag ska inte behöva ta hänsyn till filstorlek när jag uttrycker mig i programkod!”.
Annonser

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: