För att korrekt representera decimalbråk i datorer måste dessa omvandlas till binära bråktal. Dock är binära bråktal generellt sett inte kapabla att exakt representera alla decimalbråk med ett begränsat antal bitar, särskilt när det handlar om små tal, som till exempel decimalen 0,01. Denna decimal kan inte representeras exakt med binära bråktal, utan blir en oändligt upprepande binär sekvens. Därför måste designteamet för en given applikation noggrant bestämma hur noggrant decimalbråken behöver vara och hur många bitar som krävs för att uppnå den önskade precisionen.

Vid applikationer som hanterar värden som skatter, där det inte finns något heltalsdel, kan alla bitar användas för att representera den fractionella delen. Binära ord kan då tolkas som (N, N), där N är antalet bitar. När det däremot finns en begränsad heltalsdel, kan antalet bitar som används för att representera heltalet bestämmas, och resten kan användas för den fractionella delen. Ett exempel kan vara om ett binärt ord är 32 bitar och heltalsdelen aldrig överstiger 255. Då kan de översta 8 bitarna användas för heltalsdelen, medan de återstående 24 bitarna används för den fractionella delen. I sådana fall kan tabeller som utvecklas för att approximera decimalvärden vara användbara för att avgöra hur nära de binära representationerna kommer att ligga de ursprungliga decimalvärdena.

Vid optimering av programkod för inbyggda system, särskilt vid bearbetning av loopar, kan modest förbättrade körningstider uppnås genom noggrant organiserade loopar. Detta är särskilt effektivt om det kombineras med lämplig minnesorganisation och användning av särskilda minnen för temporär lagring, så kallade scratchpad-minnen. En vanlig teknik för att optimera loopbearbetning är "loop unrolling" eller loopupprullning. Vid denna teknik kombineras flera exekveringar av en loop till en större loop med lämpliga justeringar för loopens inkrement och avslutningskontroller. Detta minskar antalet gånger som avslutningskontrollen måste utföras, vilket kan spara tid om kontrollen är tidskrävande. Om antalet loopexekveringar är relativt litet och fast, till exempel alltid fem, kan kroppen av loopen helt enkelt kopieras fem gånger, vilket eliminerar behovet av loopkontroll.

För att förtydliga, överväg exemplet där en array måste initialiseras med ett fast antal element. Om antalet element är ett jämnt tal, kan elementen initialiseras två och två, vilket minskar antalet iterationer och därmed antalet kontrolltester i loopen. Om systemet dessutom använder cache eller scratchpad-minne kan cachemissar minskas eftersom närliggande element sannolikt kommer att laddas in i den lokala lagringen samtidigt. Ett annat exempel är när loopen har ett relativt litet och fast antal iterationer, och loopens kropp inte är för komplex. I sådana fall kan loopen ersättas av direkt kod utan loop, vilket gör att kompilatorer kan optimera körningstiden ytterligare genom att förbereda adresser för arrayelement vid kompilering snarare än vid körning.

Det är också möjligt att ersätta vissa loopar som endast fyller minnet med ett särskilt värde med inbyggda maskininstruktioner, som en "memory-fill" instruktion som finns i vissa processorer. Om loopen initialiserar en array till exempelvis noll, kan den ersättas med en enda maskininstruktion. I vissa fall kan flera loopar slås samman för att uppnå effektivitet, men detta måste övervägas noggrant, särskilt med tanke på hur cachebeteende påverkas om cacheminnet är relativt litet jämfört med storleken på de arrayer som används.

En ytterligare optimering kan vara att slå ihop flera loopar som utför relaterade uppgifter. Om två arrayer måste initialiseras och en tredje array ska fyllas med summan av de två första, kan en enda loop användas i stället för att ha separata loopar för varje operation. Om inget cache är inblandat, kan detta minska overheaden för flera loopar och potentiellt öka exekveringseffektiviteten. Om cache däremot används, kan detta medföra fler cachemissar eftersom varje iteration kommer åt minne från olika minnesblock (tre olika arrayer). Därför kan det vara mer effektivt att separera operationerna om systemet använder cache.

Det är också viktigt att tänka på hur kodens storlek och komplexitet kan påverka systemets prestanda. Om kodstorleken är för stor kan det bli problematiskt för system som har begränsat minne, och optimeringstekniker som loopupprullning kanske inte är möjliga att använda effektivt. På samma sätt kan det finnas situationer där kodens exekveringstider inte kan minskas ytterligare utan att påverka resultatet negativt.

Hur fungerar olika nätverksstrukturer i inbäddade system?

I inbäddade system används olika nätverksstrukturer, var och en med sina fördelar och nackdelar beroende på specifika krav som tillämpningen ställer. Nätverken kan vara antingen statiska eller dynamiska, och de vanligaste strukturerna är linjära nätverk, ringnätverk och stjärnnätverk. Här går vi igenom dessa strukturer och deras specifika egenskaper i detalj.

