I dagens moderna inbäddade system är hanteringen av parallellism och uppstartstider två grundläggande aspekter som påverkar systemets prestanda och pålitlighet. För att förstå detta behöver man granska både den tekniska strukturen hos processorer och hur dessa interagerar med olika typer av hårdvara och mjukvara under uppstart och drift.

När det gäller parallellism i processorer, handlar det om hur instruktioner utförs samtidigt istället för i sekventiell ordning. Denna form av parallellism, ofta kallad VLIW (Very Long Instruction Word), kräver att både hårdvaran och mjukvaran optimeras för att dra full nytta av de parallella processerna. I praktiken innebär detta att kompilatorer måste känna till processorplattformens arkitektur och kunna omarrangera operationerna i koden utan att förändra den ursprungliga kodens semantik. Detta är en komplex uppgift, och även om sådana kompilatorer existerar, är det en process som kräver noggrannhet och specialisering.

Men VLIW-parallellism medför inte bara fördelar. När en instruktion i ett paket leder till ett hopp, kan flera av de övriga instruktionerna bli irrelevanta, eftersom de skulle ha följt efter hoppet i en sekventiell version av koden. För att hantera detta på en hårdvarunivå krävs det särskilda mekanismer. De flesta VLIW-processorer hanterar detta genom att detektera och anpassa sig till hopp under körning, men det är viktigt att förstå att inte alla processorer klarar detta lika effektivt. Detta är något som inbäddade systemingenjörer måste beakta när de väljer en processor för ett specifikt projekt, eftersom felaktig hantering av hopp kan leda till försämrad prestanda eller systemkrascher.

En annan aspekt av processorer som påverkar deras användning i inbäddade system är skillnaderna mellan processorer inom samma familj. Ett exempel på detta är TS320-serien, där man ser ett brett spektrum av funktioner i olika processormodeller. Vissa TS320-processorer har en enkel ARM-instruktionsuppsättning, medan andra erbjuder avancerade funktioner som VLIW-instruktioner, MAC (multiply-accumulate) instruktioner, och till och med inbyggd digital media-hårdvara. Detta illustrerar varför det finns ett stort antal olika processorer på marknaden, och varför ingen processor passar för alla applikationer. För ingenjörer är det avgörande att välja en processor som matchar de specifika behoven i det aktuella projektet och säkerställa att den valda processorn kan utnyttja de avancerade funktionerna på ett effektivt sätt.

En annan kritisk aspekt är uppstartstiden för processorer och andra kretsar i systemet. Till skillnad från enklare digitala kretsar, såsom lågkostnads-FPGAs, som startar nästan omedelbart när strömmen når en viss nivå, kräver processorer vanligtvis extra tid för att initiera interna register och system. Till exempel kräver en 8051-processor minst två maskincykler för att initialisera sina speciella funktionregister. I mer avancerade system som Stellaris-processorer kan uppstarten ta upp till en millisekund. Denna initieringstid är avgörande, eftersom den påverkar hur snabbt systemet kan börja bearbeta instruktioner och aktivera de olika komponenterna i systemet.

Flera faktorer kan påverka uppstartstiden för ett inbäddat system. För det första finns det den interna initieringen som sker när spänningen når den operativa tröskeln. Denna initieringstid kan hittas i databladet för den aktuella komponenten. För det andra kan olika kretsar ha olika aktiveringsspänningar och därmed olika uppstartstider, även om de arbetar vid samma spänning. Det är också viktigt att beakta ramp-up-tiden, dvs. den tid det tar för spänningen att öka från 0 V till den driftspänning som krävs för att systemet ska fungera korrekt.

Den tredje faktorn är den mjukvara som körs på processorn. När strömmen slås på måste mjukvaran initialisera sina egna programvariabler och säkerställa att alla externa kretsar är korrekt konfigurerade. Ofta kommer processorn att ha inaktiverat vissa system som standard, som till exempel avbrottssystemet, vilket innebär att den första koden som körs måste aktivera dessa funktioner innan de kan användas. Detta innebär att processorn inte är fullt redo att köra programmet förrän denna initiering är genomförd.

