Typsäker registeraccess

Storlek: px
Starta visningen från sidan:

Download "Typsäker registeraccess"

Transkript

1 Typsäker registeraccess Mikael Rosbacke January 6, 2011 Detta dokument ska diskutera ett ramverk för läsning och skrivning av hårdvaruregister. Det är inspirerat av en artikel på CUJ expert panel och har byggts vidare på. 1 Inledning Dags att skriva den där devicedrivern? Börjar bläddra lite i databladet för kretsen och kommer till sidorna som beskriver registren. rad upp och rad ner med kryptiska förkortningar. Vissa 8 bitar andra 16 och en och annan 32 bitars pekare. Här och där statusregisten där enskilda bitar ska sättas och läsas. Vissa reagerar bara man skriver oavsett innehåll. Matt redan? Hur bringa ordning i denna röra utan att behöva göra en utredning varje gång hårdvaran ska röras? För att göra det hela konkret kommer jag använda den gamla datorn Amiga som exempel. Den innehåller lite olika hårdvaruehenheter och presenterar en del av de egenheter man kan råka ut för. Vi börjar med en 8520 CIA (complex interface adapter). En krets som har 16 GPIO pinnar, ett serieregister, två timers, en time of day klocka och lite allmän interruptlogik. Amigan har två stycken (A och B) så om vi tittar på A så har den 16 stycken 8 bitars register enligt nedan: CIAA Address Map Byte Register Data bits Address Name BFE001 pra /FIR1 /FIR0 /RDY /TK0 /WPRO /CHNG /LED OVL BFE101 prb Parallel port BFE201 ddra Direction for port A (BFE001);1 output (set to 0x03) BFE301 ddrb Direction for port B (BFE101);1 output (can be in/out) BFE401 talo CIAA timer A low byte ( Mhz NTSC; Mhz PAL) BFE501 tahi CIAA timer A high byte BFE601 tblo CIAA timer B low byte ( Mhz NTSC; Mhz PAL) BFE701 tbhi CIAA timer B high byte BFE801 todlo 50/60 Hz event counter bits 7-0 (VSync or line tick) BFE901 todmid 50/60 Hz event counter bits

2 BFEA01 todhi 50/60 Hz event counter bits BFEB01 not used BFEC01 sdr CIAA serial data register (connected to keyboard) BFED01 icr CIAA interrupt control register BFEE01 cra CIAA control register A BFEF01 crb CIAA control register B Note: CIAA can generate interrupt INT2. Hur ska nu detta användas? säg att vi vill sätta parallellporten till bara höga utsignaler så du skulle följande kunna funka: *(volatile unsigned char *)bfe301 = 0xff; // Alla utgångar *(volatile unsigned char *)bfe101 = 0xff; // Sätt dom höga. Den som nu använder den här metoden är det givevis skottpengar på. Ett sämre sätt att hantera hårdvara ur underhållsynpunkt är svårt att tänka sig. Dock visar det på vilka mekanismer vi måste uppnå. Vi måste casta en konstant adress till rätt typ. I vårt fall är det 8 bitars register så unsigned char är lämplig. Vi måste ange volatile för att visa kompilatorn att skrivning och läsning har sidoeekter. Annars kan kompilatorn lätt optimera bort operationen. Vi måste någonstans använda numeriska adresser. Symboliska namn hade varit bättre men det är inte helt självklart hur de ska anges (Vi har t. ex. era CIA kretsar). En vanlig lösning är våra gamla hederliga macros. #define CIAA_PRB (volatile unsigned char *) bfe101 #define CIAA_DDRB (volatile unsigned char *) bfe301 //... *CIAA_DDRB = 0xff; *CIAA_PRB = 0xff; Det funkar. Det är betydligt bättre än tidigare men kan vi göra bättre? Några saker att lägga märke till. Se strukturen på namnet CIAA_DDRB. Vore inte ciaa::ddrb mer naturlig syntax att använda i C++? För att inte tala om användningen av gemener snarare än VERSALER? Olika register har olika egenskaper. Vissa kan bara läsas, andra skrivas, några ska strobas. Det är en typ av typinformation som inte kompilatorn känner till. Inget problem här att skriva till ett 'read only' register. Vid denitionen av namnen blir det rätt så mycket upprepningar. Varken roligt eller speciellt underhållsvänligt. Speciellt volatile kan man missa utan att kompilatorn klagar. 2

