(Lösningsförslag finns sist i denna fil.)



Relevanta dokument
Tentamen med lösningsförslag

Tentamen med lösningsförslag

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

TDIU01 - Programmering i C++, grundkurs

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Tentamen *:58/ID100V Programmering i C Exempel 3

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Enkla datatyper minne

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Effektpedal för elgitarr

C++ Objektorientering - Klasser. Eric Elfving

Assemblerprogrammering, ARM-Cortex M4 del 3

Tentamen med lösningsförslag

#include <stdio.h> #include <string.h>

Datorprojekt, del 1. Digitala system 15 p

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Maskinorienterad programmering, IT2

Tentamen med lösningsförslag

Funktionens deklaration

TDDC76 - Programmering och Datastrukturer

6 Lågnivåprogrammering

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Tentamen med lösningsförslag

Tentamen med lösningsförslag

Synkronisering - Semaforen. Om att vänta men inte i onödan

Tentamen i. Programmering i språket C

Programmering av grafisk display

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Kontrollskrivning Mikrodatorteknik CDT S2-704

Övning 6. Parallellport, timer

Övning från förra gången: readword

TDIU01 - Programmering i C++, grundkurs

LEU240 Mikrodatorsystem

C++-programmets beståndsdelar

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Programmering av grafisk display

1 Modulär programutveckling.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Summering av fält 1.1. Synkronisering - Semaforen. Summering av fält 1.3. Summering av fält 1.2. Summering av fält 2.3 (INTE GK)

TDIU01 - Programmering i C++, grundkurs

Att använda pekare i. C-kod

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Data, typ, selektion, iteration

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

TDIU01 Programmering i C++

Avancerad SSL-programmering II

Lösningsförslag: Instuderingsfrågor, del D

Inlämningsuppgift 1, Digsim

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

C++ Slumptalsfunktioner + switch-satsen

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Projektlaboration 4, synkronisering av klockan

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Tentamen med lösningsförslag

Tentamen ges för: Tentamensdatum: Tid:

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Assemblerprogrammering - fördjupning

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

SORTERING OCH SÖKNING

Tentamen med lösningsförslag

Programallokering. Programtyper. Att placera program i flashrespektive. Program i FLASH-minne. Program i RAM-minne

Föreläsning 9. struct

Övningsuppgifter. TDIU04 Programmering i C++, standardbibliotek. Innehåll. Vt Lektion Lektion Lektion Lektion 4...

JAVAUTVECKLING LEKTION 8

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Grundkurs Programmering

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

*Pekarvärden *Pekarvariabler & *

Föreläsning 10. Pekare (Pointers)

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Föreläsning 12. struct

tentamensdags och lab 3

TDDC77 Objektorienterad Programmering

IS1500 Lösningar övning CE_O CE_O7. Programmerad in/utmatning. Serieport. Förberedelser till nios2io.

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET;

Arduinokurs. Kurstillfälle 4

Pekare och arrayer. Indexering och avreferering

Tentamen med lösningsförslag

Transkript:

(Lösningsförslag finns sist i denna fil.)

Läser externa signaler. Har 64 ingångar (kanaler), från 0 till 63. Kan bara avläsa en ingång i taget. Avlästa värdet positivt 16-bitars tal. Varje läsning tar normalt högst 2 ms.

kopplas till datorn via ett dataregister och ett styrregister. Båda är 16-bitar 270002 oktala adresserna Channel number 270000 resp. Error 270002. 270000 Dataregistret innehåller det avlästa värdet. Styrregistret initiera avläsningar och kontrollera signalenhetens tillstånd. Måste skriva alla 16-bitarna på en gång. b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Interrupt Enable Done Start b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0

270002 b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Error Channel number Interrupt Enable Done Start 270000 b 15 b 14 b 13 b 12 b 11 b 10 b 9 b 8 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 Bit Namn Användning 0 start Skriv 1, startar läsning 6 Interrupt Enable Skriv 1, Avbrott när läsning klar. 7 Done Skall sättas till 0 före avläsning. Blir 1 när läsning klar. 8-13 Channel # Anger vilken av 64 ingångar som ska läsas. 15 Error Blir 1 om avläsningen misslyckades.

Skriv en modul en.h fil och en.c fil två C-funktioner, sig_read, som initierar avläsning och sig_get_value som ger det avlästa värdet som resultat. Också definitioner (i en separat fil.) av typer och portar som behövs. sig_read parameter: numret på den ingång som skall avläsas, i intervallet 0 till 63. Om ett felaktigt värde ges skall ingen avläsning initieras och man ska komma ihåg att det senaste anropet var felaktigt. Resultattypen skall vara void. sig_get_value skall ge -9 om senaste anropet av sig_read var felaktigt eller om avläsningen misslyckades. -1 om avläsningen ännu inte är klar och Definieras som makron med namnen BUSY resp. ERROR i headerfilen (.h).

Skriv en modul Bra filnamn? sig_get_value Lämplig Resultattyp? Antag HC12 konventioner (dvs int är 16 bit)