Det är också viktigt att notera att inte alla enheter i ett system kommer att vara redo att starta vid samma tidpunkt. Vissa enheter kan vara i drift redan innan processorn har exekverat sin första instruktion. Om dessa enheter inte har rätt initialisering vid start kan det orsaka problem i systemet, såsom att enheter förblir i ett ogynnsamt tillstånd tills rätt instruktioner exekveras. För att hantera detta kan mjukvaran inkludera lämpliga fördröjningar, vilket gör att systemet kan vänta på att andra enheter blir operativa innan det försöker interagera med dem.

I system där detta kan orsaka problem, som vid kritiska operationer, kan designteamet behöva se till att enheterna får ström först när processorn är redo att exekvera kod. Detta kan göras genom att använda mekanismer som kontrollerar strömförsörjningen till andra komponenter tills processorn har startat och börjat bearbeta instruktioner.

För att uppnå en balanserad och effektiv design i inbäddade system krävs det således att ingenjörer beaktar de olika uppstartstiderna och parallellismens påverkan på både prestanda och säkerhet i systemet. Att säkerställa att alla komponenter är korrekt initialiserade i rätt ordning är avgörande för att undvika problem och maximera systemets tillförlitlighet.

Hur man definierar uppgifter och resurser i inbäddade system

För att effektivt designa och implementera inbäddade system är det viktigt att noggrant definiera hur olika uppgifter ska mappas till tillgängliga hårdvaruresurser och processorer. Detta är en kritisk aspekt av systemdesign, eftersom det påverkar både prestanda och kostnad för hela lösningen. I den här sektionen kommer vi att gå igenom hur man korrekt definierar och beskriver uppgifter och resurser, samt hur man skapar restriktioner och optimerar systemdesignen genom att använda matematiska ekvationer.

En uppgift i ett inbäddat system kan till exempel vara en enkel sensormätning, eller mer komplexa funktioner som styrning eller signalbehandling. Varje uppgift behöver mappas till en specifik hårdvara eller processor för att kunna utföras effektivt. I designen kan en uppgift, exempelvis en rörelsesensor eller bildbehandling, tilldelas en särskild hårdvara, medan andra mer komplexa uppgifter kan kräva en processor.

För att klargöra valmöjligheterna och de restriktioner som gäller för varje uppgift, behöver man definiera ett system av ekvationer som styr dessa val. Till exempel, om en uppgift som rör bildbehandling (Task 1) redan är planerad att utföras på en viss hårdvara (t.ex. en Teledyne DALSA-kamera), bör detta återspeglas i designbeskrivningen genom en lämplig ekvation som binder uppgiften till den specifika hårdvaran.

Ett exempel på en sådan ekvation kan se ut så här:

X1,dytg=1X_{1, \text{dytg}} = 1

Där X1,dytg=1X_{1, \text{dytg}} = 1 betyder att uppgift 1 (vision sensing and movement targeting) är mappad till hårdvaran dytg (Teledyne DALSA). Denna typ av ekvation ger en strikt koppling mellan uppgiften och dess resurser utan att behöva använda summanotation (Σ).

När man skapar dessa ekvationer är det viktigt att tänka på de resurser som är tillgängliga och de restriktioner som finns. Om till exempel en processor har begränsade kapaciteter, som i fallet med en Stellaris-processor (lmep), kan man definiera restriktioner för hur många uppgifter som får mappas till en sådan processor. Det kan vara lämpligt att formulera ekvationer som säkerställer att en processor inte överskrider en viss kapacitet genom att tvinga en maximal antal mappade uppgifter.

