nesC
nesC (uttalas "NES-see") är ett komponentbaserat , händelsestyrt programmeringsspråk som används för att bygga applikationer för TinyOS -plattformen. TinyOS är en operativ miljö utformad för att köras på inbäddade enheter som används i distribuerade trådlösa sensornätverk . nesC är byggt som en förlängning av programmeringsspråket C med komponenter "kopplade" ihop för att köra applikationer på TinyOS. Namnet nesC är en förkortning av "nätverks inbyggda system C".
Komponenter och gränssnitt
nesC-program är byggda av komponenter, som är sammansatta ("kabelanslutna") för att bilda hela program. Komponenter har intern samtidighet i form av uppgifter. Styrtrådar kan passera in i en komponent via dess gränssnitt. Dessa trådar är rotade antingen i en uppgift eller ett hårdvaruavbrott.
Gränssnitt kan tillhandahållas eller användas av komponenter. De tillhandahållna gränssnitten är avsedda att representera den funktionalitet som komponenten tillhandahåller sin användare, de använda gränssnitten representerar den funktionalitet som komponenten behöver för att utföra sitt jobb.
I nesC är gränssnitt dubbelriktade: De specificerar en uppsättning funktioner som ska implementeras av gränssnittets leverantör (kommandon) och en uppsättning som ska implementeras av gränssnittets användare (händelser). Detta gör att ett enda gränssnitt kan representera en komplex interaktion mellan komponenter (t.ex. registrering av intresse i någon händelse, följt av en återuppringning när den händelsen inträffar). Detta är avgörande eftersom alla långa kommandon i TinyOS (t.ex. skicka paket) är icke-blockerande; deras slutförande signaleras genom en händelse (skicka klar). Genom att ange gränssnitt kan en komponent inte anropa send-kommandot om den inte tillhandahåller en implementering av sendDone-händelsen. Kommandon anropar vanligtvis nedåt, dvs från applikationskomponenter till de som är närmare hårdvaran, medan händelser anropar uppåt. Vissa primitiva händelser är bundna till hårdvaruavbrott.
Komponenter är statiskt länkade till varandra via sina gränssnitt. Detta ökar körtidseffektiviteten, uppmuntrar robust design och möjliggör bättre statisk analys av program.