Department of InformatiX
Microsoft .NET Micro Framework Tools & Resources

Během svého prvního většího .NET Micro Framework projektu jsem potřeboval vyvíjet kód a zkoušet jej doma na emulátoru, kolega na Tahoe desce a nakonec jsme jej také nahrávali přímo do Meridianu ve finálním zařízení. Na vývojové desce ani emulátoru se nedá vyzkoušet všechno, a zapojení vývojové desky se lišilo od zapojení v zařízení. Abychom nemuseli neustále v nastavení projektu přepínat, kam se má kód nahrát a dokola přepisovat deklarace, nebo dokonce udržovat tři různé projekty, využili jsme drobnou vychytávku Visual Studia, aby udělalo tuto špinavou práci za nás.

Direktivy

Direktivy jsou řádky kódu, které obsahují informace pro kompilátor. Umožňují přeskakovat kusy kódu během kompilace, generovat hlášení nebo chyby, seskupovat části kódu do celků a některé další drobnosti. Pro detaily včetně příkladů doporučuji podívat se na C# Language Specificiation.

Nejznámější pro většinu z vás bude nejspíš dvojice #region a #endregion. Ty jsou spíše takovou výjimkou, jelikož kompilátor je ignoruje (ve skutečnosti je převádí na #if true a #endif). Za to je využívá Visual Studio k tomu, aby nám umožnilo takto označený region schovat do jednoho řádku:

Sreenshot rozbaleného a sbaleného regionu

My budeme ale potřebovat direktivy podmíněné kompilace, mezi které patří #if, #elif, #else a #endif. Jejich úkolem je označit část souboru, který má nebo nemá být zkompilována podle z toho, zda jsou nadefinovány tzv. podmíněné symboly. Můžete si je představit jako booleovské proměnné, které mají hodnotu buď true, jsou-li nadefinované, nebo false, pokud nejsou. Existují dva způsoby, jak lze symbol nadefinovat. Buď na začátku souboru direktivou #define (nesmí být před ní žádný kód programu), nebo pomocí /define parametru kompilátoru. Druhá možnost je zpřístupněna v uživatelském rozhraní Visual Studia, ukážeme si ji později.

Za #if nebo #elif musí následovat booleovský výraz, přičemž standardní operátory jako && a || jsou povoleny. Pokud se během kompilace výraz vyhodnotí jako true, následný kód je zkompilován, v opačném případě nikoliv. Odpovídající část souboru je zcela přeskočena, může dokonce obsahovat chyby. Např:

#define SOBOTA #if SOBOTA || NEDĚLE #define VÍKEND #endif using Microsoft.SPOT; // jakýkoliv kód musí být až za #define class Program { public static void Main() { #if VÍKEND Debug.Print("Je víkend!"); // tato řádka se zkompiluje #else Debug.Print("Je pracovní den."); // tuto nenajdete ani Reflectorem #endif } }

Visual Studio

Solution ve Visual Studiu může mít několik konfigurací. Ke každému projektu jsou při jeho založení vytvořeny dvě výchozí konfigurace - Debug a Release. Máte je neustále na očích v Standard toolbaru a lze mezi nimi kdykoliv snadno přepnout:

Screenshot Standard toolbaru

Trik spočívá v tom, že každá konfigurace si udržuje vlastní nastavení projektu a parametry kompilace. Využijeme toho tedy k tomu, abychom výběrem konfigurace definovali různé podmíněné symboly, a také změnili místo, kam se bude zkompilovaný program nahrávat. V seznamu konfigurací v toolbaru vyberte položku Configuration Manager....

Screenshot Configuration Manageru

V seznamu Active solution configuration: vyberte New..., a založte novou např. se jménem Emulator a stejným způsobem ještě jednu Tahoe. Nyní provedeme kýžené nastavení ve vlastnostech projektu. Na kartě Build lze uvést podmíněné symboly, které budou definovány pro všechny soubory v projektu (direktiva #define má platnost pouze pro soubor).

Screenshot Build karty

Symboly lze definovat v poli Conditional compilation symbols. Pokud chcete definovat více symbolů, můžete je oddělit mezerou. Já jsem pro konfiguraci Tahoe definoval symbol TAHOE, a pro Emulator TAHOE a EMULATOR (používám Tahoe emulátor, takže určený pro Tahoe je relevantní). Výchozí Debug konfigurace např. definuje symbol DEBUG.

Na kartě Micro Framework vyberte pro Tahoe nahrávání do Tahoe, a pro konfiguraci Emulator spouštění Tahoe emulátoru. Konfiguraci, pro kterou nastavení provádíte, lze vybrat v seznamu Configuration:

Screenshot Micro Frameworku

Řekněmě, že máme standardní konfiguraci Debug pro nahrávání do modulu. Přepínáním konfigurace v toolbaru pak můžete ovlivňovat třeba deklarace portů (dokonce celý enum TahoePins může podmíněn):

Kód s konfigurací Debug Kód s konfigurací Tahoe

Když stisknete F5, program běží na zařízení, když v toolbaru vyberete Emulator, F5 a běží na emulátoru. Žádné složité nastavování.

Navíc můžete direktivy vnořovat i do sebe, např:

#if TAHOE public static readonly Cpu.Pin Relay1 = TahoePins.PB12; public static readonly Cpu.Pin Relay2 = TahoePins.PA8; public static readonly Cpu.Pin Relay3 = TahoePins.PB13; #if EMULATOR public static readonly Cpu.Pin Relay4 = TahoePins.PA9; #else public static readonly Cpu.Pin Relay4 = TahoePins.PB14; #endif #else public static readonly Cpu.Pin Relay1 = Meridian.Pins.GPIO4; public static readonly Cpu.Pin Relay2 = Meridian.Pins.GPIO12; public static readonly Cpu.Pin Relay3 = Meridian.Pins.GPIO5; public static readonly Cpu.Pin Relay4 = Meridian.Pins.GPIO6; #endif

Třeba vám to ušetří trochu času. ;-)

Comments
Sign in using Live ID to be able to post comments.