Linjära nätverk innebär att enheter är kopplade längs en enkel bana, som i RS232- eller IIC-bussar. En av de största fördelarna med denna struktur är dess enkelhet, vilket gör att den är lätt att implementera i många tillämpningar. Enhetens anslutning till nätverket är enkel, men om en enhet misslyckas kan nätverket fortfarande fungera så länge som den specifika noden inte är kritisk för kommunikationen. Fördelen med linjära nätverk är alltså deras robusthet mot små fel i systemet. En nackdel är dock att de inte alltid är optimala för realtidsapplikationer där latens och noggrann tidsstyrning är avgörande. Den tekniska implementeringen beror starkt på den använda kommunikationsprotokollet.

Ringnätverk har en något mer avancerad struktur där noderna är kopplade i en sluten cirkel. Varje nod är både en avsändare och en mottagare, vilket gör att informationen kan flöda i en enda riktning. Fördelen med denna struktur är att den är mycket enkel att implementera. De kan också erbjuda förutsägbarhet i tid och latens, vilket är viktigt för realtidsbehandling. Speciellt i ett "token ring"-nätverk, där endast den nod som innehar tokenet kan skicka meddelanden, elimineras risken för kollisioner på bussen och nätverkets latens blir förutsägbar.

En annan fördel är att dessa nätverk inte lider av någon form av bussinnehavarkollaps, vilket gör dem användbara för system där en förutsägbar överföring av data är en nödvändighet. Men det finns också betydande nackdelar. Om en nod eller länk går ner kan hela nätverket bryta samman, vilket gör denna lösning mindre lämplig för tillämpningar med batteridrivna enheter, där strömförsörjningen kan vara en begränsande faktor. Dessutom innebär det faktum att alla noder måste vänta på sin tur att skicka data att den totala väntetiden för kritiska meddelanden kan bli för lång, vilket påverkar realtidskapaciteten.

I stjärnnätverk är en central nod kopplad till ett antal andra noder, men noderna är inte direkt kopplade till varandra. Detta gör att denna struktur erbjuder enklare felsökning och mindre komplexitet när det gäller kommunikation mellan noder. Om en nod misslyckas, påverkar det inte hela nätverket så länge som den centrala noden fungerar korrekt. Stjärnnätverk är vanligen mer flexibla än andra strukturer, men beroendet av den centrala noden kan vara en flaskhals om denna nod skulle falla bort eller om det finns för många anslutna enheter.

Nätverksstrukturer som meshnätverk erbjuder mer flexibilitet än de andra. Meshnätverk tillåter dynamisk omkoppling och nya noder att gå med i nätverket eller lämna det utan att påverka den övergripande nätverksfunktionen. Denna flexibilitet gör dem användbara i IoT-applikationer där objekt rör sig, såsom djurspårning eller fordonsövervakning inom ett geografiskt begränsat område. En stor fördel med meshnätverk är deras förmåga att hålla systemet i drift även om en del av nätverket misslyckas, vilket ger ökad tillförlitlighet i kritiska applikationer. Dock är det en komplexitet att hantera eftersom varje nod i mesh kan fungera både som en router och som en dataenhet.

För att förstå dessa nätverksstrukturer är det viktigt att också överväga den specifika tillämpningens krav. Till exempel, i realtidsinbyggda system där tidskritiska data måste levereras utan fördröjning, kan vissa nätverksstrukturer som ringnätverk eller stjärnnätverk vara mer lämpliga än andra, beroende på nätverkets storlek och komplexitet. Samtidigt måste inbäddade systemingenjörer vara beredda på att hantera de potentiella problem som uppstår vid nätverksfel eller förlust av noder, särskilt om dessa är i avlägsna eller svårtillgängliga områden.

Hur Ethernet och Switchar Förbättrar Nätverkskommunikation i Inbyggda System

Ethernet har länge varit ett grundläggande alternativ för att koppla samman enheter i både hemmamiljöer och kontor, och används även i andra tillämpningar där avstånden mellan enheter kan vara upp till 100 meter i trådbundna nätverk eller upp till 2 kilometer i fiberoptiska nätverk. I situationer där det inte är praktiskt att dra kablar mellan alla enheter i ett system, kan användning av repeatrar, trådlösa adaptrar, routrar och bryggor möjliggöra Ethernet-användning över längre avstånd eller i mer komplexa system. Ursprungligen var Ethernet utformat som ett linjärt nätverk som använde koaxialkablar och CSMA/CD (Carrier Sense Multiple Access with Collision Detection) för att hantera kollisioner. Men när antalet enheter på Ethernet-nätverk ökade började prestanda försämras på grund av kollisioner, vilket ledde till utvecklingen av switchar – en lösning som drastiskt minskade eller helt eliminerade kollisionerna.