För att ytterligare specificera designens acceptanskriterier, måste man definiera villkor som garanterar att varje uppgift antingen utförs av hårdvara eller processor. Dessa villkor är avgörande för att säkerställa att alla uppgifter är korrekt distribuerade till de tillgängliga resurserna. Man kan exempelvis skapa en uppsättning ekvationer som säger att varje uppgift antingen ska vara mappad till en specifik hårdvara eller processor, och aldrig till båda.

I ett scenario där flera uppgifter ska mappas till samma plattform (t.ex. uppgift 3 och uppgift 9 på samma processor), måste man använda ytterligare ekvationer för att tvinga dessa uppgifter att placeras på samma resurs. Denna typ av restriktion är avgörande för att optimera systemets arkitektur och minimera behovet av kommunikation mellan olika enheter.

Det är också viktigt att förstå de praktiska konsekvenserna av de beslut som fattas i systemdesignen. Till exempel, om kostnaderna för olika komponenter är olika, som i fallet med FPGA (kostar 5) kontra en processor (kostar 8 för en lågpresterande eller 20 för en högpresterande processor), måste man skapa en objektiv funktion som minimerar den totala kostnaden för designen. I detta fall kan en sådan objektiv funktion se ut så här:

Totalkostnad=5×XFPGA+8×Xla˚gprocessor+20×Xho¨gprocessor\text{Totalkostnad} = 5 \times X_{\text{FPGA}} + 8 \times X_{\text{lågprocessor}} + 20 \times X_{\text{högprocessor}}

Denna funktion reflekterar den totala kostnaden för alla komponenter i systemet, där varje XX representerar ett val av komponent.

När man skapar denna typ av modeller och ekvationer för ett inbäddat system är det viktigt att vara medveten om att man arbetar med förenklingar och antaganden. I många fall måste man balansera mellan teoretiska modeller och praktiska restriktioner som kan uppstå i verkliga system, som minnesbegränsningar, strömförbrukning, och realtidskrav.

För att ge ett exempel på en mer komplex design, kan en mobilrobot med händer och ben betraktas. Denna robot har sex huvuduppgifter, som inkluderar både sensorfunktioner och rörelsekontroll. Varje uppgift har specifika krav på hårdvara, där vissa funktioner kan implementeras på en processor, medan andra kräver specifika hårdvarukomponenter. Genom att definiera dessa uppgifter och deras relation till hårdvaran, kan man skapa en systemdesign som är både effektiv och kostnadseffektiv.

I den här typen av design är det också viktigt att använda metoder som Pareto-analys för att eliminera alternativa lösningar som inte ger betydande fördelar. Genom att analysera alternativa designlösningar och deras prestanda kan man fokusera på de mest lovande alternativen och därmed minska den tid och de resurser som krävs för att välja den bästa lösningen.

Det är också avgörande att förstå att varje beslut om uppgiftens mappning till resurser påverkar hela systemets prestanda och kostnad. Designprocessen för inbäddade system kräver därför en noggrann balans mellan tekniska och ekonomiska faktorer, vilket gör att det inte bara handlar om att uppfylla de tekniska kraven utan också om att optimera systemets totala effektivitet och hållbarhet.

Hur hanteras uppgifter med förhandsbestämda perioder och deadlines i realtidsystem?

När det gäller realtidsystem och uppgiftsplanering handlar det inte bara om att fördela processorns resurser på ett effektivt sätt, utan även om att säkerställa att uppgifter inte missar sina deadlines. I många system med periodiska uppgifter, där varje uppgift har en fast period och deadline, måste planeringen vara exakt för att garantera att alla uppgifter kan slutföras i tid.

I grund och botten handlar utnyttjande om att mäta hur mycket av processorns kapacitet som krävs för att hantera alla uppgifter som tilldelas en specifik processor. Ett högre utnyttjande innebär att fler uppgifter körs parallellt på processorn, vilket kan leda till att planeringen blir svårare. Till exempel, om vi har tre uppgifter – T1 med period 4 och kostnad 2, T2 med period 6 och kostnad 1, samt T3 med period 8 och kostnad 2, blir utnyttjandet för detta uppgiftssätt 50 % för T1, 16,67 % för T2 och 25 % för T3. Om uppgifterna planeras korrekt kan processorn hantera den här belastningen, men om utnyttjandet är för högt, kan det vara svårt att säkerställa att alla uppgifter möter sina deadlines. Det är också viktigt att komma ihåg att om utnyttjandet överstiger 1, betyder det att processorn inte kan hantera belastningen och att antingen en snabbare processor behövs eller att uppgifterna måste omfördelas till andra processorenheter.