Program med två separata processer en datainsamlare och en användare. T.ex. tänka dig att programmet ingår som en del i ett större program som kontrollerar ett flygplan. Ick! Helst inte! Datainsamlaren samlar kontinuerligt in uppgifter från olika mätpunkter Användarprocessen använder dessa uppgifter för att styra olika reglage.

Med jämna tidsintervall utföra datainsamlingar. 50 ms fördröjning mellan datainsamling. Läsa in data från 16 mätpunkter kanalerna 0 till 15 signalenhet som beskrevs i deluppgift a. Medan en datainsamling pågår måste signalenheten skyddas Använd semafor. De 16 inlästa värdena skall sparas lokalt i processen medan en datainsamling pågår. Måste ha 2 ms fördröjning vid avläsningen av varje kanal. (Se deluppgift a.) Vid fel / inte färdig: spara värdet 0.

När datainsamling avslutad kopiera de inlästa värdena till en global variabel input_data ett fält bestående av 16 komponenter av typen unsigned int. fältet måste skyddas så att ingen annan process kan avläsa eller ändra fältet samtidigt. Ytterligare en semafor.

Ungefär 10 gånger per sekund Kopiera fältet input_data till en lokal variabel och sedan Anropa en extern funktion control som får den lokala kopian som parameter. Under kopieringen skall förstås fältet input_data skyddas så att ingen annan process kommer åt det samtidigt. Antag att funktionen control är färdigskriven. Du skall alltså inte själv skriva denna.

// Filen process.h #ifndef PROCESS_H #define PROCESS_H #define DEFAULT_STACK_SIZE 128 #define MINIMUM_PRIORITY 1 #define DEFAULT_PRIORITY MINIMUM_PRIORITY+9 typedef struct process_struct process; // definieras i filen process.c typedef struct semaphore_struct semaphore; // definieras i filen process.c typedef void (*function)(void); extern void init_processes(void); extern process *create_process(function f, int prio, int stack_size); extern void start_process(process *); extern process *running_process(void); extern int get_process_id(process *); extern unsigned long int get_time(void); // resultat ges i ms extern void delay_process(process *p, long int t); // t ges i ms extern int get_process_priority(process *); extern void set_process_priority(process *p, int prio); extern void terminate_process(process *p); extern int terminated(process *p); extern semaphore *create_semaphore(int init_value); extern void signal(semaphore *); extern void wait(semaphore *); // macron för förenklade funktionsanrop (i brist på överlagrade funktioner) #define new_process(f) create_process((f), DEFAULT_PRIORITY, DEFAULT_STACK_SIZE) #define get_id() get_process_id(running_process()) #define delay(t) delay_process(running_process(), (t)) #define get_priority() get_process_priority(running_process()) #define set_priority(i) set_process_priority(running_process(), (i)); #define terminate() terminate_process(running_process()) #endif

Lösningsförslag, deluppgift a // Filen sig.h typedef unsigned short int port; typedef unsigned short int *portptr; #define SIGDATA_ADR 0270000 #define SIGCTRL_ADR 0270002 #define SIGDATA *((portptr) SIGDATA_ADR) #define SIGCTRL *((portptr) SIGCTRL_ADR) #define start 0x0001 #define int_enable 0x0040 #define done 0x0080 #define channel 0x3f00 #define error 0x8000 // Filen sig_reader.h #define BUSY -1 #define ERROR -9 extern void sig_read(int channel); extern int sig_get_value(void);

// Filen sig_reader.c #include "sig_reader.h" #include "sig.h static int illegal_argument = 0; void sig_read(int chan) { port shadow = 0; if (chan >= 0 && chan <= 63) { illegal_argument = 0; shadow = start; shadow = chan << 8; SIGCTRL = shadow; else illegal_argument = 1; int sig_get_value(void) { if (illegal_argument SIGCTRL & error) return ERROR; else if (SIGCTRL & done) return SIGDATA; else return BUSY;

Lösningsförslag, deluppgift b #include "process.h" #include "sig_reader.h" #define N 16 static semaphore *sig_sem; static semaphore *data_sem; static unsigned int input_data[n]; void collector(void) { unsigned int a[n]; while(1) { int value, i; wait(sig_sem); for (i=0; i<n; i++) { sig_read(i); delay(2); value = sig_get_value(); if (value == ERROR value == BUSY) value = 0; a[i] = value; signal(sig_sem); wait(data_sem); for (i=0; i<n; i++) input_data[i] = a[i]; signal(data_sem); delay(50);

extern void control(int a[]); void user(void) { unsigned int input_copy[n]; int i; while(1) { wait(data_sem); for (i=0; i<n; i++) input_copy[i] = input_data[i]; signal(data_sem); control(input_copy); delay(100); main() { process *p1, *p2; init_processes(); sig_sem = create_semaphore(1); data_sem = create_semaphore(1); p1 = new_process(collector), p2 = new_process(user); start_process(p1); start_process(p2); set_priority(default_priority-1); return 0;