3 När sedan olika bitar inom register ska namnges blir det riktigt intressant. Biten ska sättas, är det då bitmasken eller bitnumret som namnet härrör till? Kompilatorn kommer inte klaga så det blir debuggern som får hitta svaret. Kan vi ge olika typer till dessa så kompilatorn stoppar oss _innan_ koden börjar exekvera? 2 Grundideer Vad gör att C++ skulle göra ett bättre jobb än C att hantera detta? Trots allt, C jobbar nära hårdvaran och vi vet i alla fall att inget onödigt sker. Det gör förvisso assembler också men vi undviker att använda det trots allt. Dagens kompilatorer med optimering klarar för det mesta av att skala bort onödigt bagage i koden. Användning av templates och små inline funktioner kommer resultera motsvarande kod som en C implementation skulle ge. I slutet kommer genererad kod visas som backar upp påståendet. Funktioner I C++ tar funktionssignaturen hänsyn till typen på argumenten så vi kan utnyttja det för att välja rätt funktion givet en viss typ. De generella funktionerna read och write överlagras för läsning och skrivning. Om man ogillar namnet p.g.a. krocken med läsning och skrivning av l så kan kanske den gamla datorn C64 inspirera oss med sina peek och poke. Notationen med :: Notationen med :: är rätt så lätt att uppnå om vi kapslar in namnen i en klass, struct eller en namnrymd. I vårt fall fungerar en struct bra. Nu undrar kanske vän av ordning, varför inte bara deklarera ett antal medlemsvariabler och accessa dessa med -> operatorn? T. ex. struct CIA { unsigned char pra; unsigned char prb;... ; volatile CIA* ciaa=reinterpret_cast<volatile CIA*>(bfe001); ciaa->pra = 0xff;... Finns bara ett problem. Standarden garanterar inte att medlemmar följer direkt på varandra utan kan stoppa in 'padding bytes' efter eget bevåg. Dessutom fungerar det inte speciellt bra i vårt fall där adresserna stegas upp med 0x100 per register. Användning av enum Vi kommer att använda enum för att ange adresser. Utan att dra ut alltför mycket på det: typedef unsigned char u8; 3

4 struct ciaa { enum reg8 { pra = 0, // GPIO port A prb, // GPIO port B ddra, // GPIO DDR port A ddrb, // PGIO DDR port B talo, // Timer A low byte tahi, // Timer A high byte tblo, // Timer B low byte tbhi, // Timer B high byte todlo, // Time of Day low byte. todmid, // Time of day mid byte. todhi, // Time of day high byte (10) res0, // Reserved dr, // Serial data register icr, // Interrupt control register cra, // Control register A crb // Control register B ; static const unsigned int base = 0xBFE001; ; Koden talar för sig själv. Tyärr är den inte speciellt användbar utan lite hjälpfunktioner: inline volatile u8 * regaddress(ciaa::reg8 reg) { return reinterpret_cast<volatile u8*>(ciaa::base + reg * 0x100); inline u8 read(ciaa::reg8 reg) { return *regadress(reg); inline void write(ciaa::reg8 reg, u8 value) { *regaddress(reg)=value; Koden ser i alla fall mer modern ut med mindre versaler. Har vi vunnit något annat? I regadress tar vi hand om osetökningen av 0x100 per register. Tittar vi på användningen av detta write(ciaa::tblo, TIMERVAL & 0xff); write(ciaa::tbhi, (TIMERVAL >> 8)& 0xff); write(ciaa::crb, 0x11); Så blir det rätt så rent. 4

5 Typer av register Typen vi anger i funktionerna är ciaa::reg8. D.v.s. har vi era enum angivna i structen så genererar de olika distinkta typer och vi behöver olika read och write funktioner. Detta är en feature! Antag att vi har några 16 bitar register och lägger in dem i en egen enum: typedef unsigned short u16; struct enum reg8 { // som förut. enum reg16 { u16reg1 = 16, u16reg2 ; inline volatile u16 * regaddress(ciaa::reg16 reg) { return reinterpret_cast<volatile u16*>(ciaa::base + reg * 0x100); inline u16 read(ciaa::reg16 reg) { return *regadress(reg); inline void write(ciaa::reg16 reg, u16 value) { *regaddress(reg)=value; På motsvarande sätt kan man för varje kategori av register med liknande egenskaper skapa en egen enum. T. ex. har vi 'read only' register behöver vi enbart deniera read funktionen och får kompileringsfel om write används. Eller varför inte vara lite uppnningsrika. notera talo, tahi, tblo och tbhi. Dessa är egentligen 16 bitars register uppdelade på 8-bitars delar. Deniera en ny enum med registren ta och tb skriv read och write funktioner som tar hand om 8 bitars skrivningen. Generellt, alla förenklingar som görs en gång på denna nivå och som sparar oss från att göra dem era gånger i användarkod är värda att undersöka. logiska operatorer Utöver rena skrivningar kan logiska operatorer vara trevliga följande kan även läggas till: inline void and_reg(ciaa::reg8 reg, u8 value) { *regaddress(reg) &= value; inline void or_reg(ciaa::reg8 reg, u8 value) { *regaddress(reg) = value; 5

6 inline void xor_reg(ciaa::reg8 reg, u8 value) { *regaddress(reg) ^= value; Känner man sig komfortabel så kan även (alternativt enbart) motsvarande operatorer överlagras. Templates Efter ett par olika enums börjar man tröttna på att upprepa olika funktioner med ungefär samma innehåll. Templates är designade att ta hand om precis denna situation. Säg att vi vill göra en template-version av regadress. Innan vi kodar bör vi fundera på eventuella template argument till en generell sådan. En uppenbar är typen av register (ciaa::reg8) så den ska med. Nästa är typen på returvärdet (u8). Den är inte helt uppenbar. Vi kanske vill koppla registertyp till returtyp i andra sammanhang och har en mer generell lösning med t. ex. traits implementerad. I detta fall kan returtyp härledas från registertypen. Men i generella fallet så ska det nog vara en egen parameter. Ska volatile vara del av template parametern eller ska den anges explicit i koden? Om den är del av parametern kan vi skapa funktioner utan volatile med tillhörande misstag. Ligger den i funktionen har vi ingen möjlighet att plocka bort en onödig. Kostnaden är missade optimeringsmöjligheter för kompilatorn men det bör vara ett billigt pris för de få aktuella fallen. Den skrivs i funktionen. Sist är namnet på strukturen för att få tag i basadressen också. Så nästa försök för regadress: template<typename Device, typename RegType, typename Type> volatile Type * regaddress(regtype reg) { return reinterpret_cast<volatile Type*>(Device::base + reg); En generell implementation för de esta situationer. Men i vårt fall behövs en liten annan implementation template<> volatile u8 * regaddress<ciaa, ciaa::reg8, u8>(ciaa::reg8 reg) { return reinterpret_cast<volatile u8*>(ciaa::base + reg * 0x100); Med andra ord för de esta enheter bör den generella fungera men vi har möjlighet att skapa specialiceringar vid behov. 6

7 Läsning och skrivning Ska vi även skapa templates för read och write? Det är en möjlighet men det är inte säkert den bästa lösningen. Anledningen till att vi har olika enums är att kunna kontrollera vilka operationer vi kan utföra på dem. Med en generell template försvinner den möjligheten. Finns också en till anledning att föredra vanliga funktioner. Vid fel blir felmedelanden lättare att tolka. Samtidigt har vi problemet med upprepad kod. Vi löser det här med användning av, ve och fasa, ett par macros enligt nedan #define HW_REG_RO(dev, type, rtype) \ inline type read(dev::rtype reg) \ { \ return *regaddress<dev, type, dev::rtype>(reg); \ #define HW_REG_WO(dev, type, rtype) \ inline void write(dev::rtype reg, type value) \ { \ *regaddress<dev, type, dev::rtype>(reg)=value; \ #define HW_REG_ANDEQ(dev, type, rtype) \ inline void operator&=(dev::rtype reg, type value) \ { \ *regaddress<dev, type, dev::rtype>(reg)&=value; \ #define HW_REG_OREQ(dev, type, rtype) \ inline void operator =(dev::rtype reg, type value) \ { \ *regaddress<dev, type, dev::rtype>(reg) =value; \ #define HW_REG_RW(dev, type, rtype) \ HW_REG_RO(dev, type, rtype) \ HW_REG_WO(dev, type, rtype) \ HW_REG_ANDEQ(dev, type, rtype) \ HW_REG_OREQ(dev, type, rtype) Notera här att både and och or varianterna kräver både läsning och skrivning. Dessa kan bara användas när båda nns. Så med de nya generella funktionerna på plats kan vi ersätta våra tidigare funktioner med struct ciaa { enum reg8 { pra = 0, // GPIO port A //... som förut. static const unsigned int base = 0xBFE001; ; 7

8 template<> inline volatile u8 * regaddress<ciaa, u8, ciaa::reg8>(ciaa::reg8 reg) { return reinterpret_cast<volatile u8*>(ciaa::base + reg * 0x100); HW_REG_RW(ciaa, u8, reg8) Har vi nu era kategorier behöver vi bara lägga till de olika makron som svarar mot den funktion vi vill tillåta för motsvarande enum. Använder vi dem sedan på ett felaktigt sätt så får vi kompileringsfel. Tack vare templatevarianter av regaddress behöver vi aldrig komma ihåg t. ex. volatile om vi inte behöver en specialisering. Där försvann en hel klass med potentiella fel. Totalt sett en betydligt renare lösning än gamla C idiomen. 3 Bitaccess Nästa steg att undersöka är bitaccess. Tittar vi t. ex. på registret icr så har varje enskild bit en egen betydelse. Vem har inte utfört motsvarigheten till följande: u8 t=read(ciaa::icr); t = 0x80; write(ciaa::icr, t); Kan se slösaktigt ut med tre rader men en läsning, en logisk operation och en skrivning är precis det som behövs så efter optimering ger detta optimal kod. Återigen vore det trevligt med symboliska namn. En ny enum ger en ny typ så då har vi frihet att välja funktionalitet efter det. Exempel på hur bitar för icr kan representeras enum reg8_bits { // For register icr, ta = 0, // Timer A tb = 1, // Timer B alrm = 2, // Time of day alarm sp = 3, // Serial port flg = 4, // Flag interrupt from external port. ir = 7 // (Read only) interrupt request. ; Här använder vi bitpositioner för att ange bitar. Vad har vi nu att ta hänsyn till och vad vill vi kunna göra med dessa bitar? Ibland används bitposition, ibland vill man utnyttja bitmasken. Vi behöver ett bra sätt att använda båda med full typsäkerhet från kompilatorn. Dessa bitar är knutna till ett enskilt register. Ska vi binda dem till detta eller nöjer vi oss med att knyta dem till en grupp med register? 8

9 Ibland används speciella metoder för access till bitar. Vill vi kapsla in dessa och presentera ett normalt gränsnitt utåt? Knytning till register Ska bitsymboler vara knutna till enskilda register eller till en device? Frågan är inte lätt och är beroende av situationen. Huvudanledningen att välja att knyta bitar till enheten är bekvämlighet. För varje ny typ vi inför så måste vi deniera accessfunktioner. Väljer vi att knyta bitarna till registren och det är många register med bitdenitioner blir det mycket funktioner att deniera. Är dessa dessutom liknande blir det repetetivt och lätt att göra fel. Inte direkt det vi vill uppnå. Fördelen med knytning till registren är dels bättre kontroll. Dessutom kan man undvika namnkrockar. Har vi olika bitar i olika register med samma namn blir det problem om vi inte kapslar in dem på något sätt. Så denna funktionalitet behövs också. Vid inkapsling på registernivå så är notationen ciaa::icr::ta en naturlig notation med enhet::register::bit. Sättet att representera namndelen blir återigen som en struct. Tyvärr blir det namnkrock då registret (icr) ska förekomma på två ställen. Dels som enum för registret, dels som struct för bitarna. Försök att plocka bort enumvärdet och hantera hela registeracessen inom structen blir inte helt bra. Den korta versionen är att man då får skriva write(ciaa::icr(), data); Paranteserna är för att konstruera ett temporärt objekt vid funktionsanropet. Försök att göra icr som statisk innebär att den ska denieras någonstans. Inte lätt att få in i en.h l. Alternativet som används här är att att leva med två namn. Registret icr står kvar som enum och structen får namnet icr_bit. Så då kan man tänka sig följande i användarkod: write(ciaa::icr_bit::ta, 1); int i=read(ciaa::icr_bit::ta); Detta blir tydligt i användarkoden och vi har kvar möjligheten att hantera registret som helhet. Här kan man tänka sig att använda bool som typ. Det är dock inte helt rätt då true och false är logiska utsagor från propositioner medan en bit är en numerisk typ med en rätt så begränsad domän av två värden. Lite mer praktiskt så ska senare ett bitfält denieras med typen int. Det är bra om de har samma typ för att lagra data. Väljer man att lägga bitarna på devicenivå räcker det med att utelämna en interna strukturen och deniera enum för bitarna direkt i den yttre. Bitnummer eller bitmask Vanligtvis när man läser datablad eller diskuterar bitar så är det bitnummer som används. Trots det, när väl koden ska skrivas så behövs bitmasken för att sätta eller maska bort bitar ifrån register. Med gamla #dene baserade metoder så ser inte kompilatorn skillnad på dessa och försöker gladeligen maska bort en bit m.h.a. bitnumret. 9

10 Tyvärr kommer vi inte ifrån detta så länge som vi använder vanliga typedefs för u8, etc. En enum såväl som char, short e.t.c. är inbyggda integertyper och kompilatorn omvandlar fritt mellan dessa. För en säkrare lösning krävs att u8 blir en fullvärdig klass. Det blir en överkurs för en annan gång. Här är bitarna specierade med bitnummer. En automatisk funktion för att konvertera dessa till bitmasker behövs. Konverteringen ska även ändra typen från bittypen till den bitbredd som registret använder. Fortsätter vi vårt exempel med icr så: u8 mask_from_bit(ciaa::icr_bit::bits bt) { return static_cast<u8>(1 << bt); När man nu vill speca alla bitar i ett register (Vid initialiseringen t. ex.) Kan vi göra följande: write(ciaa::icr, mask_from_bit(ciaa::icr_bit::ta) mask_from_bit(ciaa::icr_bit::tb) //... ); Det är rätt så tydligt. Inte lika säkert som med bitnamnet direkt i write funktionen men det får vi leva med. Vill helst att följande skulle ge kompileringsfel men det sker inte så länge kompilatorn fritt kan konvertera mellan u8 och olika enums. // Vore bra om detta inte fugerade utan gav kompileringsfel. write(ciaa::icr, ciaa::icr_bit::ta ciaa::icr_bit::tb) //... ); Det man kan klaga på är att mask_from_bit känns lite långt. Lite onödigt långt... Går det att förbättra? En lämplig operatoröverlagring borde göra susen. Vi har ett argument in och ett ut så en unär operator. Vilken ska vi ta? Det nns ett antal aritmetiska och logiska men dem bör vi undvika. Man kan räkna normalt med maskerna och att överlagra dessa är att be om förvirring. Bättre med något som är helt onaturligt i sammanhanget så att det syns att överlagring har skett. Kan man sedan hitta en vettig liknelse för att motivera valet så borde vi vara hemma. Pekare används även som s.k. handle för objekt. Man skickar runt pekaren för att sedan komma åt objektet den pekar på. Kan man betrakta bitnumret 10

11 som ett handle för bitmasken? Helt galet är det inte och i dessa operationer nns inte en pekare i sikte så ingen borde kunna missta det för en avreferering utan att reagera. Så operator* är vår kandidat. Observera att operator& ska inte användas. Allmännt avråds det ifrån att överlagra unära operator& om man inte vet exakt vilka konsekvenserna blir. Så här blir koden: u8 operator*(ciaa::icr_bit::bits bt) { return static_cast<u8>(1 << bt); //... write(ciaa::icr, *ciaa::icr_bit::ta *ciaa::icr_bit::tb //... ); u8 t=0; t = *ciaa::icr_bit::sp *ciaa::icr_bit::flg; reg_or(ciaa::icr, t); Med andra ord kan vi nu räkna med bitar ungerfär som på samma sätt som vi är vana vid. Dessutom har operator* högre proritet än både operator+ och operator. Jämför med t. ex. (1 << bit1 + 1 << bit4) som har annat resultat än (1 << bit1 1 << bit4). Med vår lösning är (*bit1 + *bit4) samt (*bit1 *bit4) identiskt och det resultat vi vill ha. Jag har själv blivit biten av denna bugg ett antal gånger. Hur ser vår skrivning ut (notera att detta tar inte hänsyn till icr:s speciella skrivvariant): void write(ciaa::icr_bit::bits bit, int val) { u8 t=read(ciaa::icr); if (val) t = *bit; else t &= ~*bit; write(ciaa::icr, t); Speciell behandling av bitar Tittar vi närmare på icr registret så ser vi att vid skrivning av detta anger de olika bitarna inte vad som ska stå utan en 1 säger att biten ska skrivas. Värdet som ska skrivas nns i bit 7. Vill vi sätta bit 2 och 6 ska vi skriva 0xc4 till registret. Observera att ingen läsning behövs för att lämna övriga orörda. Denna typ av specalbehandling vore trevligt att kunna automatbehandla. T ex. följande rutin: void write(ciaa::icr_bit::bits bit, int val) { u8 t= *bit (val? 0x80 : 0); 11

12 write(ciaa::icr, t); Fördelen är att nu slipper man tänka på hur bitarna ska accessas varje gång man accessar dem. Att skriva en bit ser likadant ut oavsett hur hårdvaran vill bli accessad. 4 Bitfält Inte alltid är det bara en bit av ett register som ska delhanteras. Vanligt är att begränsade sekvenser av bitar (bitfält) skapar små oberoende delar av registret. Vi har inget i vårt nuvarande exempel så antag följade ktiva enhet. Den har ett 8-bitars register med två 4-bitars nibble i sig: struct dummydev { enum reg_8 { reg1, reg2 ; struct reg1_rng { enum ranges { lownibble = MAKE_RANGE(0, 4), highnibble = MAKE_RANGE(4, 4) ; ; ; Vi använder samma struktur som som för bitaccess. Det stora frågetecknet är kring MAKE_RANGE. Denna är denierad enligt följande: #define MAKE_RANGE(low_bit, size) ((low_bit) (size) << 8) Vi kodar alltså in startbiten och bredden på bitfältet som övre och undre byte i enumkonstanten. På samma sätt som för bitar så använder vi operator* för att ta fram masken för ett bitfält. u8 operator*(dummydev::reg1rng::ranges range) { const int size = (range >> 8) & 0xff; return static_cast<u8>(((1 << size)-1) << (range & 0xff)); D.v.s *lownibble returnerar 0x0f. Nästa fråga gäller hantering av värden. Vill vi skriva något till highnibble så vill vi använda värden i områden Men innan skrivning måste de skiftas 4 bitar till vänster och detta sker konsekvent. Vi har återigen ett problem med två olika typer av data, Dels hantering av värden som vanliga tal. Dels värden formaterade för registeraccess. 12

13 Hantering av bitfältsvärden Nu börjar vi nå gränsen för långt vi kan pressa kompilatorn utan att syntaxen börjar bli jobbig att hantera. Våra vanliga tal hanteras som int och registeraccessen använder u8 vilket är unsigned char via typedef. Kompilatorn kommer inte att klaga om vi mixar dessa. Varför ck vi inte detta problem med bitarna? Vi sätter värden även där. Anledningen är att med enskilda bitar har vi bara två tillstånd, 0 och 1. Då kan närvaro och frånvaro av biten räcka som indikering av biten. Ska vi sätta en bit använder vi bitnamnet, annars låter vi bli så värdet vi sätter är implicit och dyker aldrig upp som fristående värden med tillhörande typ. Med bitfält har vi er möjliga värden och värdet måste hanteras explicit och det värdet kommer att ha en typ som vi har valt till int. Man kan tänka sig att låta u8 med era vara fullständiga klasser så vi har kontroll över deras access. Dock får det bli en utvidgning för framtiden. För stunden får vi leva med potentiell konikt. Den är i alla fall inte värre än vad vi kom ifrån med #dene baserade C idiom. Vi behöver konverteringsfunktioner mellan registervärden och vanliga värden. Här kommer vi använda den vanliga konventionen att bitar utanför bitfältet sätts till noll. Se följande funktioner: inline u8 reg_from_val(dummydev::reg1rng::ranges range, int v) { const int size = (range >> 8) & 0xff; return static_cast<u8> ((((1 << size)-1) & v) << (range & 0xff)); inline int val_from_reg(dummydev::reg1rng::ranges range, u8 v) { return (v & *range) >> (range & 0xff); Att använda from istället för det mer vanliga to i namnen har fördelen att typen på returvärdet stämmer med första ordet i funktionsnamnet och andra ordet med typen i argumentet. T. ex. val_from_reg har val först och vanligt värde som returvärde. Den har reg som andra del och typen för reg nns i argumentet. Det blir lätt att se vilken typ av data som funktionen tar emot och returnerar genom att se på funktionsnamnet. Kan vi göra någon form av operatoröverlagring? Tveksamt. Vi har två argument så det skulle vara en binär operator. Tyvärr har vi två olika typer in (range, int) och en tredje (u8) ut och det nns ingen användbar operator som uppför sig så i C++. Närmast är operator.* men den är synnerligen speciell. Vi får leva med namnen. Exempel på användning: write(dummydev::reg1_rng::lownibble, 9); write(dummydev::reg1_rng::highnibble, 7); // Annan variant. write(dummydev::reg1, 13

14 reg_from_val(dummydev::reg1::lownibble, 9) reg_from_val(dummydev::reg1::highnibble, 7)); Allmänt kan sägas att formen med direkt användning av bitfältswrite är säkrare än att explicit försöka räkna ut ett värde och sedan skriva dessa till register. Med bitfältswrite riskerar vi inte sammanblandning av typer p.g.a. att kopilatorn konverterar olika integers till varandra. 4.1 Idé om full klassstatus till olika registertyper En variant om man vill ha full klassstatus på t. ex. u8 så borde följande fungera class u8 { unsigned char data_; public: explicit u8(unsigned char d) : data_(d) {; operator unsigned char() { return data_; // copy constructor, operator=... ; Vårt problem är att när kompilatorn förväntar sig en int eller unsigned char så tillåter den både enum int eller unsigned char för den delen och utför implicit konvertering. Däremot när den förväntar en enum så är det enbart medlemmar av denna enum som tillåts. Med vår operator* går vi över till en primitiv typ och när sedan registret skrivs ska funktionen ha en unsigned char vilket kompiltatorn accepterar både bitmask (u8) och bitnummer (enum). Med ovanstående denition av u8 blir den en full typ. Vi har gjort konstruktorn explicit så att kompilatorn inte kan använda den direkt. Nackdelen är att varje gång man ska skriva ett värde måste u8 anges explicit, t. ex: write(ciaa::pra, u8(0xff)); Tycker man att det är ett billigt eller dyrt pris att betala är en smaksak. 5 Felsökning Tack vare våra olika funktioner har vi nu ett antal platser att haka in oss för felsökning. Kan man under utveckling tillåta lite extra kod så kan assert() komma väl till pass. Speciellt funktionerna för bit och bitfält nns det möjlighet till detta. T. ex. ingående värde till ett bitfält ska aldrig vara större än vad som får plats i fältet. MAKE_RANGE ska inte generera bitar bortom sista registerbiten heller. Dessa tester kan stoppas in under utveckling för att sedan tas bort mot slutet när timing börjar bli viktigt. 14

15 Väljer man implementation av class u8, så kan man låta konstruktorn ta en int som argument. Sedan sätta in en assert(in>=0 && in <256) i funktionskroppen. Då märks det direkt när man av någon anledning försöker skriva för stora eller negativa värden. T.ex. att man tror att det är ett 16 bitar register eller i ett svagt ögonblick tror att 256 får plats i 8 bitar (sånt händer). 6 Sammanfattning I har nu tittat på ett antal sätt att försöka förbättra kompilatorns möjlighet att kontrollera accesser till hårdvaruregister i C++. Beroende på hur mycket man väljer att implementera kan textmassan i programmet öka den del, men med optimering bör inte run-time lida speciellt mycket. Fördelarna är att man tar bort felklasser som är lätta att införa men kan vara extremt svåra att hitta. En utelämnad volatile kan, beroende på kompilatoroptimering, ge era accesser eller ta bort access till register. Den kan även ge aliasing in i närliggande register. Nackdelar med metoden kan vara att man inför C++ konstruktioner som mindre vana C++ programmerare kanske inte är bekväma med. Det är en bedömningsfråga från fall till fall om man tycker det är värt det. Ofta när man ska utveckla mot en microkontroller följer det med färdiga headerler med registerdenitioner. I detta fall är det här ett dubbelt arbete. Men för de fall man inte kan använda dessa headerler av någon anledning kan ovanstående vara av nytta. Ävan fall där gemensam kod ska fungera i olika utvecklingsmiljöer kan ovanstående utnyttjas som ett lager mellan hårdvaran och övrig kod. 15

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT 2013 1 / 26

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT 2013 1 / 26 Programmering i C++ EDA623 Mer om klasser EDA623 (Föreläsning 6) HT 2013 1 / 26 Mer om klasser Innehåll Konstanta objekt Statiska medlemmar Pekaren this Vänner (friends) Överlagring av operatorer EDA623

Läs mer

Enkla datatyper minne

Enkla datatyper minne Enkla datatyper minne 143.56 sant Sonja A falskt 18 1999-10-29 Bertil Gralvik, KTH Ingenjörsskolan 1 Addera två tal Algoritmen Summera tal Mata in två tal Beräkna Skriv ut resultat Mata in tal 1 Mata in

Läs mer

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder Introduktion TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder OO är den mest använda programmeringsparadigmen idag, viktigt steg att lära sig och använda OO. Klasser är byggstenen i

Läs mer

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar

Läs mer

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

(Lösningsförslag finns sist i denna fil.) (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

Läs mer

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT 2013 1 / 42

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT 2013 1 / 42 Programmering i C++ EDA623 Arv EDA623 (Föreläsning 6) HT 2013 1 / 42 Arv Innehåll Härledda klasser Konstruktorer och destruktorer vid arv Tillgänglighet Polymorfism och dynamisk bindning Abstrakta klasser

Läs mer

PROV. 12 Egenskaper (provavsnitt)

PROV. 12 Egenskaper (provavsnitt) 12 Egenskaper (provavsnitt) 12.1 Egenskaper 12.2 Deklaration av egenskaper 12.3 Åtkomsttjänster för egenskaper 12.4 Åtkomsttjänster med genererade instansvariabler 12.5 Åtkomsttjänster med egna instansvariabelnamn

Läs mer

Programmering B med Visual C++ 2008

Programmering B med Visual C++ 2008 Programmering B med Visual C++ 2008 Innehållsförteckning 1 Repetition och lite nytt...5 I detta kapitel... 5 Programexekvering... 5 Loop... 5 Källkod... 6 Verktyg... 6 Säkerhetskopiera... 6 Öppna, kompilera,

Läs mer

Introduktion C-programmering

Introduktion C-programmering Introduktion C-programmering Viktor Kämpe C Historik Utvecklades först 1969 1973 av Dennis Ritchcie vid AT&T Bell Labs. Högnivå språk med kontakt mot maskinvara. Ett utav de mest använda språken. 2 C Standarder

Läs mer

Digitala Projekt(EITF40) - Larm

Digitala Projekt(EITF40) - Larm Digitala Projekt(EITF40) - Larm Handledare: Bertil Lindvall Erik Oredsson, I-09 Sara Sellin, I-09 2012-05-08 1. SAMMANFATTNING I denna rapport presenteras vårt projekt att bygga ett huslarm från grunden

Läs mer

Programmeringsteknik med C och Matlab

Programmeringsteknik med C och Matlab Programmeringsteknik med C och Matlab Kapitel 6: Filhantering Henrik Björklund Umeå universitet 13 oktober 2009 Björklund (UmU) Programmeringsteknik 13 oktober 2009 1 / 22 Textfiler Filer är sekvenser

Läs mer

Objektorienterad programmering Föreläsning 4

Objektorienterad programmering Föreläsning 4 Objektorienterad programmering Föreläsning 4 Copyright Mahmud Al Hakim mahmud@dynamicos.se www.webbacademy.se Agenda Introduktion till objektorientering Klasser och Objekt Instansvariabler Metoder Introduktion

Läs mer

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan. Bankkonto - övning Övningar att göra efter lärardemostration. Filen bankkonto.zip innehåller ett projekt med klassen Bankkonto. Zippa upp denna fil och öppna projektet i BlueJ och skriv vidare på klassen

Läs mer

PROV. 10 Uppräknade datatyper

PROV. 10 Uppräknade datatyper 10 10.1 10.2 Definition 10.3 Användning och regler 10.4 switch-satsen 10.5 Iteration över samtliga värden 10.6 Instansvariabler och instanstjänster 10.7 Värdespecifika implementationer 10.1 Hur ser vi

Läs mer

Klasshierarkier - repetition

Klasshierarkier - repetition Klasshierarkier - repetition Klasser kan byggas på redan denierade klasser, egna och/eller färdigskrivna, genom: I att klassobjekt används som attribut (instansvariabler): har-relation. Exempel: traksystemet

Läs mer

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

Ansvarig lärare: Olof Andersson, Telefon 021-101314 (besöker skrivsalen) MÄLRLENS HÖGSKOL Institutionen för elektroteknik Tentamen Mikrodatorteknik T3760 atum 2005-10-28 Tid 08.30 12.30 nsvarig lärare: Olof ndersson, Telefon 021-101314 (besöker skrivsalen) Om du klarat samtliga

Läs mer

Kontraktsprogrammering

Kontraktsprogrammering Kontraktsprogrammering Programmera med kontrakt Samma som i vardagen Två parter (minst), bägge följer sin del 2 Bilköp Kund Krav Betala varje månad Förtjänst Få en bil Försäljare Ge kunden en bil och serva

Läs mer

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1) Föreläsning 10 STRING OCH STRINGBUILDER; VARIABLERS SYNLIGHET Att deklarera och att använda variabler När vi deklarerar en variabel, t ex int x; inför vi en ny variabel med ett namn och en typ. När namnet

Läs mer

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen. TT Kapitel 3. Husdjur & Fisk Javaklasser Translation by Leif Lourié Java program består av klasser som beskriver saker (objekt) som finns på riktigt. Även om det finns många olika sätt att skriva program

Läs mer

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet ITK:P1 Föreläsning 1 Att programmera i språket Java DSV Peter Mozelius Programmering Olika typer av programmering som t ex: o Imperativ programmering (C, Pascal m fl) o Funktionell programmering (Lisp,

Läs mer

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd Introduktion TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd Vi har diskuterat vilka möjligheter till OO som erbjuds i C++. Vilka vill vi använda och varför? Allt har användningsområden

Läs mer

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Kort om klasser och objekt En introduktion till GUI-programmering i Java Kort om klasser och objekt En introduktion till GUI-programmering i Java Klasser En klass är en mall för hur man ska beskriva på något. Antag att vi har en klass, Bil. Den klassen innehåller en lista på

Läs mer

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT 2013 1 / 33

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT 2013 1 / 33 Programmering i C++ EDA623 Objektorienterad programutveckling EDA623 (Föreläsning 5) HT 2013 1 / 33 Objektorienterad programutveckling Innehåll Grundläggande begrepp Relationer mellan objekt Grafisk representation

Läs mer

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

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC) Realtidsprogrammering En introduktion Implementering (med exempel från PIC) Utan timing Periodtid varierar beroende på funktionernas exekveringstid. Specificera endast maxtid ( Worst case) och eventuellt

Läs mer

Laboration A Objektsamlingar

Laboration A Objektsamlingar Laboration A Objektsamlingar Avsikten med laborationen är att du ska träna på att använda ett par objektsamlingar. Uppgift 1 Titta genom föreläsningsunderlaget DA129AFAHT07.pdf och testkör exemplen (se

Läs mer

Software Technology. Josef Svenningsson

Software Technology. Josef Svenningsson Software Technology Josef Svenningsson Software Technology Software Technology Området Software Technology handlar i mångt och mycket om följande frågeställning: Hur designar man programmeringsspråk för

Läs mer

KALIBRERINGS MENY. För att komma tillbaka till Mätfunktionerna håll inne M -knappen 3s. eller vänta 1 min. 1 =MOD. 9.6 KBaud

KALIBRERINGS MENY. För att komma tillbaka till Mätfunktionerna håll inne M -knappen 3s. eller vänta 1 min. 1 =MOD. 9.6 KBaud 1 (6) FUNKTION HDH-C kalibrerings/konfigureringsverktyg behövs för drifttagning av HDH-M transmittrarna. Med HDH-C kan följande utföras: - Modbus inställningar - Regulator parametrar - Mät kalibrering

Läs mer

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs 2007 www.hh.se/staff/vero/programmering. Verónica Gaspes. IDE-sektionen.

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs 2007 www.hh.se/staff/vero/programmering. Verónica Gaspes. IDE-sektionen. Programmering Sommarkurs 2007 www.hh.se/staff/vero/programmering Verónica Gaspes IDE-sektionen Juni 14 Utkast 1 Recap 2 Mera om nya typer 3 Kort 4 Fält Recap Man kan ge namn till typer. Vi undersökte enum

Läs mer

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer. Översikt Klasshierarkier UML klassdiagram Relation mellan klasser mellan klasser och objekt Association ning ing andling Programmering tillämpningar och datastrukturer 2 UML UML Unified Modeling Language

Läs mer

Exempelsamling Assemblerprogrammering

Exempelsamling Assemblerprogrammering Exempelsamling Assemblerprogrammering I uppgifterna nedan utgå från följande programskelett: #include.data var1:.word 12 var2:.word 19 sum: prod:.float 0.set noreorder.text.globl start.ent start

Läs mer

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner Introduktion till programmering D0009E Föreläsning 5: Fruktbara funktioner 1 Retur-värden Funktioner kan både orsaka en effekt och returnera ett resultat. Hittills har vi ej definierat några egna funktioner

Läs mer

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING Systemkonstruktion LABORATION REALTIDSPROGRAMMERING Laborationsansvariga: Anders Arvidsson, Björn Lundblad Utskriftsdatum: 2002-10-31 Laboranter: 1 Syfte Denna laboration syftar till att öva användningen

Läs mer

C++ Slumptalsfunktioner + switch-satsen

C++ Slumptalsfunktioner + switch-satsen C++ Slumptalsfunktioner + switch-satsen Veckans avsnitt består av ett antal lite udda funktioner man kan ha nytta av när man skriver program. Det är en slumptalsgenerator och lite annat smått och gott.

Läs mer

Digitala Projekt (EITF11) Hemlarm

Digitala Projekt (EITF11) Hemlarm Digitala Projekt (EITF11) Hemlarm Karl Nordenstorm, I-12, gem12kno 2014-05-16 Handledare: Bertil Lindvall Sammanfattning Den här rapporten beskriver arbetet bakom hur en prototyp för ett hemlarm har utvecklats

Läs mer

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Inledning Starta Microsoft Visual Studio 2005. Välj create Project Välj VB + Vindows Application och välj ett nytt

Läs mer

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11) Skola: Institution : Kurs : Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11) Projekttyp : Rapportsammanfattning Handledare : Bertil Lindvall Studenter : Datum : 2015-05-11

Läs mer

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto Objekt och klasser - Introduktion Objekt Ð Begreppet objekt Ð Hur klasser anvšnds fšr att skapa objekt Ð Fšr-definierade klasser Ð Metoder och parameteršverfšring Ð Definiera klasser Ð Modifierare Ð Statiska

Läs mer

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet. Datorteknik Tomas Nordström Föreläsning 6 För utveckling av verksamhet, produkter och livskvalitet. Föreläsning 6 Vad händer vid uppstart SoC och Kringkretsar, PIO Programmering i Assembler Lab2 genomgång

Läs mer

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2 TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2 Pelle Evensen, Daniel Wetterbro 5 november 2009 Sammanfattning Denna vecka ska vi titta på abstrakta klasser kontra interface,

Läs mer

#include #include char LEFT,RIGHT,MOTORHASTIGHET;

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET; Att avlusa en rad Assembler tar lika lång tid som att avlusa en rad C. Att skriva i C gör att man är utlämnad till kompilatorns sätt att göra assembler koden. Assembler ger fullständig kontroll över tider.

Läs mer

System S. Datorarkitektur - en inledning. Organisation av datorsystem: olika abstraktionsnivåer. den mest abstrakta synen på systemet

System S. Datorarkitektur - en inledning. Organisation av datorsystem: olika abstraktionsnivåer. den mest abstrakta synen på systemet Datorarkitektur - en inledning Organisation av datorsystem: olika abstraktionsnivåer System S den mest abstrakta synen på systemet A B C Ett högnivåperspektiv på systemet a1 b1 c1 a2 b3 b2 c2 c3 En mera

Läs mer

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng TENTAMEN I PROGRAMMERING Ansvarig: Jan Skansholm, tel 7721012 Betygsgränser: Hjälpmedel: Sammanlagt maximalt 60 poäng. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng Skansholm,

Läs mer

Funktioner. Programmering. Egendefinierade funktioner i Java. En Java-funktions anatomi. hh.se/db2004. Statiska metoder. Funktioner. resultatvärde.

Funktioner. Programmering. Egendefinierade funktioner i Java. En Java-funktions anatomi. hh.se/db2004. Statiska metoder. Funktioner. resultatvärde. Programmering hh.se/db2004 Föreläsning 7: Funktioner Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Funktioner Statiska metoder 1 Kan ta 0 eller flera argument. 2 Kan producera

Läs mer

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder *:85/ID200V C++ HT07 Föreläsning 8 Medlemspekare Undantagshantering Namnrymder Medlemspekare Ibland uppstår behovet att peka ut en viss medlem, som skall behandlas i olika objekt. C++ har begreppet medlemspekare

Läs mer

PROGRAMMERING-Java TENTAMINA

PROGRAMMERING-Java TENTAMINA PROGRAMMERING-Java TENTAMINA Nicolina Månsson 2010-03-17 Tentamensinstruktioner Poängsättning Hela tentamen omfattar 42 poäng. Poäng för varje uppgift står angivet inom parentes före varje uppgift. - För

Läs mer

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET UMEÅ UNIVERSITET Datavetenskap 010824 TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET Datum : 010824 Tid : 9-15 Hjälpmedel : Inga Antal uppgifter : 7 Totalpoäng : 40 (halva poängtalet krävs normalt

Läs mer

TENTAMEN Datorteknik (DO2005) D1/E1/Mek1/Ö1

TENTAMEN Datorteknik (DO2005) D1/E1/Mek1/Ö1 Halmstad University School of Information Science, Computer and Electrical Engineering Tomas Nordström, CC-lab TENTAMEN Datorteknik (DO2005) D1/E1/Mek1/Ö1 Datum: 2012-05- 23 Tid och plats: 9:00 13:00 i

Läs mer

Tentamen PC-teknik 5 p

Tentamen PC-teknik 5 p Tentamen PC-teknik 5 p Lösningar och kommentarer OBS! Denna version av tentan är främst avsedd för dem som gick kursen HT-02. En parallell tentamen i E103 är något anpassad för dem som gick kursen tidigare.

Läs mer

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00 DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00 Introduktion Skriv dina svar på separata papper, dessa scannas in efter inlämning. Du kan skriva på båda sidor.

Läs mer

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt: 8. Objektorientering Skälet till att C++ är ett av de mest använda programspråken är att det är objektorienterat. Detta bygger vidare på begreppet struct (ursprungligen från språket C som inte är objektorienterat),

Läs mer

En kurs i C-programmering

En kurs i C-programmering En kurs i C-programmering Föreläsningsanteckningar från AD1/PK2 VT06 Jesper Wilhelmsson March 11, 2006 2 Innehåll 1 Introduktion till C 5 1.1 Bakgrund......................................... 5 1.2 Variabler,

Läs mer

Lösningsförslag övning 2.

Lösningsförslag övning 2. Objektorienterad programmering, Z1 Lösningsförslag övning 2. Uppgift 1. public class SIUnits { public static double yardspermeter = 1.093613; public static double poundperkilo = 2.204623; public static

Läs mer

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer Programmering hh.se/db2004 Föreläsning 3: Java. Grundtyper, variabler och arrayer Hej Då, Karel! Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Center for Research on Embedded

Läs mer

Användarhandledning Version 1.2

Användarhandledning Version 1.2 Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...

Läs mer

Lathund. Pacific C för MS-DOS

Lathund. Pacific C för MS-DOS Lathund Pacific C för MS-DOS Revision 2 2003-08-28 Anders Arvidsson Karl-Johan Krantz Synpunkter välkomnas! Innehållsförteckning 1 Introduktion...3 1.1 Assembler kontra C...3 1.2 Kodexempel...3 1.3 PACIFIC

Läs mer

Djup/ytlig kopiering av containrar med referensobjekt. Allmänt. Vad ska container innehålla? 2004-05-10

Djup/ytlig kopiering av containrar med referensobjekt. Allmänt. Vad ska container innehålla? 2004-05-10 Djup/ytlig kopiering av containrar med erensobjekt Allmänt Om man inte vet hur många objekt man kommer behöva under exekvering så måste dynamiska lagringsstrukturer användas. stack, kö, lista, träd osv

Läs mer

C-programmering, föreläsning 2 Jesper Wilhelmsson

C-programmering, föreläsning 2 Jesper Wilhelmsson C-programmering, föreläsning 2 Jesper Wilhelmsson Funktioner void Globala och lokala variabler, scope static Arrayer Strängar ASCII, ANSI Argument till main Slumptal Funktioner Nu är det dags att börja

Läs mer

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser // En första version av BankKonto-klassen class BankKonto { private String namn; private long nr; private double saldo; private double ränta; // Klassen TestaBankKonto // Klassens uppgift är att skapa

Läs mer

IE1204/IE1205 Digital Design

IE1204/IE1205 Digital Design TENTAMEN IE1204/IE1205 Digital Design 2012-12-13, 09.00-13.00 Inga hjälpmedel är tillåtna! Hjälpmedel Tentamen består av tre delar med sammanlagd tolv uppgifter, och totalt 30 poäng. Del A1 (Analys) innehåller

Läs mer

Objektorienterad programmering Föreläsning 6. Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska metoder

Objektorienterad programmering Föreläsning 6. Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska metoder Objektorienterad programmering Föreläsning 6 Copyright Mahmud Al Hakim mahmud@dynamicos.se www.webbacademy.se Agenda Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska

Läs mer

Tenta i Digitalteknik

Tenta i Digitalteknik Tenta i Digitalteknik Kurskod D0011E Tentamensdatum 2010-08-27 Skrivtid 9.00-14.00 Maximalt resultat 50 poäng Godkänt resultat 25 poäng inkl bonus Jourhavande lärare Per Lindgren Tel 070 376 8150 Tillåtna

Läs mer

Föreläsning 2 Verktyg m.m.

Föreläsning 2 Verktyg m.m. Föreläsning 2 Verktyg m.m. Innehåll Java-paket Utvecklingsmiljö (development environment) Hur man organiserar sin utvecklingsmiljö Verktyg (tools) Editorer, debuggers, IDE's (integrated development environments),

Läs mer

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia Konstruktion av en radiostyrd legobil Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia 1 1.Innehållsförtäckning Rapport Radiostyrd LEGO bil...1 1. Innehållsförtäckning...2 2.0 Inledning...3

Läs mer

Föreläsning 3: Händelsestyrda program och användargränssnitt

Föreläsning 3: Händelsestyrda program och användargränssnitt (2 september 2015 F3.1 ) Föreläsning 3: Händelsestyrda program och användargränssnitt Idag Från sekventiella till händelsestyrda program Lyssnare Kontroller Layout för ordning av kontroller (2 september

Läs mer

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass). 3 Arv och gränssnitt 3.1 Vad innebär arv? Ett objektorienterat språk bygger på att programmeraren ges möjligheten att modellera verkligheten med hjälp av objekt. Objekt låter sig definieras i form av klasser.

Läs mer

Tentamen i DD2387 Programsystemkonstruktion med C++

Tentamen i DD2387 Programsystemkonstruktion med C++ Tentamen i DD2387 Programsystemkonstruktion med C++ Datum: Fredag 24 oktober 2008, 14-18 Hjälpmedel: En eller två valfria läroböcker om C++ id: Tid: 4 timmar Skriv inte ditt namn på tentan. Under tentan

Läs mer

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna. 1 Uppgift 1 Klassen Company Banken FinanceTrust som tidigare bara haft privatpersoner som kunder vill nu bygga ut sitt datasystem så att även företag kan registreras som kunder. Skriv klassen Company som

Läs mer

Modbus över Ethernet. WAGO Contact SA TSS STR 2011 1

Modbus över Ethernet. WAGO Contact SA TSS STR 2011 1 Modbus över Ethernet WAGO Contact SA TSS STR 2011 1 Modbus över Ethernet En enorm mängd produkter stöder modbus. Modbus kallas ibland för automationens minsta gemensamma nämnare. Kanske är det för att

Läs mer

C-programmering, föreläsning 1 Jesper Wilhelmsson

C-programmering, föreläsning 1 Jesper Wilhelmsson C-programmering, föreläsning 1 Jesper Wilhelmsson Introduktion till C Variabler, Typer, Konstanter Operatorer Villkorliga satser if-else, switch Loopar for, while, do... while Inmatning och utmatning stdin

Läs mer

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och... Allt du behöver veta om MATLAB: Industristandard för numeriska beräkningar och simulationer. Används som ett steg i utvecklingen (rapid prototyping) Har ett syntax Ett teleskopord för «matrix laboratory»

Läs mer

Föreläsning 16 Arv. Jan Lönnberg 3.11.2011. T-106.1212 Grundkurs i programmering

Föreläsning 16 Arv. Jan Lönnberg 3.11.2011. T-106.1212 Grundkurs i programmering Föreläsning 16 Arv Grundkurs i programmering Jan Lönnberg Institutionen för datateknik -universitetets högskola för teknikvetenskaper 3.11.2011 Varför? I ett studieregister har vi både studenter och lärare.

Läs mer

Poster ( structar ) Postdeklarationer

Poster ( structar ) Postdeklarationer Poster ( structar ) Exempel på en postdeklaration: struct person { int id; char namn[20]; int vikt, skonr; p1, p2; Detta definierar två variabler p1 och p2 som poster med termerna id, namn, vikt och skonr.

Läs mer

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera Föreläsning 2 Operatorer Tilldelning Kodblock if satsen Logiska uttryck Att programmera En operator tar ett eller två data och producerar ett svar. Typexemplet är +. Den tar t.ex två heltal och producerar

Läs mer

Programmering med Arduino

Programmering med Arduino Programmering med Arduino Av Staffan Melin och Martin Blom Bild & form-skolan, Masthugget, Göteborg 2015 Staffan Melin, staffan.melin@oscillator.se Martin Blom, martinblomblom@hotmail.com Detta verk är

Läs mer

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a. Översikt UML Sekvensdiagram (dynamic structure) Informationsflöde genom programmet Användningsfall (use cases) Aktörers interaktion med systemet Paketdiagram Beroenden mellan paket abstrakta klasser Multipel

Läs mer

Föreläsningsanteckningar till Konstruktionsmetoder 981027

Föreläsningsanteckningar till Konstruktionsmetoder 981027 Föreläsningsanteckningar till Konstruktionsmetoder 981027 Jämförelse mellan 68705P3 och 16F84 externt MC68705P3 PIC16F84 I/O 20 13 Kapsling 28-pin DIL 18-pin DIL Drivförmåga på pinnar PortB 10mA Sink,

Läs mer

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT 2007. Lars Larsson Algoritmer 1

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT 2007. Lars Larsson Algoritmer 1 Algoritmer Lars Larsson VT 2007 Lars Larsson Algoritmer 1 1 2 3 4 5 Lars Larsson Algoritmer 2 Ni som går denna kurs är framtidens projektledare inom mjukvaruutveckling. Som ledare måste ni göra svåra beslut

Läs mer

FactoryCast HMI. Premium & Quantum PLC. Applets 2004-10-28

FactoryCast HMI. Premium & Quantum PLC. Applets 2004-10-28 FactoryCast HMI Premium & Quantum PLC Applets 2004-10-28 INNEHÅLLSFÖRTECKNING 1 OM DETTA DOKUMENT...3 2 FÖRUTSÄTTNINGAR...3 3 PROJEKT I J++...4 3.1 LÄSA PLC-VARIABLER...4 3.1.1 Gränssnittet...4 3.1.2 Upprätta

Läs mer

Användar- och systemdokumentation

Användar- och systemdokumentation Användar- och systemdokumentation Linköpings universitet Examinator:, IDA marme647@student.liu.se Utskriftsdatum: Innehållsförteckning Inledning... 3 Användarhandledning... 4 Systemkrav och installation...4

Läs mer

Språket Python - Del 1 Grundkurs i programmering med Python

Språket Python - Del 1 Grundkurs i programmering med Python Hösten 2009 Dagens lektion Ett programmeringsspråks byggstenar Några inbyggda datatyper Styra instruktionsflödet Modulen sys 2 Ett programmeringsspråks byggstenar 3 ETT PROGRAMMERINGSSPRÅKS BYGGSTENAR

Läs mer

Studentportalen http://www.studentportalen.uu.se UNIX-konton (systemansvariga P4118) Lärare: Tom Smedsaas, Tom.Smedsaas@it.uu.se

Studentportalen http://www.studentportalen.uu.se UNIX-konton (systemansvariga P4118) Lärare: Tom Smedsaas, Tom.Smedsaas@it.uu.se Föreläsning 1: Intro till kursen och programmering Kursens hemsida http:www.it.uu.se/edu/course/homepage/prog1/ht12 Studentportalen http://www.studentportalen.uu.se UNIX-konton (systemansvariga P4118)

Läs mer

Chapter 4: Writing Classes/ Att skriva egna klasser.

Chapter 4: Writing Classes/ Att skriva egna klasser. Chapter 4: Writing Classes/ Att skriva egna klasser. I dessa uppgifter kommer du att lära dig om hur man definierar egna objekt genom att skriva klasser. Detta är grunden för att förstå objekt orienterad

Läs mer

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag Föreläsning 12 Föreläsning 12 Rörliga figurer Klassen Timer Undantag Något om applets Rörliga appletsfigurer Klassen Timer Undantag Något om applets Klassen javax.swing.timer I Swing finns en klass Timer

Läs mer

Instuderingsfrågor, del D

Instuderingsfrågor, del D Uppgift 1. Instuderingsfrågor, del D Objektorienterad programmering, Z1 I vilka av nedanstående problem behöver man använda sig av fält för att få en elegant lösning? I vilka problem är det är det onödigt/olämpligt

Läs mer

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips Lab1 Introduktion Förberedelse för planetlabben genom att kapsla in (skapa wrappers) systemanrop. 1 Syfte Få en känsla av hur Win32API fungerar, dvs programmerarens interface gentemot Windows. Känsla för

Läs mer

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer Föreläsning 4 Metodanrop switch-slingor Rekursiva metoder Repetition av de första föreläsningarna Inför seminariet Nästa föreläsning Metodanrop - primitiva typer Vid metodanrop kopieras värdet av en variabel

Läs mer

Introduktion till programmering. Programspråk och paradigmer

Introduktion till programmering. Programspråk och paradigmer Introduktion till programmering Programspråk och paradigmer Vad är ett programspråk? Aprogramming languageis a formal constructedlanguagedesigned to communicate instructions to a machine, particularly

Läs mer

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402 Övningsuppgift Bankkonton Steg 2 Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402 Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering

Läs mer

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar Klassbegreppet och C++ OOP UML Klasser och objekt i C++ Uppdelning i filer Attribut och metoder Inkappsling - åtkomst Klassattribut - objektattribut Objekt-orienterad programmering Att använda ett objektorienterat

Läs mer

Kurskod D0010E Datum 2012-05-15 Skrivtid 5tim

Kurskod D0010E Datum 2012-05-15 Skrivtid 5tim LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 5 Lärare: Håkan Jonsson, 491000, 073-820 1700 Resultatet o entliggörs senast: 2012-05-29. Tillåtna

Läs mer

Realtidsprogrammering

Realtidsprogrammering Realtidsprogrammering En introduktion - Principer och begrepp Realtidsprog. - Anders Arvidsson 1 Vad är ett realtidssystem? Ett system som reagerar på yttre händelser och ger svar inom en bestämd tid.

Läs mer

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas. .0.0 DIAGNOSTISKT PROV Tid Klockan 09.00-2.00 Hjälpmedel Inga Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas. Rättning Tentamen omfattar 6 poäng Denna tentamen

Läs mer

C++ Lektion Tecken och teckenfält

C++ Lektion Tecken och teckenfält C++ Lektion Tecken och teckenfält Teori Hittills har alla variabler du jobbat med varit olika typer av tal, men du kan också deklarera variabler som håller bokstavstecken. Denna variabeltyp kallas för

Läs mer

LABORATIONSINSTRUKTION

LABORATIONSINSTRUKTION Högskolan Dalarna Elektroteknik LABORATION LABORATIONSINSTRUKTION PLC-styrning av ett minimalt parkeringsgarage KURS El- och styrteknik för tekniker ET 1015 INNEHÅLL LAB NR 4 Ver 1.0 1. Inledning 2. Laborationskortet

Läs mer

ADO.NET Murach Kapitel 17-20

ADO.NET Murach Kapitel 17-20 Databaser och C# ADO.NET Murach Kapitel 17-20 2013-01-30 1 Winstrand Development Databas ADO.NET Är en del av.net ramverket och tillhandahåller delar för att kommunicera med olika datakällor. Dessa kan

Läs mer

Visual Basic, en snabbgenomgång

Visual Basic, en snabbgenomgång Visual Basic, en snabbgenomgång Variabler och Datatyper En variabel är som en behållare. Olika behållare passar bra till olika saker. I Visual Basic(härefter VB) finns olika typer av behållare för olika

Läs mer

HI1024 Programmering, grundkurs TEN2 2014-03-13

HI1024 Programmering, grundkurs TEN2 2014-03-13 HI1024 Programmering, grundkurs TEN2 2014-03-13 KTH STH Haninge 13.15-18.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King

Läs mer

Lösningsföslag till Exempel på tentamensuppgifter i Digitalteknik I

Lösningsföslag till Exempel på tentamensuppgifter i Digitalteknik I Lösningsföslag till Exempel på tentamensuppgifter i Digitalteknik I Flervalsfrågor. A 2. C 3. B 4. D 5. A 6. B 7. C 8. D 9. C 0. B. B 2. C 3. A 4. C 5. A Problemuppgifter. Uttryckt i decimal form: A=28+32+8

Läs mer

Tentamen för TTIT71 Programmering 2007-01-10 kl. 08-12 Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

Tentamen för TTIT71 Programmering 2007-01-10 kl. 08-12 Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p) Tentamen för TTIT71 Programmering 2007-01-10 kl. 08-12 Institutionen för datavetenskap Linköpings universitet Antal uppgifter: 6 Max: 32 poäng Betyg: 3:a 16 poäng, 4:a 24 poäng, 5:a 28 poäng Hjälpmedel:

Läs mer

Lektion 4. Datateknik A, Java I, 5 poäng

Lektion 4. Datateknik A, Java I, 5 poäng Datateknik A, Syfte: Att lära sig använda de primitiva typerna och olika operatorer för att bygga upp uttryck. Att använda kontrollflödeskonstruktioner för att styra flödet i programmet. Att stifta bekantskap

Läs mer