Prototyp avinformationssystem for
militarfordon
Oskar Lindgren, John Talling
14 april 2010Examensarbete i Teknisk Datavetenskap, 2× 30 hp
Handledare pa CS-UmU: Fredrik GeorgssonHandledare pa BAE Systems Hagglunds AB: Erik Essegard
Examinator: Per Lindstrom
Umea UniversitetInstitutionen for Datavetenskap
901 87 UMEASverige
Sammanfattning
Datorbaserade informationssystem blir en allt viktigare del i moderna militarastridsfordon. Besattningen maste snabbt kunna fa information om bade fordonetsjalvt och den yttre miljon for att snabbt kunna fatta ratt beslut. Vi redovisar irapporten hur vi tagit fram en prototyp till ett nytt informationssystem for band-vagnen BvS10, vilken tillverkas av BAE System Hagglunds AB i Ornskoldsvik.
En viktig aspekt av systemet ar den tid det tar fran att informationen gener-eras av givare i fordonet till dess att den presenteras for anvandaren. Systemetmaste kunna kontrollera det aldrig visar information som blivit inaktuell. Vi hardarfor lagt stor vikt vid att ta fram en lager- och komponentbaserad arkitek-tur for losningen som mojliggor kontroll av informationens alder nar den ror siggenom systemet. I samband med detta gors ocksa en djupare studie i kompo-nentbaserad design i allmanhet och for .NET i synnerhet. Vi redogor aven forde timingrelaterade problem som kan uppsta pa plattformar med garbage col-lection (dit .NET hor) och visar pa nagra av de losningar som foreslagits i denvetenskapliga litteraturen.
Abstract
Computer based information systems play an important role in modern mili-tary combat vehicles. The crew needs to be able to quickly get information aboutboth the vehicle and its outer surroundings in order to quickly make the correctdecisions. In the report, we describe the development of a prototype new infor-mation system for the BvS10 vehicle, developed by BAE System Hagglunds ABin Ornskoldsvik.
An important aspect of the system is the time it takes from that the infor-mation is generated by the vehicle sensors until it is presented to the user. Thesystem must be able to ensure that it never displays information that is out ofdate. Thus, great importance has been attached to creating a layer and componentbased architecture for the solution, making detailed control of the information ageas it moves through the system possible . In connection to this, we also performa deeper study of component based design in general and for .NET in particular.We also discuss the timing related problems that can occur on garbage collec-tion programming platforms (such as .NET) and show some of their solutionsproposed in the scientific literature.
Innehall
1 Inledning 11.1 Bakgrund . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1 Bandvagn BvS10 . . . . . . . . . . . . . . . . . . . . . . . . 21.1.2 VIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.3 CAN-standarden . . . . . . . . . . . . . . . . . . . . . . . . 31.1.4 Microsoft .NET . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Rapportens struktur . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Problemstallning 72.1 Implementation av J1939-protokollet . . . . . . . . . . . . . . . . . 82.2 Grafiskt stod for design . . . . . . . . . . . . . . . . . . . . . . . . 82.3 Sakerstallande av tidsgarantier for signaler . . . . . . . . . . . . . . 82.4 Stod for olika sprak och mattenheter . . . . . . . . . . . . . . . . . 92.5 Tredimensionell grafik som ett visuellt hjalpmedel . . . . . . . . . . 92.6 Examensarbetets mal . . . . . . . . . . . . . . . . . . . . . . . . . . 92.7 Antaganden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.7.1 Kravspecifikation . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Metod 133.1 Oversattning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.2 Tredimensionell grafik . . . . . . . . . . . . . . . . . . . . . . . . . 16
4 Komponentbaserad design 194.1 Komponentens framvaxt . . . . . . . . . . . . . . . . . . . . . . . . 194.2 Vad ar en mjukvarukomponent? . . . . . . . . . . . . . . . . . . . . 204.3 Komponentbaserad design . . . . . . . . . . . . . . . . . . . . . . . 204.4 Komponentbaserad utveckling . . . . . . . . . . . . . . . . . . . . . 204.5 Microsoft .NET och komponenter . . . . . . . . . . . . . . . . . . . 214.6 Komponentinitiering . . . . . . . . . . . . . . . . . . . . . . . . . . 224.7 Komponentramverk . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.7.1 Dependency injection . . . . . . . . . . . . . . . . . . . . . 24
i
ii INNEHALL
4.7.2 Komponentinitiering med en fabrik . . . . . . . . . . . . . . 244.7.3 Initieringsordning . . . . . . . . . . . . . . . . . . . . . . . . 26
4.8 Service-orienterad programmering . . . . . . . . . . . . . . . . . . . 284.9 Slutsats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5 Realtidsaspekter pa Garbage Collection 295.1 En kort introduktion till minneshantering . . . . . . . . . . . . . . 295.2 Allmant om Garbage Collection . . . . . . . . . . . . . . . . . . . . 30
5.2.1 Nabarhet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.3 Tekniker for okad prestanda . . . . . . . . . . . . . . . . . . . . . . 32
5.3.1 Inkrementell nabarhetsanalys med trefargning . . . . . . . . 325.3.2 Komprimerande vs. icke-komprimerande . . . . . . . . . . . 345.3.3 Generationer . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.4 Interoperabilitet med sprak utan Garbage Collection . . . . 36
5.4 Realtidsaspekter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.4.1 Kort om realtidsbegreppet . . . . . . . . . . . . . . . . . . . 375.4.2 Realtidssystem med garbage collection . . . . . . . . . . . . 375.4.3 Minimum Mutator Utilization . . . . . . . . . . . . . . . . . 38
5.5 Existerande losningar . . . . . . . . . . . . . . . . . . . . . . . . . 395.5.1 Cheng och Blelloch . . . . . . . . . . . . . . . . . . . . . . . 395.5.2 Bacon, Cheng och Rajan . . . . . . . . . . . . . . . . . . . 405.5.3 Pizlo, Hosking och Vitek . . . . . . . . . . . . . . . . . . . . 41
5.6 Slutsats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6 Systembeskrivning 436.1 Anvandning av komponenter . . . . . . . . . . . . . . . . . . . . . 43
6.1.1 Tjanster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446.1.2 Systemets uppstart . . . . . . . . . . . . . . . . . . . . . . . 44
6.2 Kommunikationslagret . . . . . . . . . . . . . . . . . . . . . . . . . 456.2.1 Signaltyper . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.2.2 CAN-hardvara . . . . . . . . . . . . . . . . . . . . . . . . . 466.2.3 CAN-hantering . . . . . . . . . . . . . . . . . . . . . . . . . 476.2.4 J1939-hantering . . . . . . . . . . . . . . . . . . . . . . . . . 476.2.5 Signalkonverterare . . . . . . . . . . . . . . . . . . . . . . . 476.2.6 Signaldatabas . . . . . . . . . . . . . . . . . . . . . . . . . . 496.2.7 CanLayerComponent . . . . . . . . . . . . . . . . . . . . . . 50
6.3 Datalagret . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506.3.1 Databindning i .NET . . . . . . . . . . . . . . . . . . . . . 516.3.2 Signalko . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.3.3 Signallogik . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.3.4 Larmhantering . . . . . . . . . . . . . . . . . . . . . . . . . 526.3.5 Databindningskallor . . . . . . . . . . . . . . . . . . . . . . 53
INNEHALL iii
6.4 Presentationslagret . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.4.1 Uppdateringskomponent . . . . . . . . . . . . . . . . . . . . 536.4.2 Vyer och vykomponent . . . . . . . . . . . . . . . . . . . . 576.4.3 Sprakhantering . . . . . . . . . . . . . . . . . . . . . . . . . 576.4.4 Piktogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.5 Manualvyn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
7 Slutsats 597.1 Begransningar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597.2 Framtida arbete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
A Systemoversikt 67A.1 Huvudvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68A.2 Installningsvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69A.3 Manualvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70A.4 Forarvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71A.5 Larmvy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73A.6 Design av vyer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B Specifikation av examensarbete 77
Figurer
1.1 Bandvagn BvS10[1]. . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1 Oversattning av forarvyn i Resourcer. . . . . . . . . . . . . . . . . 14
3.2 Oversattning av forarvyn i Globalizer. . . . . . . . . . . . . . . . . 15
3.3 Oversattning av installningsvyn i Sisulizer. . . . . . . . . . . . . . . 16
4.1 Ett exempel pa objektorienterad design. Pilarna visar anropsflodetmellan klasserna. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Pseudokod for ett system med tre komponenter. . . . . . . . . . . 22
4.3 Pseudokod som visar systemet i 4.2 med en utokning for att hanteraflera versioner av motorn. . . . . . . . . . . . . . . . . . . . . . . . 23
4.4 Pseudokod for en statisk fabrik. Fabriken kan instansiera och kon-figurera tva objekt. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.5 Beroendegraf for en statisk komponentfabrik. . . . . . . . . . . . . 25
4.6 Exempel pa en konfigurationsfil for en dynamisk fabrik (jfr 4.4). . 26
4.7 Beroendegraf for en dynamisk komponentfabrik. . . . . . . . . . . 26
4.8 Beroendegraf for systemet. . . . . . . . . . . . . . . . . . . . . . . . 27
5.1 Felaktigt resultat med referensraknande GC. Objekten D, E ochF refererar till varandra cirkulart, vilket gor att GC:n felaktigtidentifierar dem som nabara. . . . . . . . . . . . . . . . . . . . . . 31
5.2 Genom att folja referenskedjan fran rotobjekten (A och C), kan D,E och F korrekt identifieras som onabara. . . . . . . . . . . . . . . 32
5.3 Bilden visar hur trefargningsstrategin anvands for att berakna nabarheteni objektgrafen. Notera att ett svart objekt inte vid nagot tillfalledirekt refererar till ett vitt, vilket skulle bryta mot invarianten. Isista bilden sa ar mangden av gra objekt tom, och det vita objektetF kan nu identifieras som onabart. . . . . . . . . . . . . . . . . . . 33
v
vi FIGURER
5.4 Bilden visar hur pekarna i to-space forandras under korning avCheneys algoritm for samma exempel som i figur 5.3. Algoritmenterminerar nar SCAN och FREE pekar mot samma adress, vilketsvarar mot att mangden av gra objekt ar tom. . . . . . . . . . . . 35
5.5 Ett exempel pa hur MMU:n kan okas, medan den totala mangdenarbete for mutator och GC forblir konstant. A: GC-pauserna arlanga och oregelbundna, vilket paverkar MMU:n negativt badem.a.p. langa och korta intervall. B: GC-pauserna har gjorts regel-bundna, vilket okar MMU for det langre intervallet. Det kortareintervallet ar dock fortfarande begransat av paustidens storlek. C:Genom att bryta upp GC:ns arbete i mindre delar kan MMU:nokas aven for det mindre intervallet. . . . . . . . . . . . . . . . . . 39
6.1 En oversikt av de olika delar som ingar i losningen. . . . . . . . . . 44
6.2 De tre metoder som varje komponent implementerar. . . . . . . . . 45
6.3 Figuren illustrerar hur en CAN-signal ror sig genom kommunika-tionslagret. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.4 Designmonstret Publish/Subscribe. 1. Prenumeranten startar enprenumeration hos CanDispatch genom att skicka en referens tillsitt Event-objekt. 2. Prenumeranten vantar pa att Event.Wait()returnerar. 3. CAN-signalen inkommer till CanDispatch och denanropar Event.Set(). 4. Event.Wait() returnerar for prenumerantenoch den kan lasa ut signaldatan fran CanDispatch. . . . . . . . . . 49
6.5 Den grafiska kontrollen for vaxelvaljaren, GearboxControl, visaratt vaxeln star i neutrallage. . . . . . . . . . . . . . . . . . . . . . . 54
6.6 Samtliga kontroller i forarvyn tar emot signalvarden. . . . . . . . . 55
6.7 Endast signalen fordonshastighet tas emot. Ovriga visare slacks utfor att indikera att deras data nu ar foraldrad. . . . . . . . . . . . 56
7.1 Tankbar framtida anpassning av lagerarkitekturen for WLAN (jfr.figur 6.1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.1 Huvudvyn med ett larm som gor personalen uppmarksam pa attden bakre luckan ar oppen under korning. Nederst syns naviger-ingsknapparna. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
A.2 Anvandaren kan snabbt byta kulturinstallning i installningsvynutan att starta om systemet. . . . . . . . . . . . . . . . . . . . . . 69
A.3 Manualvyn ger anvandaren tillgang till hjalptexter. . . . . . . . . . 70
A.4 Forarvyn med visare for olika sensorvarden fran motor och vaxellada. 71
A.5 Forarvyn nar kulturinstallningen har andrats till brittiskt. Noteraandringen i skalorna for kylarvatsketemperaturen och hastigheten. 72
FIGURER vii
A.6 En matare blir gra och visaren forsvinner nar det inte finns nagotvarde att visa. I detta fall har endast hastighetsmataren ett giltigtvarde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
A.7 Larmvyn visar tva aktiva larm och ett utganget larm i loggen. . . 73A.8 Forarvyn oppnad i designlaget. . . . . . . . . . . . . . . . . . . . . 74A.9 Signalvarden fran fordonet kan bindas till grafiska kontroller via
enkla menyer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75A.10 Oversattning av installningsvyn i Sisulizer. . . . . . . . . . . . . . . 75
Kapitel 1
Inledning
Datorbaserade informationssystem blir en allt viktigare del av moderna stridsfor-
don. Besattningen maste snabbt kunna fa information om bade fordonet sjalvt och
den yttre miljon for att kunna fatta ratt beslut. Da olika besattningsmedlemmar
fyller olika roller i ett stridsfordon ar det ocksa onskvart att informationen som
presenteras for dem ar anpassade till rollen. Med dessa okade krav pa informa-
tionssystemet foljer parallellt okade krav pa utvecklingsprocessen for att ta fram
dem.
BAE Systems Hagglunds AB har idag ett befintligt informationssystem for
nyare varianter av sin tyngre stridsfordonsmodell CV90. Man har planer pa att
infora ett liknande system for en av sina bandvagnsmodeller, BvS10. Inom ramen
for projektet ar man aven intresserad av att se vilka fordelar som gar att fa
genom att anvanda modern teknik. Man vill darfor utvardera ett anvandande
av Microsofts .NET-plattform for detta andamal. Man hoppas att det ska ge
en kortare utvecklingstid och ett system som ar lattare att anpassa till kundens
onskemal.
Detta examensarbete syftar till att undersoka detta genom att ta fram en
prototyp av ett informationssystem for BvS10. Sarskild vikt har lagts vid hanter-
ing och tidskontroll av signaler fran fordonet, komponentbaserad arkitektur av
mjukvaran, samt oversattning av granssnittet for olika lander och kulturer.
1
2 Kapitel 1. Inledning
1.1 Bakgrund
BAE Systems Hagglunds AB tillverkar militara fordon for bade inhemsk anvandning
och export och anstaller vid borjan av 2009 ca. 1100 personer. Foretaget ar baser-
at i Ornskoldsvik och ar en del av den globala forsvarskoncernen BAE Systems
med huvudkontor i Maryland, USA.
Bland foretagets produkter marks bandvagnen Bv206 som aven fatt viss civ-
il anvandning inom bl.a. raddningstjansten, stridsfordonet CV90 (inom svens-
ka forsvaret kallad Stridsfordon 90) och den bepansrade transportbandvagnen
BvS10.
1.1.1 Bandvagn BvS10
BvS10 ar en bepansrad bandvagnsmodell bestaende av tva hopkopplade vagnar
med s.k. midjestyrning, vilket innebar att leden mellan vagnarna vinklas via hy-
draulik for att svanga. Figur 1.1 visar en bandvagn sett fran sidan. Den har god
framkomlighet aven i svar terrang, och kan ta sig uppfor backar med upp till
45◦ lutning. Den maximala hastigheten pa vag ar 65 km/h och fordonet ar aven
amfibiskt, dvs. det flyter och kan ta sig fram over vatten i ca 5 km/h.
Bepansringen ger skydd mot granatsplitter, handburna automatkarbiner och
lattare kulsprutor. For ytterligare skydd finns totalt atta rokgranatskastare mon-
terade i grupper om fyra pa den framre vagnen. Vid takluckan i den framre vagnen
finns aven fasten for montering av en kulspruta. Den forhallandevis latta bepan-
sringen och bevapningen gor att fordonet inte primart ar avsedd for strid, utan
anvands i forsta hand for transport av trupper och materiel. Varianter finns ocksa
for anvandning som ambulans- och bargningsfordon inom det militara. BvS10 har
plats for totalt 12 soldater och kan ta en last pa 3850kg[1].
1.1.2 VIS
For personalen i ett stridsfordon ar det av storsta vikt att ha en god uppfattning
om situationen i och utanfor fordonet. For att uppna detta ar moderna strids-
fordon utrustade med ett stort antal inre och yttre sensorer. De inre sensorerna
mater teknisk data om fordonet som exempelvis hastighet, lutning och oljetryck,
medan yttre sensorer till exempel kan upptacka att fordonet belysts med laser
1.1. Bakgrund 3
Figur 1.1: Bandvagn BvS10[1].
och darmed loper risk att bli beskjutet. For att informationen fran sensorerna
ska vara latt att ta till sig for besattningen behover den sammanstallas och pre-
senteras. Det system som utfor detta kallas Vehicle Information System (VIS).
Granssnittet till VIS ar normalt en eller flera fasta skarmar i fordonet, med an-
passad information for den roll som den aktuella besattningsmedlemmen har i
fordonet.
1.1.3 CAN-standarden
CAN (Controller Area Network) ar en internationell standard for kommunika-
tion mellan olika delar i ett fordon[2, 3]. Genom att folja CAN-standarden sa
kan alla delar i fordonet kommunicera over samma buss. Utan en gemensam buss
sa skulle alla delar som behover kommunicera med varandra ha en egen kop-
pling, vilket skulle innebara en mycket stor mangd kablage. Detta skulle vara
bade utrymmeskravande och kostsamt. Olika signaler i ett fordon har ofta oli-
ka prioritet; t.ex. ar det normalt sett viktigare att bromsljuset tands an att
vindrutetorkaren startar. CAN-bussen anvander sig darfor av en “forhandling”
mellan de komponenter som vill sanda data innan sjalva sandningen ager rum.
Forhandlingen garanterar att den signal som har hogst prioritet far sanda forst.
4 Kapitel 1. Inledning
Externa fordonssystem som VIS kan ocksa lyssna pa trafiken over CAN-bussen
for att fa information om fordonets status.
1.1.4 Microsoft .NET
Microsoft .NET ar en plattform for att skapa mjukvara under Windows-plattformen.
.NET bestar av ett antal komponenter:
– En uppsattning av maskin-oberoende instruktioner och ett binarformat for
dessa, kallat Microsoft Intermediate Language (MSIL).
– En virtuell maskin som kan exekvera MSIL-instruktioner genom att oversatta
dem till instruktioner for den aktuella processorn.
– Ett lagnivasprak for instruktionsuppsattningen, vilket fyller samma funk-
tion som Assembler for vanliga processorinstruktioner.
– En gemensam modell for hognivasprak som anvander .NET, kallad Common
Language Interface (CLI). Modellen beskriver bl.a. hur klasser och metoder
lagras och anvands, vilket gor det mojligt for olika hognivaprogramsprak
inom .NET att dela kompilerade bibliotek med varandra.
– Microsoft stoder i dagslaget ett antal hognivaprogramsprak, bland annat:
C#, C++/CLI och Visual Basic .NET.
1.2 Rapportens struktur
En kort beskrivning av varje kapitel i rapporten foljer nedan. Kapitlen Kompo-
nentbaserad utveckling och Realtidsaspekter pa garbage collection ar forfattarnas
litteraturstudier, och kan lasas separat fran ovriga rapporten.
Problemstallning
Kapitlet Problemstallning redogor for den nuvarande losningen for VIS och gar
sedan igenom de problem som vart arbete ar tankt att adressera.
1.2. Rapportens struktur 5
Metod
Kapitlet Metod visar det tillvagagangssatt vi valt for arbetet och dokumenterar
de val som vi gjort.
Komponentbaserad utveckling
I detta kapitel gors en genomgang av den designprincip som ligger till grund for
implementationen.
Realtidsaspekter pa garbage collection
Det finns en inneboende problematik i att anvanda sprak som bl.a. .NET-familjen
eller Java for att skriva tidskansliga system, som t.ex. VIS. Kapitlet redogor for
problematiken och de framsteg som gjorts inom omradet for att ta fram en losning.
Systembeskrivning
Kapitlet redovisar systemets arkitektur och uppbyggnad.
Slutsats
Vi redogor for det vi kommit fram till efter avslutat arbete och tar upp be-
gransningar och forslag pa framtida forbattringar av systemet.
Kapitel 2
Problemstallning
Bandvagnen BvS10 har tidigare helt saknat ett informationssystem, daremot har
ett annat av Hagglunds stridsfordon, CV90, varit utrustat med ett sadant system
under flera ars tid. Denna VIS-losning ar utvecklad i C++ med Hagglunds eg-
na mjukvarubibliotek VisBas som grund. Det grafiska granssnittet ritas upp via
Windows inbyggda bibliotek Windows GDI(Graphics Device Interface)[4]. GDI
tillhandahaller funktioner for utritning av enklare geometriska former, sasom cirk-
lar och rektanglar, samt text och bilder.
Da VisBas ritar upp sin grafik direkt och alltsa inte anvander sig av Windows
normala kontroller och granssnittselement har det inte funnits nagot grafiskt stod
for design av granssnittet, utan detta har skett helt via programmering i GDI.
Att skapa en sammansatt grafisk kontroll som till exempel en hastighetsmatare
har darfor varit forenat med en stor arbetsinsats fran utvecklarnas sida. Man
har ocksa manuellt fatt aterskapa manga av de standardkontroller som finns i
operativsystemet sasom tradvyer och listor.
En annan oonskad effekt ar ocksa att designavdelningens arbete med granssnittet
har varit i form av bilder och skisser, vilka sedan har behovts aterskapas i kod
av utvecklarna for att kunna anvandas i den slutliga VIS-applikationen. Ett mer
onskvart arbetsflode skulle sjalvfallet vara att material som framstallts pa desig-
navdelningen latt skulle kunna anvandas direkt i den slutgiltiga produkten.
Pa grund av dessa begransningar i den nuvarande tekniska losningen for VIS
sa har man pa Hagglunds darfor intresserat sig for att flytta utvecklingen till
7
8 Kapitel 2. Problemstallning
.NET, vilket man hoppas ska ge en snabbare och enklare utvecklingsprocess.
2.1 Implementation av J1939-protokollet
Ett ramverk for signalkommunikation via CAN skrivet i C# for .NET-plattformen
finns tillgangligt, men behover utokas med en modul for att stodja en CANCase-
hardvaruenhet. Signalerna fran motor och vaxellada foljer en protokollstandard
ovanpa CAN kallad J1939, varfor ett sadant lager ocksa maste implementeras
i ramverket. Da J1939 ar en forhallandevis omfattande standard kommer en-
dast de delar som ar relevanta for var anvandning att implementeras. Exem-
pelvis utelamnas stod for J1939-meddelanden uppdelade pa flera separata CAN-
meddelanden.
2.2 Grafiskt stod for design
For att underlatta for bade designers och programmerare ska vyer i VIS kunna
framstallas genom “dra-och-slapp” i Visual Studios designlage, utan att behova
programmera. Aven kopplingen mellan en grafisk kontroll och vilket varde den
visar ska kunna anges pa detta satt.
2.3 Sakerstallande av tidsgarantier for signaler
For ett system som anvands i en sa kritisk miljo som ett stridsfordon ar det viktigt
att den information som visas for anvandaren ar korrekt och aktuell. Da .NET-
plattformen inte ar en realtidsplattform sa finns risken att en operation i systemet
kan komma att ta sa lang tid att informationen i en signal ar gammal nar den
kommer fram. For att minska risken for detta maste signalens alder kontrolleras
sa nara som mojligt till den punkt dar den ska visas pa skarmen. Vissa signaler
kan ocksa vara viktigare an andra, sa ett system for att ge signaler olika prioritet
behovs.
En ytterligare komplikation inom detta omrade ar att programspraken pa
.NET-plattformen anvander sig av s.k. garbage collection, vilket inverkar negativt
pa systemets mojlighet att garantera tidskrav. Med anledning av detta undersoker
2.4. Stod for olika sprak och mattenheter 9
vi ocksa de framsteg som gjorts for att anpassa system med garbage collection
till tidskansliga system.
2.4 Stod for olika sprak och mattenheter
Programmet ska kunna oversattas till olika sprak, och det ska aven vara mojligt
att byta sprak medan programmet kors. Utover detta ska det kunna hantera
andra kulturspecifika installningar som mattenheter. Till exempel ska hastighet
kunna visas i km/h for en svensk anvandare och som mph for en amerikansk.
2.5 Tredimensionell grafik som ett visuellt hjalpmedel
Det finns onskemal inom BAE Systems Hagglunds AB att undersoka om tredi-
mensionell grafik kan anvandas for att forbattra VIS. Vi undersoker darfor vilka
losningar som finns for 3D-grafik i .NET inom ramen for VIS.
2.6 Examensarbetets mal
Uppgiften bestar i att med utgangspunkt fran BvS10-bandvagnen implementera
en prototyp av en ny VIS skriven med Microsofts .NET-bibliotek, och genom
detta utvardera vilka mojligheter och problem som den nya tekniken innebar.
Den ursprungliga specifikationen for examensarbetet aterfinns i bilaga B. Efter
samrad med vara interna och externa handledare beslutade vi att ta bort punk-
terna om simuleringsmodell och fordjupning inom GUI-design och usability och
ersatta dem med en fordjupning inom realtidsaspekter pa garbage collection
Arbetet innefattar analys av problemstallningen, framtagning av en design for
applikationen samt implementation.
2.7 Antaganden
Motor och vaxellada ar de enda delar i BvS10 som har sensorer tillgangliga for
avlasning via CAN-bussen i BvS10. Da en del av arbetet innefattar att undersoka
ny funktionalitet for VIS, sa har vi arbetat med antagandet att ytterligare sensorer
10 Kapitel 2. Problemstallning
finns tillgangliga. Dessa virtuella sensorer har simulerats via signalramverket (se
avsnitt 6.2 Kommunikationslagret) pa samma satt som de verkliga signalerna sa
att de latt skulle kunna anvandas om de infordes i det fysiska fordonet.
De virtuella sensorerna ar tre till antalet och indikerar vinkeln i hojd- resp.
sidled mellan de tva vagnsdelarna, samt huruvida den bakre luckan ar oppen eller
stangd.
2.7.1 Kravspecifikation
Den ursprungliga specifikation for examensarbetet(Se bilaga B) innehaller endast
generella och overgripande krav, darfor har vi tillsammans med BAE System
Hagglunds AB tagit fram denna detaljerade kravspecifikation.
1. Definitioner
(a) Logisk signal: En struktur med ett varde och ett ID-nummer, unikt for
signaltypen.
(b) Hardvarusignal: Data bestaende av varde och ID-nummer som tas
emot fran externa enheter.
(c) Vy: En uppsattning av grafiska kontroller som visas samtidigt pa skarmen.
Endast en vy at gangen kan visas pa skarmen.
2. Teknik
Programmet ska:
(a) utvecklas i Visual Studio 2008.
(b) vara skrivet for .NET-platformen.
(c) ga att kora under Windows XP.
(d) anvanda XNA for 3D-visualisering.
(e) anvanda Dundas Gauges-komponenter[5] for grafiska matare
(f) utvecklat i C++/CLI for de delar som kraver samverkan med kod
utanfor .NET och C# for ovriga delar.
(g) visa manualtexter med hjalp av en webblasarkomponent.
3. Generellt
2.7. Antaganden 11
(a) Programmet ska anvanda sig av data binding mellan presentationsla-
gret och presentationskomponenter.
(b) Varje signals tidsstampel skall bevaras sa lange som dess varde be-
handlas i systemet.
(c) En grafisk komponent som visar ett signalvarde inaktiveras om vardets
alder overstiger en given tid.
4. Allmant om vyer
(a) I varje vy (forutom hemvyn) ska det finnas en hemknapp som tar
anvandaren till hemvyn.
(b) Hemknappen ska indikera nar det finns ett aktivt larm.
(c) Programmet ska ha foljande vyer; Hem, Forare, Installningar, Larm
och Manual.
5. Hemvy
(a) Ska innehalla en meny som tar anvandaren till andra vyer.
(b) Innehaller ett tredimensionellt piktogram av vagnen, som indikerar:
i. vinkeln pa mittleden, i bade sid- och hojdled.
ii. status pa luckor.
iii. vid ett larm: fran vilken del av vagnen som larmet harstammar
(c) Visar fordonets hastighet.
6. Installningsvy
(a) Det ska ga att andra systemets sprak (nationella installningar).
(b) Det ska ga att se systemets versionsnummer.
7. Larmvy
(a) Ska innehalla en lista med aktiva larm i systemet.
(b) Larm som ej langre ar aktiva ska visas separat.
(c) Nar man trycker pa ett larm ska en beskrivning visas.
8. Manualvy
12 Kapitel 2. Problemstallning
(a) Manualsidorna finns ordnade efter amnesomrade i en tradstruktur (reg-
istret).
(b) Registret och manualsidans innehall delar plats pa skarmen.
(c) Storleksforhallandet mellan registret och manualsidan kan andras steglost.
(d) Manualsidor ska kunna innehalla lankar till andra sidor.
9. Forarvy Innehaller matare som visar foljande information:
(a) Fordonshastighet
(b) Motortemperatur
(c) Motorns varvtal
(d) Nuvarande vaxel
(e) Batteristatus
(f) Oljetryck
Kapitel 3
Metod
Vi redogor har for de val som gjorts gallande de tekniska losningar som anvandes
i arbetet.
3.1 Oversattning
Vid oversattning av en applikation mellan olika landers sprak ar det onskvart
att kunna separera de delar som visas for en anvandare fran den bakomliggande
logiken. Dessa delar benamns vanligen resurser och lagras i en s.k. resursfil. En
egen version av resursfilen skapas for varje sprak/kultur som applikationen ska
stodja. En resursfil bestar av en tabell dar varje oversattningsbart objekt utgor
en rad. Varje rad har tre kolumner; objektets ID, objektets datatyp (textstrang,
bild, etc.) samt dess varde. Resursfilerna kompileras sedan till en .NET-assembly
som antingen kan infogas direkt i .exe-filen eller lagras i en extern DLL-fil. Detta
innebar flera fordelar for utvecklingsteamet:
– Personen som gor oversattningen kan vara specialiserad inom det omradet
och behover inte ha kunskaper i programmering.
– Flera personer kan arbeta med olika oversattningar parallellt.
Metoden kan ocksa medfora vissa problem:
– Det kan vara svart for en oversattare att se vilket sammanhang som oversattningen
tillhor. Exempelvis kan det engelska ordet “gear” betyda bade “kugghjul”
13
14 Kapitel 3. Metod
och “vaxel”.
– Langden pa ett ord eller en fras kan variera betydligt mellan olika sprak,
vilket kan medfora att texten inte langre ryms pa det tilltankta utrymmet.
Vi har jamfort tre verktyg for oversattning av .NET-applikationer for att se
hur de hanterar problemen ovan.
– Resourcer 4.1.0.0 [7]
– Globalizer .NET 1.6.1.0 [8]
– Sisulizer 2008 [9]
Resourcer
Resourcer (se figur 3.1) ar det enklaste och samtidigt mest begransade verktyget.
Det visar oversattningsbara objekt som rader i en tabell, pa liknande satt som Vi-
sual Studios inbyggda resurseditor. Den kompilerar inte de oversatta resursfilerna
till .NET-assemblies, utan detta maste hanteras av utvecklarna sjalva.
Figur 3.1: Oversattning av forarvyn i Resourcer.
3.1. Oversattning 15
Globalizer
Globalizer (se figur 3.2) visar pa samma satt som Resourcer oversattningsbara
objekt i en tabellstruktur. Till skillnad fran Resources kompilerar det de skapade
resursfilerna direkt till .NET-assemblies. Globalizer erbjuder aven mojligheten att
forhandsgranska utseendet pa ett formular utan att behova starta huvudapplika-
tionen.
Figur 3.2: Oversattning av forarvyn i Globalizer.
Sisulizer
Sisulizer (se figur 3.3) erbjuder en delad vy dar oversattaren kan se formularet som
han/hon for tillfallet arbetar med tillsammans med tabellen av oversattningsbara
objekt. Sisulizer gor det ocksa mojligt for oversattaren att justera positionen och
storleken pa formularets kontroller for ett specifikt sprak. Dock visas bara .NETs
inbyggda kontroller sa som de ser ut i verkligheten. Ovriga kontroller visas istallet
som fyrkantiga platshallare. Likt Globalizer kompilerar Sisulizer ocksa de skapade
resursfilerna till .NET-assemblies.
16 Kapitel 3. Metod
Figur 3.3: Oversattning av installningsvyn i Sisulizer.
Slutsats
Baserat pa jamforelsen drar vi slutsatsen att Sisulizer ar det verktyg som passar
bast for att losa de problem som identifierats. Vi valjer alltsa att anvanda Sisulizer
for att hantera oversattning av den prototyp som vi implementerar.
3.2 Tredimensionell grafik
For hardvaruaccelererad 3D-grafik pa Windows-plattformen finns i huvudsak tva
olika tekniska losningar: OpenGL och Direct3D. OpenGL ar ett oppet standard-
bibliotek for 3D-accelerering med ett API mot C/C++. Direct3D ar utvecklat av
Microsoft och har ett API mot C++. Microsoft paborjade ett arbete med att ska-
pa ett API for Direct3D mot .NET-plattformen, men API:t plockades sedan bort
fran utvecklingskitet[6]. I samband med nedlaggningen presenterade de XNA-
plattformen som ar ett .NET-API i forsta hand inriktat mot spelutveckling.
Sin inriktning till trots ser vi XNA som det lampligaste alternativet for ar-
betet, da det ar det enda .NET-API:t for 3D som officiellt stods och aktivt utveck-
las. XNA erbjuder ocksa flera inbyggda komponenter, som klasser for inlasning
och uppritning av modeller. Da 3D-grafik endast ar en mindre del av vad som
3.2. Tredimensionell grafik 17
utgor VIS, bedomer vi forenklad utveckling som betydligt mer vardefullt an den
eventuellt minskade prestanda som .NET kan medfora.
Kapitel 4
Komponentbaserad design
Vid utveckling av stora applikationer brukar man strava efter att dela upp pro-
grammet i flera delar som tar hand om olika funktioner. Hur man gor denna
uppdelning beror pa utvecklarnas mal; i de flesta fall ar det viktigt att delarna
gar att ateranvanda separat men aven att dessa delar gar att utveckla och testa
for sig. Dessa delar brukar man kalla for moduler eller komponenter.
4.1 Komponentens framvaxt
Nar de forsta datorerna kom sa gjordes all programmering i mycket maskinnara
programsprak. Datorerna hade mycket sma mangder minne vilket gjorde att pro-
grammens storlek begransades. Funktioner och funktioner med parametrar intro-
ducerades man da for att spara minnesutrymme.
I takt med att maskinoberoende programmeringssprak utvecklades sa blev det
allt vanligare att man ateranvande funktioner fran program i ett annat program.
I samband med detta borjade man skapa samlingar av anvandbara funktioner i
mjukvarubibliotek. I takt med detta vaxte det fram en marknad for mjukvarubib-
liotek sa kunde programmerare valja att kopa in delar till sina program istallet
for att utveckla allt sjalv[16]. Att kopa en fardig komponent kan i manga fall
vara billigare an att utveckla den sjalv. Den totala konstaden for att anvanda en
komponent i ett program bestar av inkopspriset och kostnaden for att integrera
den.
19
20 Kapitel 4. Komponentbaserad design
4.2 Vad ar en mjukvarukomponent?
Det finns ett flertal definitioner pa vad en mjukvarukomponent ar, men Szyper-
skis definition har emellertid blivit allmant accepterad[17]. Szyperskis definition
sager bland annat att en mjukvarukomponent ar en separat enhet, som har ett
granssnitt och kan anvands av en tredje part[18]. Vart att notera ar att definitio-
nen inte staller nagra krav pa programmet som anvander komponenten, eller pa
andra komponenter i samma system. Det ar darfor inte mojligt att endast utifran
denna definition att skapa komponenter som kan samverka med andra komponen-
ter. Utvecklaren kan sjalv avgora vilka designmonster och datatyper som denna
vill anvanda.
4.3 Komponentbaserad design
Komponentbaserad design flyttar utvecklarens fokus fran mjukvaruprogrammer-
ing till mjukvarukonstruktion[16]. Istallet for att skriva stora mangder kallkod
kan programmeraren koncentera sig pa att koppla ihop fardiga komponenter. Det-
ta forutsatter givetvis att det finns lampliga komponenter att tillga, vilket inte
alltid ar fallet. Aven om det finns lampliga komponenter sa kan det vara svart
att samverka med varandra[17], detta kallas att limma ihop dem fran engelskans
glue code. Dels sa kan man behova konvertera mellan komponenternas datatyper
men aven mellan fysikaliska enheter[19], darav sa ar det mycket svart att pa ett
generellt satt binda ihop olika komponenter. Darfor ar det fordelaktigt att defin-
era upp en modell for hur en komponent ska se ut och hur den kommunicerar med
andra delar av systemet. I [19] forslas en losning baserad pa formell semantik for
att avgora hurvida tva komponenter ar kompatibla och att automatiskt generera
lim-koden.
4.4 Komponentbaserad utveckling
I objektorienterad programmering stravar man efter att kapsla in sin kod sa att
varje objekt har en given roll som den ansvarar for. Det finns ett antal principer
som styr vad som ar god objektorienterad sed, en av dessa ar The Single Re-
sponsibility Principle som sager att ett objekt endast ska ha en roll, ett ansvar-
4.5. Microsoft .NET och komponenter 21
somrade[15]. Detsamma kan sagas om komponenter. En komponent skiljer sig
dock pa ett omrade, att den alltid ar byggd for att ateranvandas[17]. Detta staller
andra krav pa utvecklingsprocessen.
Som ett exempel, betrakta ett objektorienterat program som behandlar in-
formation som kommer in fran en hardvaruenhet. Enheten ar ansluten till en
signal-buss dar andra enheter kommunicerar med varandra. Varje gang enheten
far in en signal sa anropas en callback-funktion. Varje gang det kommer in en
signal sa ska den avkodas och konverteras till ratt fysikalisk enhet varpa vardet
ska visas pa en matare.
Figur 4.1: Ett exempel pa objektorienterad design. Pilarna visar anropsflodetmellan klasserna.
I figur 4.1 visas en enkel skiss pa hur ett sadant system skulle kunna delas
upp, med tre klasser for varsin roll. En ansats att anvanda samma uppdelning for
komponenter medfor att det uppstar ett cirkelberoende mellan komponenterna.
Detta ar inget problem for komponenter i sig, men blir problematiskt pa .NET-
plattformen vilket diskuteras nedan.
4.5 Microsoft .NET och komponenter
Den minsta fristaende enheten i .NET kallas for en assembly, det ar en fil med
filandelsen .DLL eller .EXE som innehaller en samlig av klasser och resurser sa
som bilder, stangar etc. En assembly har ett eget versionsnummer och en kul-
turinstallning[14]. En assembly med minst en klass med publik konstruktor upp-
fyller alltsa Szyperskis definition av en mjukvarukomponent. En .EXE-fil maste
22 Kapitel 4. Komponentbaserad design
man ha en programstartpunkt. Darfor placerar man vanligtvis man ett bibliotek i
en .DLL-fil som man sedan anvander sig av i en annan assembly. En assembly som
beror pa en annan assembly sag ha en en referens till denna. Nar man kompilerar
en assembly maste man ha tillgang till alla assemblies som den refererar till. I
figur 4.1 beskrivs ett objektorienterat system dar olika klasser anropar varandra;
om man skulle placera dessa tre klasser i varsin assembly skulle det inte ga att
kompilera systemet pa grund av cirkelberoendet av refererenser.
Till skillnad fran Java dar varje klass kompileras separat sa kan en assembly
innehalla flera klasser. Det finns inte heller nagot satt att enbart ladda in delar av
en assembly [20]. En assembly kan antingen laddas in vid start av applikationen
eller dynamiskt laddas in under korning.
Enligt .NET-ramverket ar en komponent en klass som implementerar granssnittet
IComponent [13]. Detta granssnitt beskriver varken hur en komponent ska ak-
tiveras eller samverka med andra komponenter. I .NET arver alla grafiska kon-
troller ifran klassen Control som i sin tur implementerar granssnittet IComponent,
vilket gor dem till komponenter enligt .NET.
4.6 Komponentinitiering
Betrakta ett systemet som innehaller tre komponenter; en hardvaruenhet, en sig-
nalhanterare och en databas. Hardvaruenhet ar kopplad till en motor som den
kan skicka meddelade till, motorn sender regelbundet ut information fran interna
matare till hardvaruenheten. Databasen innehaller information om hur om hur
man avkodar dessa. Varje gang signalhanterare far in en signal och har avkodat
den sa skriver den ut informationen pa skarmen. Ett sadanat system skulle kunna
limmas ihop som i figur 4.2.
Databas d = new Database("V12 motor");
SignalHandler sh = new SignalHandler(d);
EngineHardware e = new EngineHardware();
while(running) {
Signals[] signals = e.FetchSignals();
Sting metadata = sh.parse(signals);
print(metadata);
}
Figur 4.2: Pseudokod for ett system med tre komponenter.
4.6. Komponentinitiering 23
I figur 4.2 binds alla komponenter ihop genom dess konstruktorer, men det
finns inget i Szyperskis definition av en komponent som sager att komponent
maste initeras pa detta satt. Det ar alltsa upp till programmeraren att design sin
komponents granssnitt.
Anta att systemet maste modifieras for att i en senare version sa behover
databaskomponenten information om vilken arsmodell som motorn har for att
kunna avkoda signaler, och att det enda sattet att ta reda pa den informationen
ar att underkorning forst fraga motorn om detta. Det finns att flertal satt att losa
detta pa, exempelvis kan systemet vid uppstart anropa hardvarukomponenten
som fragar motorn efter arsmodell och skicka vidare informationen till databaskom-
ponenten.
Databas d = new Database("V12 motor");
SignalHandler sh = new SignalHandler(d);
EngineHardware e = new EngineHardware();
int version = e.getEngineVersion();
d.setEngineVersion(version);
while(running) {
Signals[] signals = e.FetchSignals();
Sting metadata = sh.parse(signals);
print(metadata);
}
Figur 4.3: Pseudokod som visar systemet i 4.2 med en utokning for att hanteraflera versioner av motorn.
I figur 4.3 visas hur man anpassa systemet for hantera flera arsmodeller,
dessvarre kraver detta att tva komponenters grannssnitt modifieras, vilket man
bor undvika da detta kan paverka andra systemen som anvander samma kompo-
nent. Dessutom har limkoden forandrats.
Detta visar just hur svart att kan vara att designa ett komponentbaserat
system som klarar av forandingar. Det basta hade varit ifall endast en komponent
kunde utokas och sedan kunde installeras i systemet, vilket Szyperskis definition
sager att mjukvarukomponent ska klara av.
24 Kapitel 4. Komponentbaserad design
4.7 Komponentramverk
Det finns ett flertal definitioner pa vad ett ramverk ar, vissa anser att det ar ett
designmonster medans andra anser att det ar en typ av komponent. Ett ramverk
bestar av oftas av ett antal granssnitt och en definition av hur instanser av dessa
granssnitt samverkar med varandra. Ett ramverk ger en komponent en miljo, en
kan sedan gora antagade om denna miljo[23]. Nagot forenklat kan man saga att
ett ramverk ar ateranvandbar limkod.
I avsnitt 4.6 visas ett komponentbaserat system med en startpunkt dar utveck-
laren bestamde nar komponenterna skulle anropas, programflodet utgick alltsa
ifran komponenterna. I ett ramverk ateranvander man startpunkten och designar
komponenterna sa de passar in i ramverket, bade systemet struktur och program-
flodet utgar da ifran ramverket. Detta kallas inversion of control [23].
4.7.1 Dependency injection
Nar ett system vaxer i storlek och blir mer komplext sa uppstar fler och fler
beroenden mellan komponenter. En komponent kan beror pa en annan komponent
som i sin tur kan anvanda en annan komponent och sa vidare. For att beroenden
mellan objekt i olika komponenter sa later man det objekt som ska instansiera ett
annat objekt bestamma med vilka andra objekt den ska interagera. Det vanligaste
sattet att implemtera detta ar att anvanda sig av en designmonstret abstrakt fabrik
som kan instansiera och konfigurera objekt i komponenter[22].
4.7.2 Komponentinitiering med en fabrik
En fabrik ar i sig en egen komponent som kan starta upp hela systemet. Detta gor
den genom att anropa alla komponenter och formedla kontakt mellan dom. Nar
programmet sedan ska avslutas sa ser fabriken till att alla komponenter stangs
ner pa ett korrekt satt. Man skulle kunna se fabriken som ett register dar varje
post innehaller ett komponent-namn med tillhorande referens.
Det det finns tva typer av fabriker, statiska och dynamiska. I en statisk fabrik
far man manuellt instansiera komponenter, och definiera upp get-funktioner for
dessa(se figure 4.4). For att det inte ska uppsta ett cirkelberoende mellan en kom-
ponent och den statiska fabriken sa maste komponent-registret ligga i separata
4.7. Komponentramverk 25
public class Factory {
public static ICANHardware getCan() {
CanCase can = new CanCase();
can.setBandWidth(250000);
can.busID(0);
return can;
}
public static IDatabase getDatabase() {
return new XMLDatabase("signals.xml");
}
}
Figur 4.4: Pseudokod for en statisk fabrik. Fabriken kan instansiera och konfig-urera tva objekt.
assemblies. Med en dynamisk fabrik sa anvander man sig av meta-programmering
for att instansiera komponenterna.
For att dynamiskt kunna instansiera en klass sa behover man veta dess namn
och i vilken assembly den ar placerad. Denna information kan man exempelvis
placera i en extern konfigurationsfil. Den dynamiska fabriken har alltsa inget
beroende pa de komponent som den skapar. Detta beroende har en statisk fabrik
vilket medfor att man maste kompilera om varje gang man lagger till en kompo-
nent.
Figur 4.5: Beroendegraf for en statisk komponentfabrik.
En dynamisk fabrik behover till skillnad fran en statisk fabrik inte bero pa
de klassen som den ska instansiera, dock finns beroendet mellan registret och
komponenterna kvar. Detta beroende gar inte att ta bort men det gar att sla
ihop fabriken med registret utan att det uppstar ett cirkelberoende. I bada fallen
av fabriker sa kommer de komponenter som anvander sig av andra komponenter
26 Kapitel 4. Komponentbaserad design
att bero pa dem.
<components>
<component name="Can" classname="CanCase">
<property name="bandwidth">250000</property>
<property name="busid">0</property>
</component>
<component name="Database" classname="XMLDatabase">
<property name="filename">signals.xml</property>
</component>
</components>
Figur 4.6: Exempel pa en konfigurationsfil for en dynamisk fabrik (jfr 4.4).
Med en statisk fabrik har man full kontroll pa vad som behovs goras for
att starta och avsluta systemet. I ett system med en dynamisk fabrik kan man
lagga denna information i en konfigurationsfil(se figur 4.6) for varje komponent
eller lata varje komponent implementera ett granssnitt som tillater fabriken att
anropa komponentens initieringskod.
Figur 4.7: Beroendegraf for en dynamisk komponentfabrik.
4.7.3 Initieringsordning
Betrakta ett system som bestar av tre komponenter, systemet startas upp med en
dynamisk fabrik. Den forsta komponenten ar en motorkomponent som behandlar
signaler som kommer in pa CAN-bussen fran fordonet motor. Signalerna tas emot
av en CAN-komponent som skickar vidare de signaler till andra komponenter. For
att man ska fa ett anrop av CAN-komponenten maste man registrera sitt intresse
for en viss signal hos den. Den sista komponenten ar en databas-komponent som
motor-komponenten behover for att kunna sla upp vilket CAN-Id som motsvarar
en vilken given motorsignal, med detta CAN-Id kan motorn registrera sig hos
CAN-komponenten.
4.7. Komponentramverk 27
Figur 4.8: Beroendegraf for systemet.
Nar motorkomponent initieras kommer den behova fraga komponent-registret
efter bade databas- och CAN-komponenten. Darfor maste bada startas upp fore
motorkomponenten, annars kommer den inte startas korrekt. For att losa prob-
lemet kan vi helt enkelt bara specificera att fabriken ska starta databas- och
CAN-komponenterna forst. En initieringsordning loser tyvarr inte det generella
problemet.
Om vi ger registret mojlighet att initiera oinitierade komponenter nar dom
efterfragas skulle vi slippa att definiera upp en initieringsordning. Det skulle losa
problemet i detta system men inte generellt, exempelvis kan man aldrig starta
ett system nar det finns ett cirkelberoende i initieringsordningen.
Betrakta ett system dar vi vill brygga signaler fran en hardvara till en annan.
Bada hardvarorna ar en egen komponent, for att ta emot signaler far man gora
pa samma satt som i forra systemet. I bada hardvarornas komponenter gors det
ett anrop till varandra och sager att signaler ska skickas till dem. Har har vi ett
cirkelberoende i initieringsordningen som gor att systemet inte gar att starta,
men om vi istallet delar uppstarten i tre faser sa kan vi i de flesta fall ga runt
problemet:
28 Kapitel 4. Komponentbaserad design
– Instansering
– Binding
– Start
I denna uppdelade start sa instanserar fabriken forst alla komponenter och
satter in dem i registret, i nasta steg kan komponenterna anropa registret och
darmed varandra. I vart fall kommer vara hardvaror att kunna anropa varandra
och be om signaler. Nar bindningssteget har korts for alla komponenterna kommer
fabriken att anropa varje komponents start-metod.
4.8 Service-orienterad programmering
Service-orienterad programmering [21, 12] ar en programmeringsparadigm som
foresprakar att man modellerar sina problem och losningar som ett satt av tjanster.
En tjanst ar ett kontrakt som beskriver ett beteende som tillhanda halls av en
komponent och konsumeras av andra komponenter. En komponent behover inte
vara medveten om vem som tillhanda haller en tjanst utan endast dess semantik.
Detta resulterar i att en komponent aldrig beror pa en annan, utan endast pa ett
antal tjanster. Detta brukar man oftast astadkomma med ett tjanste-register[12].
4.9 Slutsats
Det ar tydligt att komponent ar har for att stanna, det faller sig vara ett naturlig
steg vidare fran funktionsbibliotek. Aven om det finns flera uppfattningar om vad
som ar en komponent och vad ett ramverk bestar av sa ar det tydligt att detta
ar ett viktigt paradigmskifte.
Kapitel 5
Realtidsaspekter pa
Garbage Collection
Garbage Collection ar en teknik for att automatiskt hantera avallokering av minne
for att underlatta for programmeraren och reducera risken for fel. Det anvands i
flera av dagens mest anvanda programsprak; bland dem marks framst Java och
spraken pa .NET-plattformen (C#, Visual Basic.NET, C++/CLI, m.fl.).
Pa grund av de pauser i programexekveringen som garbage collection medfor,
har tekniken lange varit olamplig for anvandning i system med hoga krav pa
responstid. En avsevard mangd forskning har dock pa senare ar riktats mot att
ta fram nya algoritmer for att mojliggora detta. Vi redogor for de vanligaste
teknikerna som anvands for att anpassa garbage collection till realtidssystem och
ser pa hur de anvands i nagra foreslagna losningar.
5.1 En kort introduktion till minneshantering
Datorprogram anvander i regel tva skilda strategier for att allokera minne: stack-
allokering och heapallokering. Stackallokering sker fran en mindre del av minnet
(normalt nagon eller nagra MB i storlek pa en typisk persondator[24, 25]) som
foljdaktligen benamns stacken. Nar ett funktionsanrop gors skapas en s.k. stack
frame, vilket ar en minnesarea pa stacken som innehaller de parametrar som
skickats till funktionen (dessa kan aven skickas direkt via processorns register),
29
30 Kapitel 5. Realtidsaspekter pa Garbage Collection
en aterhoppsadress som anger vilken instruktion som ska koras efter att funktio-
nen avslutas, samt de lokala variabler som funktionen anvander sig av. En stack
frame ar direkt knuten till livslangden for ett funktionsanrop; nar anropet avs-
lutats frigors dess minne automatiskt. Da varje trad i ett flertradat program har
sin egen kedja av anropade funktioner sa anvands en stack per trad.
Ovrigt internminne som en process har tillgangligt benamns heap och anvands
for att allokera data som behover finnas kvar efter att funktionen som gjorde
allokeringen slutforts, eller for data som ar for stor for att rymmas pa stacken.
Till skillnad fran stacken finns det endast en heap per process, vilken kan anvanda
hela mangden minne som ar tillgangligt for processen. Heapen delas foljdaktligen
av alla processens tradar. Eftersom avallokeringen av data pa heapen inte ar
knutet till slutet pa ett funktionsanrop sa maste detta minne explicit avallokeras
nar det inte langre behovs.
5.2 Allmant om Garbage Collection
Avallokeringen av minnet pa heapen i ett programsprak kan delas upp i tva
huvudsakliga kategorier: manuell och automatisk. Vid manuell minneshantering,
vilken varit traditionellt dominerande, ar programmeraren sjalv ansvarig for att
explicit frigora det minne som dynamiskt allokerats pa heapen. Detta gors normalt
genom anrop till funktioner som free() i C eller inbyggda operatorer som delete i
C++.
Automatisk minneshantering, kallad Garbage Collection (nedan: GC), avlas-
tar programmeraren genom att skota denna avallokering automatiskt. Objekt som
inte langre behovs avallokeras automatiskt av en process i sprakets kortidsbibliotek,
garbage collectorn.
Vid diskussion av garbage collection benamns huvudtraden i programmet nor-
malt mutator, da det enda den utfor fran garbage collectorns synvinkel ar att
mutera (forandra) heapen. Mutatorn hanterar alltsa programmets logik och delar
pa tillgangliga minnes- och processorresurser tillsammans med GC:n.
5.2. Allmant om Garbage Collection 31
5.2.1 Nabarhet
For att avgora vilka objekt i minnet som kan frigoras behover man berakna
huruvida de ar nabara eller inte. Ett icke nabart objekt kan inte langre anvandas
och kan darmed tas bort av GC:n. En samling minnesobjekt, rot-objekten, ar
initialt nabara (markeras med tjock ram i figurerna nedan). Rot-objekten ar de
objekt som det existerar referenser till pa programstacken, i processorns register,
eller som globala variabler.
En strategi for att avgora nabarhet som forst kan verka lockande ar referen-
srakning, dvs. att varje objekt lagrar hur manga referenser som pekar pa det. Nar
ett objekt inte har nagra referenser kvar ar det onabart och kan tas bort. Den-
na strategi ar korrekt, men ej fullstandig i den meningen att den aldrig leder till
borttagning av ett refererat objekt, men den misslyckas med att identifiera objek-
tstrukturer med cirkelreferenser som icke nabara. Figur 5.1 visar problematiken:
Rotobjekten A och C refererar enbart till B, men D, E och F har alla inkom-
mande referenser, sa de kommer inte att tas bort, trots att de ar onabara fran
programmet.
Figur 5.1: Felaktigt resultat med referensraknande GC. Objekten D, E och Frefererar till varandra cirkulart, vilket gor att GC:n felaktigt identifierar demsom nabara.
For att undkomma detta problem beraknar man istallet nabarhet pa foljande
satt: om ett nabart objekt A innehaller en referens till ett objekt B, sa ar aven
B nabart. De nabara objekten i systemet ar alltsa dem till vilka man kan folja
en kedja av referenser fran ett rot-objekt. Garbage Collectorn utfor regelbundet
32 Kapitel 5. Realtidsaspekter pa Garbage Collection
en nabarhetsanalys pa programmet och frigor minne for de icke nabara objekten.
Figur 5.2 illustrerar resultatet av nabarhetsanalysen med denna metod pa samma
exempel som ovan.
Figur 5.2: Genom att folja referenskedjan fran rotobjekten (A och C), kan D, Eoch F korrekt identifieras som onabara.
Det enklaste sattet att utfora en nabarhetsanalys ar vad som brukar kallas
mark & sweep. GC:n traversererar nabarhetsgrafen uttommande med start fran
rotobjekten och markerar de objekt den traverserat. I nasta steg gar den igenom
samtliga objekt i minnet och avallokerar minnet for de objekt som inte markerats
i det foregaende steget.
5.3 Tekniker for okad prestanda
Ett flertal tekniker finns for att oka GC:ns (och som det visar sig, ibland aven
mutatorns) prestanda. Utan att gora nagra ansprak pa att vara en uttommande
forteckning beskriver vi nagra av de vanligast forekommande.
5.3.1 Inkrementell nabarhetsanalys med trefargning
Den naiva mark & sweep-algoritmen beskriven ovan har en stor nackdel som gor
den olamplig att anvanda i praktiken: mutatorn maste pausas under hela GC-
cykeln. For att losa detta problem behovs ett satt att kunna dela upp en GC-
cykel i bitar sa att mutatorn kan exekvera daremellan. Ett satt att gora detta ar
genom att anvanda sig av en trefargad markeringsstrategi for nabarhetsgrafen[26].
5.3. Tekniker for okad prestanda 33
I borjan av markeringsfasen ar rotobjekten gra, medan alla ovriga objekt ar vita.
GC:n foljer sedan alla referenser fran de gra objekten och om referensen pekar
pa ett vitt objekt fargas det gratt. Nar samtliga referenser fran ett gratt objekt
besokts fargas det svart. Detta fortgar till dess att mangden av gra objekt ar tom.
Trefargningsstrategin uppratthaller en viktig invariant: ett svart objekt kan
aldrig ha en direkt referens till ett vitt. En direkt foljd av detta ar att nar mangden
av gra objekt ar tom sa kan vita objekt bara ha referenser fran andra vita objekt.
Detta innebar att de vita objekten nu utan risk kan tas bort av GC:n.
Genom att spara en lista over vilka objekt som for tillfallet ar gra, sa kan GC:n
avbryta markeringsfasen, lata mutatorn exekvera och sedan ateruppta arbetet. En
ytterligare komplikation installer sig dock, eftersom mutatorn da kan skapa nya
referenser mellan objekten och darmed bryta invarianten. GC:n maste alltsa se
till att om en referens laggs till fran ett svart objekt till ett vitt, sa maste det vita
objektet grafargas.
Figur 5.3: Bilden visar hur trefargningsstrategin anvands for att beraknanabarheten i objektgrafen. Notera att ett svart objekt inte vid nagot tillfalledirekt refererar till ett vitt, vilket skulle bryta mot invarianten. I sista bilden saar mangden av gra objekt tom, och det vita objektet F kan nu identifieras somonabart.
34 Kapitel 5. Realtidsaspekter pa Garbage Collection
5.3.2 Komprimerande vs. icke-komprimerande
Nar GC:n avgjort vilka objekt som ar nabara kan den avallokera minnet for alla
icke nabara objekt. De objekt som ar kvar kan antingen lamnas pa den plats i
minnet dar de ar, eller flyttas ihop till en sammanhangande minnesyta. Om GC:n
flyttar objekten kallas den komprimerande (ibland anvands uttrycket kopierande).
Att flytta ihop objekten gor att det lediga minnet blir sammanhangande och
minnesforlust pga. fragmentering undviks. Detta kan bli ett problem for program
som exekverar under en langre tid och allokerarar och avallokerar mycket minne,
och for system som behover kunna garantera att programmet aldrig ska kunna
fa slut pa minne[33]. Ihopflyttning kan ocksa oka minneslokaliteten for de nabara
objekten, vilket gor att de kan rymmas i samma cache-rad och oka prestandan
vid minnesatkomst. En tredje fordel ar att det gar att utfora nya allokeringar
mycket snabbt, da systemet bara behover uppratthalla en pekare till borjan av det
lediga minnesomradet. I kontrast sa behover system som saknar, eller har en icke-
komprimerande garbage collector uppratthalla och soka i listor over vilka platser
i minnet som ar lediga, vilket komplicerar minnesallokeringen. Nackdelarna med
att flytta ihop objekt ar dels att det kan ta lang tid att utfora om objekten ar
stora och/eller manga, och dels att samtliga referenser som pekar till ett flyttat
objekt maste uppdateras med den nya minnespositionen.
Omflyttningen av objekt implementeras vanligen genom att tva separata min-
nesareor uppratthalls, kallade to-space och from-space[28, 27]. Nya objekt allok-
eras alltid i from-space. Nar en GC-cykel exekverar kopieras de objekt som fort-
farande refereras till to-space. Nar traverseringen ar klar avallokeras hela from-
space i ett svep och de bada minnesareorna byter roller, sa att gamla to-space
blir nya from-space och vice versa.
Denna metod for omflyttning kan ocksa goras inkrementell genom att objekten
kopieras i samband med att de traverseras i nabarhetsanalysen. For att GC:n
ska kunna ateruppta arbetet efter att den avbrutits behover den ett satt att
spara vilket tillstand den for tillfallet befinner sig i. Den naiva metoden med
att marka varje objekt med dess farg innebar en forhallandevis stor okning av
mangden lagrad data (i ordningen O(n) for n objekt). En vasentlig forbattring
introducerades av Cheney i [30], genom att infora tva separata pekare i to-space,
kallade SCAN och FREE. Svarta objekt befinner sig nedanfor SCAN och gra
5.3. Tekniker for okad prestanda 35
befinner sig mellan SCAN och FREE. FREE indikerar minnespositionen dar
overlevande objekt kopieras. Genom denna sinnrika konstruktion kan GC:ns hela
tillstand lagras enbart genom de tva pekarna. Figur 5.4 illustrerar metoden.
Figur 5.4: Bilden visar hur pekarna i to-space forandras under korning av Cheneysalgoritm for samma exempel som i figur 5.3. Algoritmen terminerar nar SCANoch FREE pekar mot samma adress, vilket svarar mot att mangden av gra objektar tom.
Att dela upp arbetet i delar kraver ocksa ytterligare atgarder fran GC:n om
mutatorn andrar i eller laser ifran ett objekt som redan har kopierats. Man kan
losa detta genom att som i [28] skapa en pekare fran det ursprungliga objektet
till dess kopia i to-space och for varje avlasning av en referens i mutatorn vi-
darebefordra den till kopian. Detta medfor dock extra arbete for varje lasning
som mutatorn gor. En annan losning [27] ar att lata mutatorn lasa objekten i
from-space och infora en barriar vid skrivning som utfor samma skrivning i dess
36 Kapitel 5. Realtidsaspekter pa Garbage Collection
kopia. Detta gor att inget extra arbete behovs vid lasningar, utan endast vid
skrivningar.
5.3.3 Generationer
Ytterligare ett satt att minska GC:ns paverkan pa systemets prestanda ar att dela
in objekten i generationer. Nar objekt skapas tillhor de den lagsta generationen,
0. Ett objekt som “overlever” en GC, dvs. fortfarande refereras av programmet
och darfor inte kan tas bort, flyttas en generation uppat. Man har empiriskt visat
att nyligen skapade objekt ocksa ofta ar de som forst tas bort [31]. Genom att lata
GC:n endast utfora nabarhetsanalys pa objekt i generation 0 far man en mindre
paus i applikationen.
Naturligtvis forekommer det ocksa att objekt i aldre generationer upphor att
refereras till, vilket kraver en s.k. full GC som arbetar over samtliga generationer.
Tidsatgangen for en full GC blir storre, men detta uppvags normalt av att den
kan ske betydligt mer sallan (i storleksordningen 1:100 [34]) an GC for lagre
generationer.
5.3.4 Interoperabilitet med sprak utan Garbage Collection
Problem kan ocksa uppsta om en applikation skriven i ett programsprak med
GC behover dela minne med en extern komponent eller bibliotek. Da denna kod
befinner sig utanfor GC:ns rackvidd, kommer referenser till minnesadresser som
flyttas vid komprimering inte att uppdateras. Detta gor att den externa kompo-
nenten da kan skriva eller lasa fran en felaktig minnesadress. For att losa detta
problem kan ett sprak tillhandahalla en mekanism for att lasa (pin) minnet for
de objekt som delas. GC:n garanterar att lasta objekt inte kommer att flyttas
vid komprimering. Da detta kan ge samma problem med fragmentering som om
en icke-komprimerande garbage collector anvands, bor antalet lasta objekt hallas
nere, och om mojligt bor lasta objekt finnas i aldre generationer.
5.4. Realtidsaspekter 37
5.4 Realtidsaspekter
5.4.1 Kort om realtidsbegreppet
Med begreppet realtidssystem menas att systemet forutom att utfora en kor-
rekt funktion ocksa maste utfora denna inom en viss tid (ofta kallad responstid).
Tidpunkten nar systemet maste kunna returnera resultatet av funktionen kallas
deadline.
Man kan urskilja tva olika nivaer pa realtidskrav: harda och mjuka. For ett
system med harda realtidskrav sa innebar en missad deadline en katastrofal och
oacceptabel handelse. For ett system med mjuka realtidskrav ar en missad dead-
line en starkt oonskad handelse, men systemet kan fortsatta med forsamrad ser-
vice. Ett exempel pa ett hart realtidssystem ar en pacemaker, dar en fordrojning
i varsta fall kan orsaka forlust av manniskoliv. Mjuka realtidssystem innefattar
exempelvis video- och ljuduppspelning, dar en fordrojning ar oonskad men inte
helt fatal.
Vid studier av icke-realtidssystem agnas normalt storst uppmarksamhet at
snitt-tiden for att utfora en viss funktion. Forutsatt att funktionen upprepas
tillrackligt manga ganger ger detta en god bas for att uppskatta den totala ex-
ekveringstiden. For realtidssystem skiftar fokus istallet till tiden for varsta-fallet
(worst-case), da det ar den som bestammer systemets garanterade responstid.
Vilka tidsintervall som ar intressanta ar i hog grad beroende pa applikationen.
Styrsystem for fordon behover ofta responstider runt 20-50 ms, medan en synthe-
sizer for musikproduktion bor ligga under 6 ms[32].
5.4.2 Realtidssystem med garbage collection
Vid explicit minneshantering ar kostnaden for att allokera och avallokera minne
tydlig och latt atkomlig for analys pa samma satt som ovrig programkod. Om
istallet garbage collection anvands introducerar det ytterligare komplikationer da
tidpunkten for avallokering av minne inte langre ar tydligt definierad. Ett sadant
realtidssystem maste alltsa forutom de normala kraven pa programmets logik
ocksa kunna garantera att de pauser som introduceras av GC:n inte aventyrar
programmets formaga att halla sina deadlines.
38 Kapitel 5. Realtidsaspekter pa Garbage Collection
5.4.3 Minimum Mutator Utilization
Ett vanligt matt pa GC:ns prestanda har traditionellt varit den maximala pausti-
den, Tgc. Det ar den maximala tid som GC:n kan exekvera utan avbrott. Som
Cheng & Blelloch visar i [27] ar detta matt otillrackligt for att ge nagra garantier
gallande systemets responstid. Anledningen ar att maximal paustid inte sager
nagot om hur ofta pauserna intraffar. Flera tatt pa varandra foljande pauser kan
begransa mutatorns exekveringstid sa mycket att deadlinen missas.
Cheng & Blelloch foreslar istallet ett annat prestandamatt som lampar sig
battre for realtid, Minimum Mutator Utilization (MMU ) [27]. Ett systems MMU,
m(∆t), dar 0 ≤ m(∆t) ≤ 1, ar en funktion av storleken pa tidsintervallet, ∆t,
och sager hur stor del av varje tidsintervall som garanterat tilldelas mutatorn.
Detta innebar att ett och samma system har olika MMU beroende pa vilken
intervallstorlek man valjer att mata over. Vi kan beskriva programmets exekvering
med avseende pa tiden t, som en styckvis definierad funktion:
f(t) =
1 om mutatorn kor vid tiden t
0 om GC:n kor vid tiden t
(5.1)
Vi kan nu definiera ett uttryck for m(∆t) enligt:
m(∆t) =1
∆t·min
t0
∫ t0+∆t
t0
f(t)dt (5.2)
Om ett realtidssystem behover maximalt T sekunders korning av mutatorn
for att generera en respons, och vi vill garantera en responstid pa R sekunder sa
behover systemet en MMU enligt:
R ·m(R) ≥ T ⇐⇒ m(R) ≥ T
R(5.3)
Som en direkt foljd av detta sa ger den maximala paustiden Tgc en nedre
grans for responstiden, da m(∆t) = 0 for alla ∆t ≤ Tgc (lat t0 vara tiden da den
maximala GC-pausen borjar).
Figur 5.5 visar ett exempel pa hur MMU:n paverkas av regelbundenhet och
storlek pa GC:ns pauser.
5.5. Existerande losningar 39
Figur 5.5: Ett exempel pa hur MMU:n kan okas, medan den totala mangden arbetefor mutator och GC forblir konstant. A: GC-pauserna ar langa och oregelbundna,vilket paverkar MMU:n negativt bade m.a.p. langa och korta intervall. B: GC-pauserna har gjorts regelbundna, vilket okar MMU for det langre intervallet. Detkortare intervallet ar dock fortfarande begransat av paustidens storlek. C: Genomatt bryta upp GC:ns arbete i mindre delar kan MMU:n okas aven for det mindreintervallet.
5.5 Existerande losningar
5.5.1 Cheng och Blelloch
Cheng och Blellochs losning ar en GC implementerad for SML-kompilatorn TILT,
som ar parallell bade i avseendet att GC:n kan exekvera samtidigt som mutatorn
och att GC:ns arbete kan delas upp pa flera processorer. Processorerna anvander
sig av ett tva-nivaers system med stackar for att dela upp arbetet: en lokal stack
40 Kapitel 5. Realtidsaspekter pa Garbage Collection
for varje processor och en stack som delas mellan samtliga processorer. Stackarna
innehaller de gra objekt (se avsnittet om inkrementell nabarhetsanalys ovan) som
for tillfallet behandlas. Den delade stacken anvands for att dela arbete mellan
processorerna och darmed gora systemet skalbart vid okat antal processorer.
GC:n ar kopierande och mutatorns lasningar sker i from-space, for att undvika
behovet av skrivbarriarer, vilket forfattarna menar introducerar en oacceptabelt
hog kostnad. Istallet anvands en skrivbarriar som uppdaterar kopian i to-space,
och lasningar fran mutatorn kan ske helt utan extra kostnad i tid.
Parallellismen medfor dock flera komplikationer for att undvika s.k. race con-
ditions mellan processorerna, t.ex. sa att ett objekt inte kopieras till to-space
flera ganger av olika GC-tradar. De loser dessa problem genom att introducera
synkroniseringsmekanismer, vilka har nackdelen att de for med sig en betydande
extra kostnad i tid, ca 40% enligt forfattarnas egna matningar.
5.5.2 Bacon, Cheng och Rajan
Bacon, Cheng och Rajan beskriver i [28] en realtids-GC for Java, vilken senare
fick namnet Metronome. Metronome ar en hybrid mellan kopierande och icke-
kopierande, vilket innebar att den normalt sett inte flyttar objekt som overlevt
en GC-cykel. Detta ar huvudsakligen for att undvika det extra utrymme som en
kopierande GC kraver, vilket forfattarna menar ar problematiskt.
Deras strategi for att halla nere fragmentering ar istallet att dela upp det
lediga minnet i separata “pages” pa 16 KB, vilka i sin tur indelas i block av en
viss storlek. Samtliga block i en viss page ar av samma storlek, och nya objekt
allokeras fran den minsta blockstorlek som de ryms i. Pa detta satt undviker
man att stora och sma objektstorlekar blandas, och fragmenteringen minskar
(forfattarna rapporterar en maximal fragmentering pa 2% vid testkorningar).
I de fall fragmentering anda intraffar utfors defragmentering genom att ob-
jekt kopieras fran glest befolkade pages till tatt befolkade. I motsats till Cheng
och Blelloch omdirigerar man mutatorns lasning till kopian i to-space genom
att anvanda en lasningsbarriar. Genom att bl.a. kombinera lasningsbarriarens
kontroll av huruvida omdirigeringspekaren ar null med Java-VM:ens kontroll av
nullreferenser kan de visa resultat dar extrakostnaden i tid for lasningsbarriaren
endast ligger kring 4%.
5.5. Existerande losningar 41
Metronome ar inte parallell, utan anvander sig istallet av tidsbaserad up-
pdelning av processorresurser mellan mutator och GC. Forfattarna visar experi-
mentellt att en tidsbaserad uppdelning ger betydligt battre MMU an en arbets-
baserad, trots att den i medeltal ger langre paustider. Ytterligare experimentell
data ges i [32], dar Metronome anvands for att implementera en mjukvarusynth
med en uppmatt maximal responstid pa under 6 ms.
5.5.3 Pizlo, Hosking och Vitek
Pizlo, Hosking och Viteks GC ar en vidareutveckling av Metronome kallad HRT-
GC (Hierarchical Real-Time Garbage Collector) [29]. HRTGC tillater olika delar
av applikationen att exekvera med olika realtidskrav genom att dela upp min-
nesutrymmet i separata delar, s.k. heaplets. Forfattarna argumenterar for att
manga realtidssystem innehaller komponenter som inte ar kritiskt tidskansliga,
och att man genom att separera dem gor det lattare att skriva och visa korrekthet
for realtidskomponenterna.
Det hierarkiska systemet innebar att varje heaplet har sin egen GC, vilken kan
anpassas till minnesanvandningen for den aktuella delen av systemet. Referenser
som stracker sig mellan objekt i olika heaplets delas in i tva kategorier: upp-
och korsreferenser. En uppreferens pekar till ett objekt uppat i hierarkin, medan
ovriga referenser ar korsreferenser. Vid nabarhetsanalysen soker GC:n igenom inte
bara sin egen heaplet, utan aven de som finns under den i hierarkin. Detta gor
att en uppreferens inte kraver nagon extra kostnad att etablera.
Korsreferenserna hanteras istallet genom ett s.k. cross-set, vilken ar gemen-
sam for alla heaplets. Den lagrar vilka objekt som innehaller korsreferenser, vilket
systemet utfor genom anvandandet av en skrivbarriar. Eftersom en GC bara kan
avallokera objekt i sin egen heap kravs ocksa en speciell GC, kallad cycle collec-
tor, for att hantera de fall dar det finns cykliska korsreferenser mellan heaplets.
Cycle collectorn:n utfor sjalv ingen avallokering, utan nollstaller endast korsrefer-
enser hos “doda” objekt som refererar cykliskt till varandra. Objekten kan sedan
avallokeras av sin respektive GC.
Forfattarna visar pa en forbattring i responstid pa 15% for HRTGC gentemot
Metronome, medan den totala exekveringstiden forsamras med i medeltal 30%.
42 Kapitel 5. Realtidsaspekter pa Garbage Collection
5.6 Slutsats
Det ar uppenbart att realtidsgarantier for garbage collection inte langre bara
ar en teoretisk konstruktion, utan i sjalva verket ar mojligt att implementera i
praktiken. Da realtidssystem naturligtvis ocksa i hogsta grad ar beroende av sta-
bilitet sa torde den minskade risken for minnesrelaterade programfel vara ytterst
valkommen. Dock sa innebar realtids-GC a andra sidan nya utmaningar for pro-
grammeraren, i form av behovet att uppskatta hur snabbt programmet allokerar
minne. Aven den snabbaste GC har en grans for hur mycket den kan hantera.
Problematiken med att addera den komplexitet som garbage collection be-
visligen innebar till ett system som kan krava omfattande formell verifiering av
korrekthet ska heller inte underskattas. Det man vinner i utvecklingstid far inte ga
forlorat i okad tid for verifiering. Problematiken skulle naturligtvis kunna mildras
genom att anvanda en GC som i sig redan verifierats formellt.
Utanfor den begransade sfar av implementationer dar harda realtidskrav rader
maste ocksa fordelarna med tidsgarantier extra noga vagas mot nackdelarna i
form av i medeltal forsamrad prestanda. I manga fall torde risken for en missad
deadline vara acceptabel om den innebar en snabbare programkorning i ovrigt. I
dessa fall ter sig den hierarkiska modellen med latt utbytbara realtidskrav vara
ett attraktivt alternativ, da programmeraren latt kan anpassa sitt programs re-
altidsbeteende.
Kapitel 6
Systembeskrivning
Losningen ar uppdelad i tre olika lager; kommunikation-, data- och presenta-
tionslager, vilka askadliggors i Figur 6.1. Kommunikations- och datalagret bestar
av ett antal mjukvarukomponenter som behandlar signaler som kommer in fran
CAN-bussen och skickar dem vidare upp till presentationslagret. Presentationsla-
gret bestar av grafiska kontroller som visar signalvarden och logik som styr nar
kontrollerna ska uppdateras.
Programmet ar utvecklat for Microsoft Windows XP och Microsoft .NET 3.5
med Visual Studio 2008. For en grafisk overblick av systemets olika delar hanvisas
till bilaga A, Systemoversikt.
6.1 Anvandning av komponenter
Losningen ar uppbyggd av ett antal komponenter (se aven kapitel 4, Kompo-
nentbaserad utveckling), och ett ramverk for att hantera dessa. En komponent i
systemet ar en klass som implementerar ett granssnitt kallat IBvS10Component,
och kan konsumera och tillhandahalla tjanster. Komponenterna ar implementer-
ade genom .NET assemblies som ligger i en sarskild komponentkatalog pa disk.
Ramverket ar ansvarigt for att skapa komponenterna via en s.k. komponentfabrik
som implementeras i klassen ComponentFactory, och att avsluta dem nar sys-
temet stangs av. Ramverket tillhandahaller ocksa ett register som en komponent
kan anvanda for att hitta andra komponenter i systemet.
43
44 Kapitel 6. Systembeskrivning
CAN-hårdvarugränssnitt
CAN-hantering
J1939-hantering
Signalkö
Signallogik:översättning enligtspråk samt larm
Grafiska kontroller
Grafikuppdatering ochvalidering av värden
Presentationslager
Datalager
Kommunikationslager
Signal-avkodning
Figur 6.1: En oversikt av de olika delar som ingar i losningen.
6.1.1 Tjanster
En komponent kan erbjuda tjanster (services) till andra komponenter genom
att implementera ett granssnitt (se figur 6.2) och registrera det hos Compo-
nentFactory-klassen. Registreringen sker med ett anrop till funktionen AddSer-
vice med granssnittet som argument. Exempelvis tillhandahaller signaldatabas-
komponenten en tjanst for att ta reda pa i vilken hardvarusignal som en logisk
signal finns. Nar en annan komponent behover denna information kan den soka
efter tjansten hos ComponentFactory via metoden GetService, notera att med det-
ta upplagg behover komponenten endast referera till en assembly som innehaller
granssnittet. Pa detta satt minskas beroendet mellan olika komponenter och det
blir lattare att byta ut delar i systemet.
6.1.2 Systemets uppstart
Nar systemet ska startas upp installer sig fragan i vilken ordning komponen-
terna ska startas. Da en komponent kan vara beroende av andra komponenter
for att kunna utfora sina egna tjanster, sa maste systemet tillse att dessa finns
6.2. Kommunikationslagret 45
+PerformComponentBinding() : bool+DestroyComponent() : void+StartComponent() : void
«gränssnitt»IBvS10Component
Figur 6.2: De tre metoder som varje komponent implementerar.
tillgangliga nar en komponent initieras. En losning som vi forst overvagde var
att lata varje komponent registrera vilka andra komponenter den beror pa och
anvanda denna information for att bygga en riktad beroendegraf. Denna skulle
sedan kunna anvandas for att garantera att en komponent initieras efter alla de
komponenter som den beror pa.
Detta visade sig dock snabbt vara en otillracklig losning, da cirkelberoenden
forekom. Vi valde istallet att losa problemet genom att dela in uppstarten i tva
separata faser: konstruktion och bindning. I konstruktionsfasen skapar kompo-
nentfabriken komponentobjekten. Den gor detta genom att iterera igenom de
.NET assemblies som finns i komponentkatalogen och skapa en instans av de
klasser som hittats vilka implementerar granssnittet IBvS10Component.
I bindningsfasen anropar komponentfabriken metoden PerformComponent-
Binding pa varje komponent, som da anvander registret for att hitta kompo-
nenter som tillhandahaller de tjanster som den sjalv behover. Notera att denna
sokning med nodvandighet maste ske efter att konstruktionsfasen ar helt slutford,
sa att samtliga komponenter ar garanterade att ha skapats. Notera vidare att in-
ga tjanster annu kan anropas under bindningsfasen, eftersom alla komponenter
inte ar garanterade att ha slutfort sin bindning. Nar bindningsfasen ar slutford
ar komponenterna redo att kunna utfora de tjanster som de registrerade i kon-
struktionsfasen och systemet kan borja att anvandas.
6.2 Kommunikationslagret
Kommunikationslagrets uppgift ar ta emot de hardvarusignaler som kommer in
fran CAN-bussen, extrahera de logiska signaler som de innehaller och sedan
lagga de logiska signalerna i signalkon. For de hardvarusignaler som foljer J1939-
standarden tillkommer ett extra oversattningssteg fore extraheringen av logiska
46 Kapitel 6. Systembeskrivning
signaler. Figur 6.3 illustrerar signalvagen oversiktligt.
BAE Systems Hagglunds har sedan tidigare ett ramverk for hantering av CAN-
signaler, som innefattar de tva nedersta delarna i lagerstacken (se figur 1 ovan).
Varje CAN-hardvara har ett hardvarugranssnitt som kommunicerar med den och
skickar signalerna vidare upp till CAN-hanteringen i ett standardiserat format.
Detta gor att CAN-hanteringen ar oberoende av vilken hardvara som anvands.
CAN-hanteringen (klassen CanDispatch) skoter en prenumerationsservice dar
de delar i systemet som ar intresserade av en viss CAN-signal registrerar detta
hos CAN-hanteringen. Nar signalen inkommer ser CAN-hanteringen till att den
nar ratt avsandare.
Vart arbete innefattar att utoka det befintliga ramverket med J1939-hantering,
samt att implementera stod for ytterligare en CAN-hardvara.
6.2.1 Signaltyper
Systemet sarskiljer tva olika typer av signaler: hardvarusignaler och logiska sig-
naler. En hardvarusignal ar en signal pa CAN-bussen som kan vara antingen ett
vanligt CAN-meddelande eller ett J1939-meddelande. Varje hardvarusignal in-
nehaller en eller flera logiska signaler, dar en logisk signal ar ett visst varde som
ar av intresse for systemet, exempelvis motortemperatur. Information om vilka
logiska signaler som en viss hardvarusignal innehaller finns i en signaldatabas som
lases in vid uppstart av systemet.
6.2.2 CAN-hardvara
Signalramverket innehaller sedan tidigare stod for tva olika CAN-hardvaror: Kvas-
er USB-CAN och den virtuella debug-hardvaran RemoteCan. RemoteCan simuler-
ar CAN-meddelanden over standard TCP/IP och mojliggor darmed testning utan
att ha en fysisk CAN-enhet tillganglig.
Vi har implementerat stod for ytterligare en CAN-hardvara: Vector CANCa-
seXL. Da vi paborjade arbetet hade vi endast tillgang till ett C++ API som
Vector tillhandaholl darfor vi anvant oss av C++/CLI for att enklare kunna
anropa dess funktioner. Klassen CanCaseHardware finns i projektet Can Case
Hardware, och implementerar precis som de befintliga Kvaser och RemoteCan
6.2. Kommunikationslagret 47
granssnitten ICanHardware och ICanHardwareConfiguration.
6.2.3 CAN-hantering
CAN-hanteringen ar implementerad i klassen CanDispatcher, och tillhandahaller
mojligheten for andra komponenter att kunna ta emot och skicka CAN-signaler.
Kommunikationen mellan CanDispatcher och ovriga delar av systemet foljer de-
signmonstret Publish/Subscribe (kallas aven Observer). Nar nagon del i systemet
vill ha information om en viss CAN-signal skapar den en prenumeration hos Can-
Dispatcher och skickar med en referens till ett objekt av typen AutoResetEvent.
AutoResetEvent ar en standardklass i .NET som har tva metoder: Wait och Set.
Nar Wait anropas blockerar anropet anda tills att en annan trad anropat Set.
Nar en signal inkommer anropar CanDispatcher metoden Set och prenumeranten
som vantar pa Wait kan da fortsatta med att lasa ut och hantera signalen (se
figur 6.4).
6.2.4 J1939-hantering
J1939-hanteringen ar implementerad i klassen J1939Dispatcher och oversatter
CAN-signaler till J1939-signaler. Pa samma satt som CanDispatcher anvander
den Publish/Subscribe for att skicka signalerna vidare. Nar en prenumeration pa
en J1939-signal skapas registrerar den en egen prenumeration pa motsvarande
CAN-signal hos CanDispatcher.
6.2.5 Signalkonverterare
Signalkonverteraren SignalConverter har som uppgift att ta in en CAN- eller
J1939-signal och extrahera de logiska signaler som den innehaller. Inhamtning av
signaler sker genom en prenumeration hos CanDispatcher resp. J1939Dispatcher.
Efter att signalen delats upp i logiska signaler (se avsnittet SignalDatabas nedan)
avkodas deras data enligt den specifikation som galler for respektive signal (aven
har med hjalp av signaldatabasen). Slutligen lagger SignalConverter in de avko-
dade signalerna i signalkon.
48 Kapitel 6. Systembeskrivning
CAN-ID Data
J1939-ID DataKälla
Signal-databas
Logiskt ID Rådata Logiskt ID Rådata...
Signal-databas
Signal-databas
Signal-databas
Logiskt ID Normaliserad data
Till signalkö
Figur 6.3: Figuren illustrerar hur en CAN-signal ror sig genom kommunikation-slagret.
6.2. Kommunikationslagret 49
CAN-Data
Event
CAN-Data
Event
Event.Set() GetQueue()
CanDispatch
Prenumerant
Event
CreateSubscription(CanID, Event)
1. 3. 4.
CanDispatch
Prenumerant
Event
2.
Event.Wait()
CanDispatch
Prenumerant Prenumerant
CanDispatch
Figur 6.4: Designmonstret Publish/Subscribe. 1. Prenumeranten startar en prenu-meration hos CanDispatch genom att skicka en referens till sitt Event-objekt. 2.Prenumeranten vantar pa att Event.Wait() returnerar. 3. CAN-signalen inkom-mer till CanDispatch och den anropar Event.Set(). 4. Event.Wait() returnerar forprenumeranten och den kan lasa ut signaldatan fran CanDispatch.
6.2.6 Signaldatabas
Signaldatabasen har till uppgift att oversatta mellan CAN-ID, J1939-ID och ett
logiskt ID. Notera att mappningen mellan dem inte alltid ar ett till ett. Exem-
pelvis kan ett CAN-paket innehalla varden fran flera givare och darmed flera
logiska ID. Databasen innehaller all information som behovs for att avkoda och
konvertera ett CAN-paket till signaler och varden. Efter konverteringen kommer
signalens varde fa en datatyp. Denna konvertering kallas for datatypkonvertering.
Komponenten jobbar mot XML-filen SignalDefs.xml som maste ligga i samma
katalog. Filen kan alltsa andras utan att man behover kompilera om komponen-
ten. XML-filen bestar av ett antal element av typen HardwareSignal som rep-
resenterar en hardvarusignal. Varje HardwareSignal innehaller i sin tur en eller
flera LogicalSignal som representerar de logiska signaler som hardvarusignalen
innehaller. I varje LogicalSignal finns ocksa information om signalen sasom bl.a.
livslangd , prioritet och den formel som anvands vid datatypkonvertering. Konver-
teringsformeln ar angiven som en strang av C#-kod, vilken kompileras dynamiskt
nar systemet startar. Den kompilerade formeln kan sedan anropas for att utfora
konverteringen.
Till XML-filen hor ocksa dess schema, angivet i standardformatet XSD. Schemat
anger vilka taggar som far forekomma och dess struktur. Visual Studio innehaller
50 Kapitel 6. Systembeskrivning
verktyg for att automatiskt utifran XSD-filen generera en datastruktur i C# som
kan anvandas for att representera XML-datan i minnet.
For att gora uppslagningar i den inlasta datan anvands LINQ (Language In-
tegrated Query) som ar en komponent i Microsofts .NET-ramverk. LINQ ger
tillgang till en SQL-liknande syntax direkt i programmeringsspraket, sa att sam-
ma kod kan anvandas oavsett vilken underliggande datakalla som anvands. Ex-
empel pa mojliga datakallor ar XML-filer och relationella databaser.
Fordelen med denna losning ar att programmeraren frigors fran bordan att
skriva kod for inlasning av XML-filen, da den istallet kan automatgenereras. Aven
koden for sjalva utlasningen av data blir betydligt kortare an att manuellt iterera
genom datastrukturen.
6.2.7 CanLayerComponent
Komponenten CanLayerComponent fungerar som en brygga mellan Hagglunds
signalramverk och komponentsystemet. Komponenten innehaller en instans av
CanDispatcher, J1939Dispatcher och det aktuella hardvarugranssnittet. CanLay-
erComponent har en tillhorande konfigurationsfil dar det gar att stalla in vilken
CAN-hardvara och buss-hastighet som ska anvandas.
6.3 Datalagret
Datalagret har till uppgift att behandla signaler som kommer fran kommunika-
tionslagret och skicka vidare dem till presentationslagret. Alla signaler som kom-
mer fran kommunikationslagret kommer in till komponenten Signal Management
som i sin tur anropar de komponenter som lyssnar efter signaler. Alla komponen-
ter i datalagret kan anropa signalkon och registrera sitt intresse for en eller flera
signaler.
I datalagret finns det en komponent som hanterar larm. Med larm menas
att nagon signal har ett extremt varde. Det kan ocksa vara en kombination av
signaler som ger upphov till ett larm. Exempelvis sa visas ett larm for foraren om
bakluckan ar oppen under fard, i just detta fallet sa beror larmet pa om vardet for
hastigheten ar hogre an ett visst varde och att signalen fran givaren till bakluckan
anger att den ar oppen.
6.3. Datalagret 51
6.3.1 Databindning i .NET
.NET innehaller en mekanism som kallas databindning (eng. Data binding) och
bestar av tre delar:
• Datakalla: Ett objekt med publika properties som innehaller den data som
ska propageras till en mottagare.
• Mottagare: En grafisk kontroll som presenterar datakallans data
• Bindningskalla: Kopplar ihop tva properties, en hos datakallan och en hos
mottagaren, sa att mottagarens property andras nar kallans gor det.
For alla properties hos grafiska kontroller kan man i Visual Studios designlage
valja att binda den till en property hos en datakalla. Nar tva properties kopplats
ihop uppdateras mottagaren automatiskt nar datakallan andras. Tillgangliga
datakallor visas i en meny, vilket gor att ingen programmering kravs. En datakalla
blir tillganglig for ett formular genom att dess motsvarande bindningskalla adderas
till formularet.
6.3.2 Signalko
Signalkon ligger i projektet Signal Management, denna komponent bestar tekniskt
sett av tva komponenter men bara en ar synlig utifran. Den osynliga komponenten
ligger i klassen SignalDecoder. Denna klass ar en brygga mellan kommunikation-
slagret och presentationslagret.
Den andra komponenten ar representerar signalkon. Komponenten bestar en-
dast av en klass, SignalQueue, klassen innehaller ett register over vad vilka funk-
tioner som ska anropas nar det kommer in nya signaler. Om en funktionen beror
pa flera signaler sa kommer den att anropas forst nar en ny kopia pa alla signaler
har inkommit. For att prenumerera pa en signal behover man endast anropa
funktionen RegisterForSignal i granssnittet RegisterForSignalInterface.
6.3.3 Signallogik
Datalagret innehaller sa kallade logikkomponenter, dessa skiljer sig till viss del
fran vanliga komponenter. Logikkomponenter kan skicka vidare signaler till pre-
sentationslagret, dessa varden kan sedan bindas direkt till grafiska kontroller. En
52 Kapitel 6. Systembeskrivning
logikkomponent maste arva fran klassen LogicComponent, som i sin tur imple-
menterar komponentengranssnittet IBvS10Component.
Systemet innehaller fyra stycken logikkomponenter; Engine, Gearbox, Hatches
och Joint. Dessa fyra komponenter tar hand om signalerna fran respektive fysisk
motsvarighet. I enlighet med komponent-designmonstret sa registrerar de sitt
intresse for signaler i sin startfunktion. I detta anrop anger de aven vilken funktion
som skall anropas av nar dessa signaler inkommer.
I presentationslagret sa binds logikkomponenterna ihop med de grafiska kon-
trollerna med hjalp av databinding (se avsnittet 6.3.1). For att detta ska fungerar
behovs en klass som registrerar komponenten som en datakalla. Varje logikkom-
ponent behover en datakalla. Alla datakallor ska arva fran klassen Component-
Connection och anropa dess konstruktor med vilken logikkomponent den repre-
senterar som argument.
6.3.4 Larmhantering
Ett larm ar en ovantad handelse som det ar extra viktigt att personalen i fordonet
uppfattar som t.ex. att motorns oljetryck ar for hogt.
Varje enskilt larm definieras som en funktion med ett antal signaler som
sin indata. Funktionen utvarderar signalvardena och returnerar huruvida larmet
skall sandas eller inte. Nar ett signalvarde uppdateras sa anropar larmkomponen-
ten alla larmfunktioner som beror pa den aktuella signalen och larmets status
utvarderas pa nytt.
En komplikation uppstar om en signal slutar sandas fran fordonet, sa att
signalvardet blir foraldrat. Detta kommer i den nuvarande losningen inte att
registreras som en forandring i signalvardet, sa larmfunktionen kommer da inte
att koras pa nytt. Se aven kapitel 7.1.
Varje komponent som kan avge ett larm implementerar granssnittet EmitA-
larmInterface vilket innehaller metoden EmitAlarm. Varje larm har ett unikt ID i
form av ett heltal, vilket anges som argument till EmitAlarm nar ett alarm sands
ut. Detta ID gor det mojligt for de komponenter som tar emot larm att indenti-
fiera vilket larm det ror sig om och aven komma at kulturspecifika installningar
for larmet, sasom oversattningar.
6.4. Presentationslagret 53
6.3.5 Databindningskallor
Varje logikkomponent behover en datakalla for att den ska ga att binda ihop
med en kontroll i presentationslagret. Datakallan bor innehalla installningar som
exempelvis specificerar i vilken enhet som varje varde ska presenteras i.
6.4 Presentationslagret
Presentationslagret bestar av ett formular, ett antal grafik-kontroller och tva kom-
ponenter. Den forsta komponenten hanterar vyerna och den andra skoter om
sprakhanteringen. Utover standardkontrollerna i .NET har vi skapat fyra extra;
Dundas Wrapper, GearboxControl, Home Button och Pictogram.
Kontrollen Dundas Wrapper ar en kontroll som inkapslar Dundas Gauge,
vilket ar det bibliotek som anvands for systemets grafiska matare. Dundas Wrap-
per innehaller funktionalitet for att inaktivera mataren nar den far ett medde-
lande om att signalen inte langre ar giltig. Den innehaller aven funktionalitet for
att kunna andra matarens matomfang och forklaringstext beroende pa systemets
kulturinstallning. Kontrollen GearboxControl ar en specialbyggd kontroll for att
visa i vilket lage som vaxeln star (se figur 6.5).
Kontrollen Home Button ar den knapp som visas langst upp i hogra hornet i
varje vy. Om anvandaren trycker pa den sa flyttas denne till Home-vyn.
6.4.1 Uppdateringskomponent
Komponenten UpdateControls schemalagger nar grafiska kontroller i presenta-
tionslagret ska uppdateras. Den haller aven redan pa nar den information som
kontrollen visar blir for gamla, da kommer komponenten att inaktivera kontrollen
for att indikera att data saknas. Komponenten behovs eftersom att hela program
drivs av signaler, komponenterna i logiklagret anropas aldrig annars. Figur 6.6
visar forarvyn nar alla kontroller har giltiga signalvarden; figur 6.7 visar vyn nar
endast hastigheten ar giltig.
54 Kapitel 6. Systembeskrivning
Figur 6.5: Den grafiska kontrollen for vaxelvaljaren, GearboxControl, visar attvaxeln star i neutrallage.
6.4. Presentationslagret 55
Figur 6.6: Samtliga kontroller i forarvyn tar emot signalvarden. Matarnas olikautseende har valts for att demonstrera mojligheterna med Dundas Gauge, seavsnitt 2.7.1.
56 Kapitel 6. Systembeskrivning
Figur 6.7: Endast signalen fordonshastighet tas emot. Ovriga visare slacks utoch matnalarna plockas bort (jfr. figur 6.6) for att indikera att deras data nu arforaldrad.
6.4. Presentationslagret 57
6.4.2 Vyer och vykomponent
Det grafiska granssnittet ar upp byggt av ett antal vyer som anvandaren kan
vaxla emellan. I systemet har vi valt att lata en vy representeras av en pan-
el(UserControl). Nar anvandaren vaxlar vy sa visas den motsvarande panel. Vyer-
na arver av klassen ViewBase, den tillhandahaller handelsehantering for sprakbyte
och larm. Logiken for vy-hanteringen ligger i komponenten View Management.
6.4.3 Sprakhantering
Programmet ar oversatt till svenska och engelska med verktyget Sisulizer, som
finns beskrivet i avsnitt 3.1. Forutom att man kan anvanda Sisulizer for att forma
kontroller sa kan man aven andra installningar pa bindningskallor, sa som att
stalla in pa bindningskallan for motorn att den ska konvertera hastigheten till
mph istallet for km/h.
6.4.4 Piktogram
Piktogrammet ar implementerat som en extern kontroll som kan dras in i design-
ern, precis som ovriga grafiska element. For 3D-renderingen anvands Microsofts
spelutvecklingsbibliotek XNA.
For att framstalla 3D-modellen som anvands i piktogrammet ha vi utgatt
ifran en CAD-ritning av karossen for BvS10. Det ursprungliga malet var att ha
en fullstandig modell av vagnen med alla yttre detaljer sasom lampor och luckor
inkluderade, men detta overgavs pga. tidsbrist. Den modell som anvands visar
chassit for fram- och bakvagn samt den bakre luckan.
Nar ett larm intraffar i systemet visar piktogrammet en varningssymbol med
en pil till den del i vagnen dar felet intraffat. Varje larm har en kalla som bestar
av ett namn pa en del i vagnen, t.ex. ”Engine”. Dessa namn oversatts sedan till
positioner i modellen via en XML-fil som innehaller delarnas namn och positioner.
Denna struktur ar ocksa hierarkiskt uppbyggd sa att en del kan ha flera ”barn”-
delar vars positioner anges relativt till dess foralder. Detta ar nodvandigt for att
exempelvis kunna ange bakdorrens position aven fast bakvagnen svangt.
58 Kapitel 6. Systembeskrivning
Konvertering av modeller
Eftersom XNA har inbyggt stod for modeller i Microsofts egna .X-format, behovde
Catia-modellerna konverteras. Catia[10] innehaller ingen exporterare till .X, men
daremot finns en till VRML-formatet tillganglig. Det externa programmet PolyTrans[11]
kunde sedan anvandas for att omvandla VRML-filen till .X.
For att gora modellen mindre kravande att rendera minskades polygonantalet
genom att ta bort manga mindre detaljer, sasom skruvar och nitar. Detta kunde
goras genom att manga av de sma detaljerna anvanda sig av andra material
an ovriga vagnen. Genom att filtrera bort polygoner med dessa material kunde
antalet polygoner minskas med 20 - 30%.
6.5 Manualvyn
Manualvyn anvander sig av hjalpfiler i HTML-format, vilka ligger i en virtuell kat-
alogstruktur beskriven via en XML-fil. For att visa filerna i programmet anvands
den standardkontroll for att visa HTML-sidor som ingar i .NET, vilken i sin tur
anvander sig av Internet Explorers renderingsmotor.
Kapitel 7
Slutsats
Malet med detta arbete var ett implementera i en prototyp av ett information-
ssystem pa .NET platformen. Under arbetet har vi visat hur man konstruerar en
lagerbaserad komponentarkitektur. Vi har aven undersokt hur ett realtidssystem
paverkas av garbage collection.
7.1 Begransningar
3D-grafiken i kombination med det bibliotek som anvands for grafiska matare gor
systemet forhallandevis kravande. Ett problem som uppstod var att nar systemet
inte lyckats halla tidskravet for en signal sa att mataren slacks, orsakar omritnin-
gen av mataren i sin tur en fordrojning sa att andra signalvarden ocksa hinner bli
for gamla. Det kan orsaka en sorts “lavin”-effekt av inaktiveringar bland matarna.
Effekten kan motverkas genom att oka livslangden pa en signal, alternativt att
kora systemet pa mer kraftfull hardvara.
Logiken for att avgora om ett alarm bor skickas ut finns i samma metod
som omvandlar signalvardet innan det skickas till presentationslagret. Detta in-
nebar att om det inte finns nagon grafisk kontroll som visar ett visst signalvarde
sa kommer heller inte nagra larm att skickas for det. For att losa detta skulle
larmkoden behova vara helt frankopplad presentationslagret, sa att logiken kors
nar en signal inkommer istallet for nar den visas. En mojlig arkitektur kan vara
att registrera larmhanterare som prenumererar pa signaler pa samma satt som
59
60 Kapitel 7. Slutsats
logikkomponenterna gor i den nuvarande losningen.
Forfarandet vid konvertering av modeller ar arbetsamt och forstor ocksa my-
cket av den metadata som den ursprungliga modellen inneholl, sasom ID:n for de
olika delar som vagnen bestar av. Denna data skulle kunna anvandas for att med
automatik kunna polygonreducera modellen, och ocksa kunna anvandas for att
generera informationen om hur delarna i vagnen ar sammankopplade.
7.2 Framtida arbete
Ett attraktivt satt att losa problematiken med utritningshastigheten skulle vara
att anvanda hardvaruacceleration via grafikkortet. Detta skulle dock krava ett
annat mjukvarubibliotek an det som anvants, da Dundas Gauge arbetar enbart
via processorn. Via hardvaruaccelererad grafik blir ocksa rotation och skalning av
kontroller sett till prestanda mycket “billiga” operationer.
I den nuvarande prototypen kan personalen bara se information om sitt eget
fordon i VIS. En framtida utveckling skulle kunna innehalla mojligheten att se
information om andra fordon i samma trupp. Ytterligare en mojlighet ar att
integrera en karta i systemet for att latt kunna fa en battre overblick av slagfaltet.
For kommunikation mellan fordon lampar sig naturligtvis inte CAN-bussen, utan
en tradlos overforing maste till.
Den lagerbaserade designen i prototypen gor det forhallandevis enkelt att infor
en ny signalkalla, exempelvis en hardvara for att ta emot radiosand information.
For att infora stod for tradlosa enheter kan man infora tva nya komponenter(se
figur 7.1), en hardvaru-komponent som kommunicerar med hardvaransdrivrutin
och en komponent som avkodar det protokoll som de tradlosa enheterna anvander.
Denna design mojliggor stod for flera tradlosa enheter, sa lange de anvander
samma protokoll. Om man installet vill lagga till stod for en tradlos CAN-
hardvaruenhet behover man endast implementera stod for en ny hardvara da
denna anvander CAN-protokollet, som redan stods.
7.2. Framtida arbete 61
Figur 7.1: Tankbar framtida anpassning av lagerarkitekturen for WLAN (jfr. figur6.1)
Referenser
[1] BvS10 Produktbroschyr. BAE Systems plc 2007. http://www.baesystems.
com/BAEProd/groups/public/@businesses/@landarmaments/documents/
bae_publication/la_hagg_brochure_bvs10.pdf. Hamtad 2008-11-09.
[2] ISO Standard 15765-1:2004: “Road vehicles – Diagnostics on Controller Area
Networks (CAN) – Part 1: General information”
[3] ISO Standard 15765-2:2004: “Road vehicles – Diagnostics on Controller Area
Networks (CAN) – Part 2: Network layer services”
[4] Windows GDI. Microsoft Corporation. http://msdn.microsoft.com/
en-us/library/dd145203%28VS.85%29.aspx. Hamtad 2010-03-13.
[5] Dundas Gauge for .NET. Dundas Data Visualization, Inc. http://
www.dundas.com/Components/Products/Gauge/NET/index.aspx. Hamtad
2010-03-13.
[6] DirectX Software Development Kit. Microsoft Corporation.
http://www.microsoft.com/downloads/details.aspx?FamilyID=
519aae99-b701-4ca1-8495-39ddde9d7030&displaylang=en Hamtad
2010-03-13.
[7] Lutz Roeder, http://www.lutzroeder.com/dotnet/. Hamtad 2010-03-13.
[8] Infralution, http://www.infralution.com/globalizer.html. Hamtad
2010-03-13.
[9] Sisulizer Ltd & Co KG, http://www.sisulizer.com/. Hamtad 2010-03-13.
63
64 REFERENSER
[10] Catia version 5. IMB Corp. http://www-2000.ibm.com/software/
applications/plm/catiav5/. Hamtad 2010-03-13.
[11] PolyTrans, Okino Computer Graphics. http://www.okino.com/conv/conv.
htm. Hamtad 2010-03-13.
[12] Abdelmadjid Ketfi, Noureddine Belkhatir. Dynamic Interface Adaptability
in Service Oriented Software. Eighth International Workshop on Component-
Oriented Programming (WCOP’03), July 21, 2003 - At ECOOP 2003, Darm-
stadt, Germany.
[13] Microsoft Corporation. Programming with Components. http://msdn.
microsoft.com/en-us/library/0ffkdtkf.aspx. Hamtad 2008-11-09.
[14] Tobin Titus, Rick Delorme and Don Reamey. Pro .NET 1.1 Remoting, Re-
flection, and Threading. p343-395, ISDN 9781590594520, November 2006,
Apress.
[15] Robert C. Martin. Aglie Software Development, Principles, Patterns and
Practices. Prentice Hall, 1st edition, p149-153, October 25, 2002 ISBN
0135974445.
[16] Paul C. Clements. From Subroutines to Subsystems: Component-Based Soft-
ware Development. The American Programmer, vol. 8, no. 11, November
1995.
[17] Ivica Crnkovic. Component-Based Software Engineering - New Challenges in
Software Development. Journal of Computing and Information Technology -
CIT vol 11, no. 3, p. 151-161, 2003.
[18] Szyperski Clemens. Component Software: Beyond Object-Oriented Program-
ming. ASIN B001NJCM6M. Addison Wesley Longman Ltd, 1998.
[19] Joseph R. Kiniry. Semantic Component Composition. GCSE/SAIG Apr
2002.
[20] Developing an OSGi-like Service Platform for .NET. Escoffier, C.; Donsez,
D.; Hall, R.S. Consumer Communications and Networking Conference, 2006.
CCNC 2006. 3rd IEEE Volume 1, Issue , 8-10 Jan. 2006 p. 213-217.
REFERENSER 65
[21] Guy Bieber and Jeff Carpenter. Introduction to Service-Oriented Pro-
gramming (Rev 2.1), White paper, http://www.openwings.org/download/
specs/ServiceOrientedIntroduction.pdf. Hamtad Dec 2008.
[22] Griffin Caprio. Design Patterns: Dependency Injection. MSDN Magazine,
2005 - San Francisco, CA: CMP Media Inc.
[23] Ralph E. Johnson. Components, frameworks, patterns. ACM SIGSOFT Soft-
ware Engineering Notes archive Volume 22 , Issue 3 (May 1997) table of
contents Pages: 10 - 17 Year of Publication: 1997 ISSN:0163-5948
[24] Microsoft Developer Network (MSDN) Documentation: Thread Stack
Size (Windows). http://msdn.microsoft.com/en-us/library/ms686774%
28VS.85%29.aspx. Hamtad 2010–04–05.
[25] Sun Developer Network: Java HotSpot VM Options. Dokumentation for
kommandoradsparametern XX:ThreadStackSize. http://java.sun.com/
javase/technologies/hotspot/vmoptions.jsp. Hamtad 2010–04–05.
[26] Edsger W. Dijkstra, Leslie Lamport, A.J. Matring, C.S. Scholten, E.F.M.
Steffens: 1978. On-the-fly garbage collection: an exercise in cooperation.
Commun. ACM 21, 11 (Nov. 1978), p. 966–975.
[27] Perry Cheng, Guy E. Blelloch: 2001. A parallel, real-time garbage collector.
In Proceedings of the ACM SIGPLAN 2001 Conference on Programming
Language Design and Implementation (Snowbird, Utah, United States). PL-
DI ’01. ACM, New York, NY, p. 125–136.
[28] David F. Bacon, Perry Cheng, V.T. Rajan: 2003. A real-time garbage col-
lector with low overhead and consistent utilization. In Proceedings of the
30th ACM SIGPLAN-SIGACT Symposium on Principles of Programming
Languages (New Orleans, Louisiana, USA, January 15–17, 2003). POPL ’03.
ACM, New York, NY, p. 285–298.
[29] Filip Pizlo, Antony L. Hosking, Jan Vitek: 2007. Hierarchical real-time
garbage collection. In Proceedings of the 2007 ACM SIGPLAN/SIGBED
Conference on Languages, Compilers, and Tools For Embedded Systems (San
66 REFERENSER
Diego, California, USA, June 13–15, 2007). LCTES ’07. ACM, New York,
NY, p. 123–133.
[30] C. J. Cheney: 1970. A nonrecursive list compacting algorithm. Commun.
ACM 13, 11 (Nov. 1970), p. 677–678. A Nonrecursive List Compacting Al-
gorithm
[31] David A. Barrett, Benjamin G. Zorn: 1993. Using lifetime predictors to im-
prove memory allocation performance. In Proceedings of the ACM SIGPLAN
1993 Conference on Programming Language Design and Implementation (Al-
buquerque, New Mexico, United States, June 21–25, 1993). R. Cartwright,
Ed. PLDI ’93. ACM, New York, NY, p. 187–196.
[32] Joshua Auerbach, David F. Bacon, Florian Bomers, Perry Cheng: 2007.
Real-time Music Synthesis in Java using the Metronome Garbage Collector.
Proceedings of the International Computer Music Conference, (Copenhagen,
Denmark, August 2007).
[33] Fridtjof Siebert: 2000. Eliminating External Fragmentation in a Non-Moving
Garbage Collector for Java. Proceedings of the 2000 international conference
on Compilers, architecture, and synthesis for embedded systems (San Jose,
California, United States, 2000). AMC, New York, NY, p. 9–17
[34] Maoni Stephens: Clearing up some confusion over finalization and other ar-
eas in GC. http://blogs.msdn.com/maoni/archive/2004/11/04/252697.
aspx. Hamtad 2008–12–15.
Bilaga A
Systemoversikt
Systemet bestar av fem olika vyer:
• Huvudvy: Visar ett tredimensionellt piktogram over vagnen och har knap-
par for atkomst till ovriga vyer.
• Forarvy: Visar matare for hastighet, kylvatsketemperatur, varvtal, vaxel,
batterispanning och oljetryck.
• Larmvy: Visar information om larm som uppstatt i systemet.
• Installningsvy: Ger mojlighet till att andra kulturinstallning, samt ger in-
formation om vilken CAN-hardvara som systemet ar kopplat till.
• Manualvy: Visar manualer med instruktioner for hur man felsoker och utfor
service pa fordonet.
67
68 Kapitel A. Systemoversikt
A.1 Huvudvy
Huvudvyn fungerar som ett nav i systemet, med mojlighet att ta sig till alla
ovriga vyer via knapparna i bottenraden. I vyn visas en forenklad 3D-modell
av fordonet, hastighet, bakvagnens forhallande jamte framvagnen och eventuella
larm. Modellen kan roteras genom att klicka och dra pa skarmen. Se figur A.1.
Figur A.1: Huvudvyn med ett larm som gor personalen uppmarksam pa att denbakre luckan ar oppen under korning. Nederst syns navigeringsknapparna.
A.2. Installningsvy 69
A.2 Installningsvy
I installningsvyn kan anvandaren byta kulturinstallning for systemet. Vyn in-
nehaller aven information om vilken CAN-hardvara som anvands. Knappen langst
upp till hoger skickar tillbaka anvandaren till Huvudvyn. Se figur A.2.
Figur A.2: Anvandaren kan snabbt byta kulturinstallning i installningsvyn utanatt starta om systemet.
70 Kapitel A. Systemoversikt
A.3 Manualvy
Manualvyn ger anvandaren snabb atkomst till bandvagnens manual. I manualen
finns instruktioner over hur man utfor service och felsokning. En manualsida kan
innehalla klickbara ord som tar anvandaren till en annan sida. Se figur A.3.
Figur A.3: Manualvyn ger anvandaren tillgang till hjalptexter.
A.4. Forarvy 71
A.4 Forarvy
Forarvyn innehaller en digital instrumentpanel, som kan ersatta vissa av de analo-
ga instrumenten (se figur A.4). En matare nollstalls om en dess givare inte skickar
ett nytt varde innan vardets livstid gar ut (se figur A.6), detta varde ligger i in-
tervallet 200-500 milisekunder. Matarnas utseende och enheter paverkas av vilken
kulturinstallning som systemet har installt (se figur A.5).
Figur A.4: Forarvyn med visare for olika sensorvarden fran motor och vaxellada.
72 Kapitel A. Systemoversikt
Figur A.5: Forarvyn nar kulturinstallningen har andrats till brittiskt. Noteraandringen i skalorna for kylarvatsketemperaturen och hastigheten.
Figur A.6: En matare blir gra och visaren forsvinner nar det inte finns nagotvarde att visa. I detta fall har endast hastighetsmataren ett giltigt varde.
A.5. Larmvy 73
A.5 Larmvy
Larmvyn (se figur A.7) innehaller en lista med aktuella och utgangna larm. I hogra
halvan av skarmen visas en beskrivning av det markerade larmet, samt datum
och tid nar det intraffade. Nar det finns ett aktivt larm i systemet sa kommer
knappen for att ga till huvudvyn att indikera att det finns ett aktivt larm.
Figur A.7: Larmvyn visar tva aktiva larm och ett utganget larm i loggen.
74 Kapitel A. Systemoversikt
A.6 Design av vyer
En vy ar uppbyggd av ett antal kontroller, vilka kan positioneras ut och anpassas
visuellt i Visual Studios designlage (figur A.8). Med hjalp av databindning kan
utvecklaren binda en kontroll till ett signalvarde (figur A.9). Den underliggande
signalhanteringen tar hand om enhetskonvertering och ser till att mataren endast
visar aktuell data. Vid oversattning av vyerna anvands verktyget Sisulizer som
ger oversattaren en lista med textstrangar (se figur A.10).
Figur A.8: Forarvyn oppnad i designlaget.
A.6. Design av vyer 75
Figur A.9: Signalvarden fran fordonet kan bindas till grafiska kontroller via enklamenyer.
Figur A.10: Oversattning av installningsvyn i Sisulizer.
Examensarbete, 20p – informationssystem i BvS10
Område: Mjukvaruutveckling med inriktning mot informationssystem Fördjupning: Användning av C++/CLI i inbäddade system inom stridsfordonsutveckling Avsett för : Två civilingenjörer Uppdragsgivare : BAE Systems Hägglunds AB, avd. SPB Start: Augusti, 2008 Handledare: Erik Essegård, [email protected], tel. 0660-29 24 00 Ansvarig chef: Johan Persson, [email protected]
Bakgrund
Hägglunds utvecklar moderna stridsfordon med krav på avancerade grafiska och interaktiva informationssystem. VIS (Vehicle Information System) är utvecklat inom Hägglunds och används idag bl.a. i Stridsfordon 90. VIS är ett inbäddat system som presenterar enklare statusinformation, t.ex. fordonshastighet och bränslenivå men som även omfattar alarm, manualer, taktiskt stöd och stridsledningssystem. Det kör på ruggade PC med touch-screen under Windows XP Embedded och är utvecklat i C++.
Uppdragsbeskrivning
Hägglunds bandvagn, BvS10 saknar idag informationssystem och uppdraget går ut på att införa grundläggande funktionalitet med modern teknik och användargränssnitt. Speciellt skall VIS för BvS10 hantera driftdata från fordonets motor, Steyr, med avseende på bl.a. oljetryck, varvtal, m.m. Kommunikation med motorn sker över CAN-protokollet J1939 vilket skall implementeras som en del av examensarbetet. För simulering och testning bör även en simuleringsmodell tas fram med hjälp av plattformen SimBas som Hägglunds använder för ändamålet. Protokollet skall utvecklas som en komponent med beroenden enbart till standardiserade API:er och komponenter, t.ex. CAN, C/C++, STL, o.d. Informationen skall presenteras i ett grafiskt användargränssnitt utvecklat i C++/CLI .NET med Microsoft Visual Studio 2008. Diverse kontroller för mätare och liknande bör använda lämpligt komponentbibliotek, exempelvis Dundas Gauge for .NET (www.dundas.com). Applikationen bör utvecklas med lagerbaserad arkitektur omfattande åtminstone kommunikationslager, datalager och presentationslager (GUI). Om möjlighet ges finns möjlighet att gå vidare med logiklager, stöd för loggning, avancerad konfigurering, m.m. Slutligen omfattar arbetet även viss planering av arkitektur och design samt tillhörande dokumentation i form av systemdiagram och gränssnittsspecifikationer.
Uppgifter, sammanfattning
Krav :
- Utveckling av komponent, CAN protokoll J1939 mot Steyr motor (C/C++) - Utveckling av grundläggande VIS för BvS10 (C++/CLI .NET) - Teknisk dokumentation av delar utvecklade i examensarbetet Värdefullt: - Utveckling av simuleringsmodell för Steyr motor (C/C++) - Fördjupning inom lager- och komponentbaserad arkitektur - Fördjupning inom GUI-design och usability - Fortsatt utveckling av VIS BvS10