Rate-monotonic scheduling (RMS) och Earliest Deadline First (EDF)

Två av de mest kända algoritmerna för planering av periodiska uppgifter i realtidsystem är rate-monotonic scheduling (RMS) och earliest-deadline-first (EDF). Båda dessa metoder har förutsättningen att systemet tillåter preemption, det vill säga att en uppgift kan avbryta en annan om det behövs.

I rate-monotonic scheduling (RMS) tilldelas uppgifterna fasta prioriteringar i invers ordning av deras perioder – en uppgift med kortare period får högre prioritet än en uppgift med längre period. Detta gör det möjligt att snabbt generera en schemaläggning där alla uppgifter kan köras i tid om utnyttjandet inte är för högt. Det är också viktigt att förstå att RMS fungerar bäst när deadlines för uppgifterna är lika med deras perioder, eftersom det ger en enkel och effektiv metod för att säkerställa att varje uppgift slutförs innan nästa omgång börjar. För att kunna garantera att RMS fungerar måste utnyttjandet inte överstiga en viss tröskel, som beräknas med formeln μ ≤ n * (2^(1/n) - 1), där n är antalet uppgifter. Om utnyttjandet är större än denna tröskel finns det en risk att RMS inte kan hitta ett korrekt schema.

En annan fördel med RMS är att om perioderna för varje uppgift är ett integralt multipel av perioderna för uppgifterna med högre prioritet, så garanterar algoritmen ett korrekt schema om utnyttjandet är mindre än eller lika med 1. Detta innebär att om uppgifterna är synkroniserade på ett bra sätt, kan ett optimalt schema genereras utan problem.

Däremot, i system där uppgifterna har olika deadlines än sina perioder, kommer Earliest Deadline First (EDF) att vara mer lämplig. EDF tilldelar den högsta prioriteten till den uppgift som har närmast deadline, vilket gör det möjligt att hantera uppgifter med olika tidsbegränsningar. Detta fungerar särskilt bra i system där uppgifter inte måste slutföras vid slutet av deras period, men deras deadlines måste ändå hållas. EDF är en adaptiv algoritm som kan ge mycket bra resultat, men det kräver att systemet dynamiskt kan anpassa sig efter de deadlines som varje uppgift har.

Viktiga insikter för läsaren

För att verkligen förstå de olika planeringsmetoderna måste man också tänka på hur varje metod fungerar i praktiken och hur den relaterar till systemets specifika krav. Rate-monotonic scheduling är effektiv i enklare system där perioder och deadlines är stabila och förutsägbara. Å andra sidan kan EDF vara mer flexibel och anpassningsbar för system där deadlines inte alltid sammanfaller med perioderna.

En viktig aspekt att beakta är systemets hårdvara och dess kapacitet att hantera preemption och kontextbyten, eftersom detta kan påverka både RMS och EDFs effektivitet. Om kontextbyten tar för lång tid att genomföra, kan den teoretiska effektiviteten hos en planeringsteknik minska i praktiken.

Det är också avgörande att tänka på hur olika uppgifter kan ha inbördes beroenden eller specifika krav som kan påverka hur de ska planeras. Exempelvis kan vissa uppgifter behöva slutföras innan andra påbörjas, vilket inte alltid beaktas fullt ut i de grundläggande RMS- eller EDF-algoritmerna. Därför kan ytterligare tekniker som t.ex. partitionering eller schemaläggning med flera processorer vara nödvändiga för att uppnå den önskade prestandan i komplexa system.