Idag används Ethernet-anslutningar vanligtvis med tvinnade parkablar och 8P8C-kontakter (vanligtvis kända som RJ45), vilket gör det möjligt för full-duplexöverföring. Ethernethastigheter kan nå upp till 400 Gbps, beroende på vilket överföringsmedium som används (koppar eller fiberoptik) och avståndet mellan enheterna. Många avancerade processorer, som till exempel Luminary-serien, har inbyggda Ethernet-sektioner som implementerar både MAC- och PHY-lagren för Ethernet. För lågkostnadsapplikationer finns även billiga chipsets tillgängliga, vilket gör det möjligt för ingenjörer att designa Ethernet-tillägg till enkla bearbetningselement för inbyggda system.

För att hantera kollisioner i nätverket används enheter som bryggor och senare switchar. Dessa enheter har flera Ethernet-portar och förändrar sättet enheter är anslutna till nätverket. Istället för att varje dator är direkt ansluten till alla andra datorer på nätverket, kopplas varje dator till en switch, vilket gör anslutningen punkt-till-punkt och full-duplex. Denna struktur eliminerar kollisioner på de direkta länkarna. Switchen distribuerar sedan anslutningen till sina andra portar. Till exempel, om switchen har åtta portar, skulle en användas för att ansluta till datorn och de andra sju till andra delar av nätverket. Varje port på switchen fungerar som sin egen kollisionsdomän, vilket reducerar sannolikheten för kollisioner på nätverket.

En viktig fördel med switchar är att de minskar nätverkstrafik genom att lagra adresser för varje enhet på nätverket. När switchen först sätts på har den ingen information om enheterna på nätverket och vidarebefordrar alla paket som tas emot på en port till alla andra portar. Men när den har fått information om källadresserna för varje paket som passerar genom den, kommer den att skicka paketet till rätt port, vilket effektiviserar trafiken och minskar nätverksbelastningen. Därmed förbättras både prestandan och effektiviteten i nätverket.

Switchen använder en teknik som kallas "store-and-forward" där den tar emot och lagrar hela paketet innan det vidarebefordras. Detta gör att switchen kan utföra tester på paketen för att se om de är korrupta eller för små och radera sådana paket innan de skickas vidare. Ett alternativ till store-and-forward är "cut-through", där switchen vidarebefordrar paketet så snart den har fått destinationsadressen. Denna metod minskar fördröjningen men missar att detektera korrupta paket. Vissa mer avancerade switchar kan även utföra operationer på högre OSI-nivåer, och en router, som är en mer sofistikerad enhet än en switch, har även kapacitet att koppla samman flera nätverk, exempelvis bredbandsnätverk.

Ethernet-paket, eller ramar, har två format: ett på MAC-nivå och ett på PHY-nivå. MAC-adresser är 48-bitars unika identifierare som tilldelas nätverksinterfacekontroller (NIC) och används för att identifiera enheter på det fysiska lagret av nätverket. MAC-ramen kapslas in i en PHY-ram, och dessa ramar innehåller fält som gör det möjligt för enheter att synkronisera sina klockor och säkerställa att data överförs korrekt.

Ethernet är dock inte den enda lösningen för nätverkskommunikation. Wi-Fi, som utvecklades som ett trådlöst alternativ till Ethernet, har också fått stor spridning, särskilt i hemanvändning och i miljöer där kablar är svåra eller omöjliga att använda. Båda dessa teknologier, Ethernet och Wi-Fi, har sina fördelar och begränsningar, och valet mellan dem beror på den specifika tillämpningen och de krav som ställs på hastighet, räckvidd och stabilitet.

För en inbyggd systemdesigner är det viktigt att förstå hur olika nätverkslösningar fungerar och de specifika krav som ställs på kommunikationen mellan enheter. Ethernet är fortfarande en av de mest robusta och pålitliga lösningarna, särskilt för system som kräver hög överföringshastighet och tillförlitlighet på längre avstånd. I moderna inbyggda system är det också nödvändigt att integrera Ethernet-kommunikation på ett sätt som möjliggör smidig kommunikation mellan många enheter, samtidigt som systemet är tillräckligt skalbart för att hantera ökade krav på både hastighet och komplexitet.

Det är också viktigt att förstå de tekniska detaljerna som rör hantering av kollisioner, adressering och paketförmedling. För att säkerställa effektivitet och förhindra överbelastning på nätverket måste dessa element noggrant implementeras i både hårdvara och mjukvara. Användningen av switchar för att isolera kollisionsdomäner är en nyckelstrategi för att förbättra prestandan, särskilt i nätverk med många anslutna enheter.