INGENIØRHØJSKOLEN I ÅRHUS Elektro- og IKT-afdelingen Side 1 af 5 Varighed: 4 timer - fra kl. 9.00 til kl. 13.00 Ingeniørhøjskolen udleverer: 3 omslag samt papir til kladde og renskrift Særlige bemærkninger: Besvarelsen afleveres således, at I3PRG3 (opgave 3), I3DTM3 (opgave 1) og I3ISY1 (opgave 2) afleveres i hvert sit omslag
Side 2 af 5 OPGAVE 1. Givet: 2 stk. SBC686 med IO686-kort monteret. De 2 IO686-korts PPI er har en direkte forbindelse: PortA til PortA, PortB til PortB og PortC til PortC. Den ene SBC686 benævnes: Master, og den anden benævnes: Slave. Slavens skærm skal vise Masterens skærmbillede med opdatering en gang i sekundet. SBC ernes skærmbilleder (textmode) findes i videoram startende fra fysisk adresse: B8000h. Et skærmbillede består af : 25 linier med 80 tegn på hver linie. Hvert tegn fylder 2 byte (tegnkode henholdsvis attribut). PPI ernes portadresser er: PortA = 304h, PortB = 305h, PortC = 306h. Interrupt controllerens OCW2 register har I/O adressen 20h. Alle 3 porte i Masterens PPI er initieret til output i mode 0. Alle 3 porte i Slavens PPI er initieret til input i mode 0. Som en del af løsningen til ovenstående skal følgende skrives i assembly (MASM): På Master SBC686 aktiveres en interruptrutine SendVRAM en gang i sekundet (HW-interrupt IRQ5). Skriv interruptrutinen SendVRAM så følgende funktionalitet opnås: Et helt skærmbillede sendes til PPI en som sammenhørende værdier af offset-adresser i videoram og tilhørende data (tegnkode/attribut). Der skal startes med offset-adresse 0. Data (tegnkode/attribut) sendes ud på PortC. MSByte af offset-adressen sendes ud på PortB. LSByte af offset-adressen sendes ud på PortA. Skrivning til portene skal være i den angivne rækkefølge (PortC PortB PortA). Skriv et program (DOS-EXE) til Slave SBC686. Programmet skal eksekvere i en uendelig sløjfe og udføre følgende: PortA (LSByte af offset-adressen) læses, og når der sker et skift aflæses værdierne fra PortB (MSByte af offset-adressen) og PortC (data = tegnkode/attribut). Den aflæste data skrives i Slavens videoram på den aflæste offset-adresse.
Side 3 af 5 OPGAVE 2. Et RTKernel system består blandt andet af processerne (trådene) control, work1, work2 og alarm, samt et objekt statusobj af klassen Status defineret nedenfor. Systemtidsenheden er konfigureret til 1 msek. class Status Status(); bool alarm(); bool work2action(); Proces control kommunikerer med de øvrige processer via semaforerne controltoalarm, controltowork1 og controltowork2, som alle er tællesemaforer (ST_COUNTING) og virkemåden af proces control kan kort beskrives således: Hovedsløjfen gennemløbes hver gang der er forløbet 2 msek. For hver runde i hovedsløjfen gøres følgende: Hvis der er forløbet 12 msek. siden sidste gang signaleres der til proces work1. Hvis work2action() er true signaleres der til proces work2. Hvis alarm() er true signaleres der til proces alarm. Lav koden til processerne control, work1, work2 og alarm. Processerne kodes i almindeligt RTKernel format, den eneste egentlige "indmad" i work1, work2 og alarm skal være de aktuelle semaforkald, hvorimod control skal kodes komplet. I forbindelse med kan det antages at man har adgang til alle semaforer og til statusobj. Lav de dele af en main proces der opretter og initierer systemet der er omtalt ovenfor, herunder semaforer og processer (tråde). Gør specielt rede for hvorledes du vil prioritere de enkelte processer.
Side 4 af 5 OPGAVE 3. I et system programmeres anvendelsen af instrumenter med anvendelse af de abstrakte basisklasser Instrument, Configuration og Result samt klassen InstrumentList. Instrument beskriver funktionaliteten af et instrument, Configuration beskriver konfigurationen af et instrument og Result beskriver en instrumentaflæsning. InstrumentList anvendes til at gruppere en samling instrumenter. Bemærk, at der skal mere med hvis klasserne skal anvendes til noget seriøst, jævnfør diverse (prik,prik,prik) i teksten. class Configuration virtual ~Configuration()} virtual void print() = 0; // udskriver den aktuelle konfiguration til cout class Result virtual ~Result()} virtual void save() = 0; // gemmer det aktuelle resultat class Instrument virtual ~Instrument()} virtual int ID(); // returnerer den aktuelle instrument ID virtual bool isactive() = 0; // undersøger om det aktuelle instrument er aktivt virtual Result *read() = 0; // aflæser det aktuelle instrument virtual void setconfiguration(configuration *cfgptr) m_cfgptr = cfgptr;} virtual Configuration *getconfiguration() return m_cfgptr;} Configuration *m_cfgptr; Opgave 3 fortsættes næste side
Side 5 af 5 OPGAVE 3, fortsat. class InstrumentList InstrumentList(); ~InstrumentList(); void insert(instrument *instrptr); // indsætter et nyt instrument i listen void remove(instrument *instrptr); // fjerner et instrument fra listen Instrument *first(); // returnerer en pointer til det første instrument // i listen, hvis listen er tom returneres 0 Instrument *next(instrument *instrptr); // returnerer en pointer til det næste instrument // i listen (efter "instrptr"), hvis der ikke er // flere returneres 0 Lav en funktion der undersøger om der findes et instrument med en given ID i en InstrumentList. Prototype: bool checkid(instrumentlist *instrlistptr, int ID); Lav en funktion der for en InstrumentList aflæser alle aktive instrumenter og gemmer resultaterne (med save() ). Prototype: void readallactive(instrumentlist *instrlistptr); c) Lav en funktion der for en InstrumentList fjerner de instrumenter der ikke er aktive. Prototype: void removeallinactive(instrumentlist *instrlistptr); d) Lav en funktion der for en InstrumentList udskriver (til cout) ID og konfiguration for alle aktive instrumenter. Prototype: void printallactive(instrumentlist *instrlistptr);