Interrupt i Linux/StrongArm 1100
|
|
- Anna-Karin Lundberg
- för 5 år sedan
- Visningar:
Transkript
1 Interrupt i Linux/StrongArm 1100 Ett kapitel för kursen Wearable Computers D 10 p Namn: Handledare: Björne Lindberg och Ulf Brydsten
2 Innehållsförteckning Innehållsförteckning...2 Inledning...3 Interrupt...3 Linux interrupt API...3 Datastrukturen irq_desc_t...4 Status variabeln...5 Action listan...5 Depth...5 Lock...5 Datastrukturen hw_irq_controller...6 Typename...6 Startup...6 Shutdown...6 Enable...6 Disable...6 Ack...7 End...7 Set_affinity...7 do_irq() funktionen...7 handle_irq_event() funktionen eller do_irq()...7 Filen arch/arm/kernel/entry-armv.s...7 Filen arch/arm/mach-sa1100/irq.c...7 Filen include/asm-arm/arch-sa1100/irqs.h...7 Initiering av interrupthårdvara...8 SoftIRQ och tasklets...8 Interrupt probing...8 SA1100 processorns interrupt...10 Blockdiagram över interruptkontrollern på SA Interruptkontrollerns register...11 Interrupt pending register...11 IRQ pending reg. och FIQ pending reg...13 Mask register ICMR...13 Level register ICLR...14 Control register ICCR...14 Exempel på interrupt drivrutin för SA Drivrutinens funktionalitet...15 Keypad_init...15 Keypad_isr...15 Keypad_do_tasklet...15 mydev_read...15 Applikationens funktionalitet...16 Testkörningar...16 Källkod...17 irqdrv.c...17 Makefile för irqdrv...20 irqapp.c...20 Makefile för irqapp
3 Inledning Detta kapitel är ett delmoment i kursen Wearable Computers D, 10p. Kapitlet ger insikt i hur interrupt hanteras i Linux kärnan och de hårdvaruspecifika delarna av hanteringsprocessen beskrivs för StrongARM processorn SA1100. Kapitlet innehåller källkod för en exempeldrivrutin och en testapplikation, som utför tidmätning för olika delar i interrupthanteringsprocessen. Interrupt Ett interrupt är en signal som skickas till processorn från antingen hårdvara, hårdvaruavbrott, eller programvara, mjukvaruavbrott. Avbrottssignalen innebär en servicebegäran och medför normalt att processorn avbryter det den håller på med och exekverar en så kallad avbrottsrutin som är förutbestämd antingen i kärnan eller i användarens kod. Därefter återgår processorn att exekvera där den höll på då avbrottet skedde. Två olika typer av interrupt finns, interna och externa avbrott. Interna avbrott genereras av processorn själv, dessa används bland annat till att indikera att olika fel har uppstått så att programmeraren kan ta hand om dessa. Externa avbrott sker genom att en yttre enhet påverkar någon av processorns interrupt pinnar. Till externa avbrott räknas även interna timers. Linux interrupt API Linux interrupt API är den del av kärnan som arbetar mot hårdvarans (plattformens) interruptkontroller. Kunskap om interrupt APIn är nödvändig för att kunna porta Linux till en ny hårdvara, utan detta är det omöjligt att uppnå ett fungerande system. Vi börjar med att kolla närmare på de två viktigaste data strukturerna som används för att hantera interrupt i Linux kerneln, irq_desc_t och hw_irq_controller. För att klargöra en del saker kommer kod från Linux kerneln som körs på LART att användas, LART systemet bygger på en SA1100 processor och koden skiljer inte mycket från övriga SA1100 plattformers kod. Bilden nedan demonstrerar interrupthanteringssystemet i Linux. Bilden visar relationer mellan olika datastrukturer och funktioner. Punkterna nedan förklarar de olika stegen i bilden. Interrupt sker Asembler macrona i entry-armv.s exekveras därifrån anropas sedan C funktionen asm_do_irq() med hjälp av följande asembler instruktion bne asm_do_irq. asm_do_irq() funktionen körs, anropar do_irq() funktionen. do_irq() anropar i sin tur do_irq(). do_irq() funktionen anropar varje funktion som ska hantera interruptet, dvs. alla irqaction strukturer loopas genom och varje irqaction.handler exekveras. När exekveringen återgår till asm_do_irq() så exekveras alla väntande interrupt på samma sätt. Slutligen anropas do_softirq() funktionen. 3
4 Datastrukturen irq_desc_t Grundstenen i Linux inerrupthantering är denna datastruktur. En array av denna struktur som heter irq_desc[] håller koll på källan till varje interrupt i Linux. Nedan visas definitionen för irq_desc_t, koden är tagen från include/linux/irq.h i kernelns källkod. /* * This is the "IRQ descriptor", which contains various information * about the irq, including what kind of hardware handling it has, * whether it is disabled etc etc. * * Pad this out to 32 bytes for cache and indexing reasons. */ typedef struct unsigned int status; /* IRQ status */ hw_irq_controller *handler; struct irqaction *action; /* IRQ action list */ unsigned int depth; /* nested irq disables */ spinlock_t lock; cacheline_aligned irq_desc_t; 4
5 Status variabeln Status fältet anger som namnet säger, interruptkällans status. Status kan vara en kombination av ett eller flera av nedanstående bitmönster. En del av dessa statusbitmönster har endast betydelse i en SMP arkitektur, dvs. en multiprocessorarkitektur. Status bitmönster IRQ_INPROGRESS - Interruptet hanteras. IRQ_DISABLED - Interruptet är inte aktiverat. IRQ_PENDING - Interruptet väntar, och bör hanteras. IRQ_REPLAY - Interruptet har mottagits men inte ännu bekräftats. IRQ_AUTODETECT - Håller på med automatisk sökning efter interruptkällan. IRQ_WAITING - Väntar på interrupt från källan, används vid autodetect. IRQ_LEVEL - Interrupt "triggas" på hög/låg flank. IRQ_MASKED - Interruptet är maskerat och är inte vara aktivt. IRQ_PER_CPU - Interruptet har tilldelats en viss CPU, endast vid SMP. Action listan Aktion fältet är en länkad lista med irqaction datastrukturer. Varje struktur i listan håller reda på minnesadressen till interrupthanteringsfunktionen. En ny irqaction struktur läggs till i listan varje gång request_irq() funktionen anropas. Nedan visas hela datastrukturen irqaction, koden tagen från filen include/linux/interrupt.h struct irqaction void (*handler)(int, void *, struct pt_regs *); unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next; ; Fältet irq.handler pekar på den funktion som ska exekveras då ett visst hårdvaruinterrupt sker, och har ingen som helst vetskap om varför eller vad som gjorde att interruptet skedde. Detta gör att ineterruptdrivna drivrutiner är mycket enkla att porta mellan olika arkitekturer. Depth Detta fält har uppkommit på grund av att en del systems interruptkontrollers inte gillar upprepade enable/disable av interrupt eller att dessa sker i obalans. Så depth fältet håller alltså reda på enable/disable anrop av ett visst interrupt och ser till att dessa hålls i balans. Lock Detta fält har betydelse i multiprocessor system och kan alltså låsa strukturen så den inte behandlas av flera processorer. 5
6 Datastrukturen hw_irq_controller Varje interruptbeskrivning i irq_desc_t innehåller fältet handler, detta fält refererar till en hw_irq_controller struktur. Definitionen av hw_irq_controller strukturen finns i filen include/linux/irq.h och visas här nedanför. /* * Interrupt controller descriptor. This is all we need * to describe about the low-level hardware. */ struct hw_interrupt_type const char * typename; unsigned int (*startup)(unsigned int irq); void (*shutdown)(unsigned int irq); void (*enable)(unsigned int irq); void (*disable)(unsigned int irq); void (*ack)(unsigned int irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, unsigned long mask); ; typedef struct hw_interrupt_type hw_irq_controller; Typename Fältet typename innehåller en kort namnbeskrivning av arkitekturens interruptkontroller, detta textfält används i bl.a. Linux /proc katalogen för att visa kontrollerspecifik information. Startup Kerneln anropar kontrollerns startup() funktion då en drivrutin gör förfrågan efter ett visst interrupt via funktionen request_irq() eller när interrupt initieras med autodetect. Startup() är rent funktionellt identisk med enable-funktionen förutom att startup tar bort eventuella köande/väntande interrupt, medan enable inte gör det. I inbyggda Linuxssystem som har en interruptkontroller som inte köar upp interrupt så är startup() och enable() funktionerna samma i drivrutinen för systemets interruptkontroller. Shutdown Precis som namnet säger så stänger denna funktion ner ett interrupt i interruptkontrollern. Funktionen anropas även då en drivrutin gör free_irq(). Shutdown funktionen är ofta samma funktion som disable() funktionen. Enable Denna funktion informerar systemets interruptkontroller om att aktivera den efterfrågade interruptkanalen. Disable Funktionen informerar systemets interruptkontroller att inaktivera ett visst interrupt. 6
7 Ack Kerneln anropar interrupkontrollerns ack() funktionen genast ett interrupt dyker upp, före detta behandlas. Vissa kontroller använder sig inte av denna funktion medan en del andra mappar ack() funktionen till disable(), så att inte ett nytt interrupt kan ske på samma kanal innan det föregående har behandlats. End När kerneln har behandlat ett interrupt anropas denna funktion i interruptkontrollerns drivrutin, kontrollern förväntas därmed ställa in sig så att nya interrupt kan ske på kanalen. Precis som i föregående funktion mappas denna funktion ibland till enable() av samma orsak. Set_affinity I SMP arkitekturer används denna funktion till att bestämma vilken CPU som ska behandla interruptet. Funktionen används inte i enprocessorsystem. do_irq() funktionen Linuxkärnans inblandning i interrupt- och undantagshanteringen börjar i och med denna funktion, som anropas via processorns interrupt request handler. Källkoden för do_irq() funktionen på SA1100 systemet finns i filen arch/arm/kernel/irq.c Normalt är det väldigt små skillnader i olika arkitekturers do_irq() funktion, för i stort sett manipuleras endast irq_desc_t strukturer i funktionen. Den riktiga hanteringen av interrupt sker i funktionen handle_irq_event() som i SA1100 arkitekturen har fått namnet do_irq(). handle_irq_event() funktionen eller do_irq() Då do_irq() funktionen har identifierat interruptet skickas listan med interrupthanteringsfunktioner till denna funktion, för vidare behandling. Härifrån anropas varje interrupthanteringsfunktion för alla interrupt som ska behandlas. Med andra ord funktionerna som har skrivits för interrupthantering i drivrutiner för en viss hårdvara. Exempel på detta visas i källkoden till exempeldrivrutinen längre fram i kapitlet. Filen arch/arm/kernel/entry-armv.s I denna fil finns maskinspecifika interruptfunktioner. Koden i denna fil är skriven i assembler och här läses av vilka interrupt som har skett varvid C funktionen asm_do_irq() anropas som i sin tur sedan anropar do_irq. Filen arch/arm/mach-sa1100/irq.c I denna fil finns bland annat funktionen SA1100_init_irq(), funktionen initierar hårdvarans interruptkontroller. I filen finns också funktionerna mask_irq() och unmask_irq() mfl. Filen include/asm-arm/arch-sa1100/irqs.h I denna fil definieras alla IRQ nummer för samtliga interrupt på SA1100 processorn. 7
8 Initiering av interrupthårdvara Kerneln initierar interruptkontrollerns hårdvara genom funktionen init_irq() som anropas från funktionen start_kernel(). Implementationen av init_irq() finns alltid i de arkitekturspecifika delarna av kernel koden, för SA1100 finns funktionen i filen arch/arm/mach-sa1100/irq.c. Och start_kernel() finns i init/main.c SoftIRQ och tasklets Softirq körs skilt från hårdvaruinterrupt i Linux kärnan. Softirq fungerar så länge interrupt är aktiverat i systemet, softirq ersätter bottom-half strategin som användes i äldre linux kärnor (2.2), vilket inte kommer att behandlas i detta kapitel. Softirq körs på varje processor i systemet om det är ett multiprocessorsystem. Tasklet är som ett softirq, förutom att detta körs enbart på en processor, även om systemet tillhandahåller fler. Ordet tasklet är aningen vilseledande eftersom detta inte har något med aktiva processer i operativssytemet att göra. Exempel på tasklet visas i exempeldrivrutinen längre fram i kapitlet. Softirq och tasklets är implemnterad i kärnan med sina egna datastrukturer och funktioner, och är i princip helt hårdvaruoberoende så länge kernelns do_irq() funktion anropar do_softirq() funktionen, detta görs i ARM arkitekturen. Aktiva softirq och tasklets hanteras av ksoftirqd tråden. Interrupt probing Linux kärnan tillhandahåller funktioner för interrupt probing, dvs automatikst avgöra vilken interrupt kanal en viss hårdvara är bunden till. Denna funktionalitet kan användas av drivrutiner via funktionerna probe_irq_on() och probe_irq_off(). När en drivrutin ska söka efter interrupt kanalen anropas först probe_irq_on() för att meddela kerneln om att probing ska inledas. Sedan anropar drivrutinen något i hårdvaran som "tvingar" den att ge ifrån sig ett interrupt. Och slutligen anropas probe_irq_off() vilken returnerar interruptkanalen som används för hårdvaran. 8
9 Kodexempel med IRQ probing: void mydrvprobeirq() unsigned long mask; int irq, retry=5; while (retry--) mask = probe_irq_on(); /* Gör något med hårdvaran som tvingar den att ge ifrån sig ett interrupt */ irq = probe_irq_off(mask); if (irq <= 0) printk(kern_info ": Could not find interrupt line."); else printk(kern_info ": Found interrupt line %d", irq); if (irq > 0) if (request_irq(irq, &my_isr, SA_INTERRUPT, "my_isr", NULL)) else printk(kern_info ": Bind IRQ error"); printk(kern_info ": Bind IRQ done"); break; 9
10 SA1100 processorns interrupt SA1100 processorns interruptkontroller makserar alla interrupt oavsett om dessa är FIQ (Fast IRQ) eller IRQ interrupt och kombinerar dessa till. Interrupthanteringen i SA1100 är indelad i två delar. Lägsta nivån av hanteringsprocessen representeras av interruptkontrollerns IRQ pending register (ICIP) och FIQ pending registret (ICFP), dessa register innehåller alla aktiverade och omaskerade interruptkällor. Interrupten som är aktiverade i sin hårdvara görs synliga via interruptkontrollerns mask register (ICMR). ICIP registret innehåller alla interrupt som är programmerade att generera ett IRQ avbrott och ICFP innehåller alla FIQ avbrott som har aktiverats. Valet av ICIP eller ICFP sköts genom att programmera registret ICLR level register. Andra nivån av hanteringsprocessen är egentligen hårdvaran som genererar interrupten. Normalt så kombineras flera interrupt från denna nivå (genom en ELLER procedur) och skickas vidare till första nivån. Vanligtvis kan källan till interruptet avläsas via två register, ICIP eller ICFP beroende på vilken interrupthanterare som körs i mjukvaran (Linux kerneln) för tillfället. När processorn är i idle mode så kommer varje interrupt att väcka upp den igen, interrupt mask registret ignoreras när systemet är idle. Blockdiagram över interruptkontrollern på SA
11 Interruptkontrollerns register SA1100 processorns interruptkontroller består av fyra olika register. ICIP, IRQ pending register. ICFP, FIQ pending register. ICMR, Mask register. ICLR, Level register, väljer IRQ eller FIQ. Vid reset av processorn så inaktiveras ICIP och ICFP registren och de övriga har okänt innehåll, alltså måste interruptkontrollern initieras. Interrupt pending register ICPR är ett 32-bitars läsbart register som visar alla aktiva interrupt i systemet. Dessa bitar påverkas inte av mask registret (ICMR). Nedanstående tabell visar alla fält i registret, samt deras interruptkälla och andra nivåns källa. 11
12 Som man kan se i tabellen så har flera fält i detta register fler än en interruptsignal. När ett interrupt kommer från en av dessa kan interrupthanteringsrutinen avläsa vilken enhet som gav upphov till interruptet, men inte den exakta källan. För att få fram exakta källan måste rutinen läsa av enhetens status och därifrån avgöra vad som ledde till interrupt. För alla interrupt som bara har en källa kan dessa avläsas direkt. 12
13 IRQ pending reg. och FIQ pending reg. ICIP och ICFP innehåller en flagga per interrupt, totalt 32, som indikerar att ett interrupt har skett. I interruptrutinerna läses ICIP och ICFP av för att avgöra vilket/vilka interrupt som skett. Bitarna är endast läsbara. Tabellerna nedan visar ICIP- respektive ICFP bitarnas placeringar i registren. Mask register ICMR ICMR registret innehåller en maskbit för varje interrupt som väntar, maskbiten kontrollerar om det väntande interruptet ska generera ett processor interrupt eller om det ska ignoreras. När ett väntande interrupt aktiveras sänds det till processorn endast om motsvarande bit i ICMR är satt till en 1:a. Om processorn är i idle-mode så ignoreras masken helt och hållet. Maskbitarna är främst till nytta då systemet vill ha prioritet på interrupten, då kan ett interrupt av lägre prioritet maskas bort ifall interrupt av högre prioritet ännu inte har behandlats. 13
14 Level register ICLR ICLR registret styr om interruptet ska behnadlas som IRQ eller FIQ (Fast IRQ, detta används mycket sällan och funkar inte speciellt bra i Linux). Om ett väntande interrupt är omaskerat så läses motsvarande ICLR bit av för att avgöra vilket sorts interrupt som ska genereras. ICLR bitarna har ingen betydelse för maskerade interrupt. Control register ICCR ICCR registret innehåller endast en kontrollbit, disable idle mask bit (DIM). Om denna bit är satt till en 1:a förhindrar den att alla interrupt kan väcka processorn ur idle mode. Istället kan endast de interrupt som inte är maskerade väcka processorn. 14
15 Exempel på interrupt drivrutin för SA1100 Detta kodexempel illustrerar hur interrupt används i en linuxdrivrutin för SA1100 processorn. Drivrutinen använder sig av IRQ_GPIO9, vilket är interruptet som kan genereras på GPIO pinne nummer 9. Valet av just denna pinne var endast på grund av att den var den första lediga pinnen på mitt system just nu. Alltså det går lika bra att byta ut denna till någon av IRQ pinnarna. Många namn i drivrutinen har inget att göra med drivrutinens uppgift, detta på grund av att jag har modifierat en drivrutin för knapparna som jag redan hade skrivit. För att kunna köra denna drivrutin måste ett en device skapas i /dev katalogen på SA1100 systemet. På LART systemet görs detta t.ex. på följande sätt. Mounta en färdig ramdisk på värddatorn genom följande kommando mount o loop rdisk /mnt/rd Skapa en ny device på ramdisken med major-nummer 43 och namnet keypad. mknod /mnt/rd/dev/keypad c 43 0 Kopiera in den kompilerade drivrutinen irqdrv.o och applikationen irqapp till ramdisken. Umounta ramdisken, packa ihop den och skicka den till LART systemet. Drivrutinens funktionalitet Denna drivrutin har till uppgift att mäta hur lång tid det tar från det att ett interrupt har kommit till interrupthanteringsfunktionen tills det att den når applikationen som använder drivrutinen. Keypad_init Drivrutinen fungerar så att när den laddas in i systemet, med kommandot insmod irqdrv.o så körs funktionen keypad_init(). Denna funktion registrerar devicen /dev/keypad och kopplar filoperationerna till den. Sedan ställer drivrutinen in GPIO_GPIO9 att trigga på fallande flank med hjälp av funktionen set_gpio_irq_edge efter det görs en förfrågan om att få IRQ kanal IRQ_GPIO9. Och funktionen keypad_isr kopplas som interrupthanteringsfunktion. Keypad_isr Denna funktion kommer nu att exekvera så fort GPIO9 går låg i den här funktionen skrivs nuvarande tid ut i sekunder och mikrosekunder, samt antalet interrupt. I funktionen scheduleras en tasklet funktion som ska köras så fort den får tid. Keypad_do_tasklet Tasklet funktionen gör samma sak som interrupthanteraren, alltså skriver ut tiden. Så att man kan se skillnaden i tid mellan dessa två funktioner. Dessutom säger den till läskön att väckas upp med funktionen wake_up_interruptible(&keypad_queue); mydev_read Denna funktion körs så fort applikationen försöker läsa från drivrutinen. Men i funktionen sätts den att sova tills den väcks upp av ett interrupt på GPIO9, detta görs med hjälp av denna funktion interruptible_sleep_on(&keypad_queue); Och i detta exempel skrivs bara en 1:a till applikationen då den väcks upp av interrupt. 15
16 Applikationens funktionalitet Denna applikation är mycket enkel och använder sig alltså av devicen /dev/keypad för att kommunicera med drivrutinen. Då applikationen körs öppnas /dev/keypad för läsning. Sedan anropas funktionen read för att läsa från drivrutinen. Eftersom drivrutinen använder interruptible sleep så väntar applikationen tills drivrutinen väcks upp av ett interrupt. Då läsningen är klar skriver applikationen ut tiden, som nu kan jämföras mot tiderna från drivrutinen och totala fördröjningen kan räknas ut. Testkörningar Ladda drivrutinen insmod irqdrv.o Using irqdrv.o keypad initializing driver... (Följande utskrifter är modifieringar i kerneln (hacks) för att se vad som händer, alltså inget som visas normalt med standard kärna.) irq: 0 gpio_mask: 512. irq: 1 gpio_mask: 256. irq: 2 gpio_mask: 128. irq: 3 gpio_mask: 64. irq: 4 gpio_mask: 32. irq: 5 gpio_mask: 16. irq: 6 gpio_mask: 8. irq: 7 gpio_mask: 4. irq: 8 gpio_mask: 2. irq: 9 gpio_mask: 1. irg_desc[9] is now valid. irq Request IRQ returned 0 drv: Bind IRQ done [[[root@mp3machine:~]]] Generera interrupt på GPIO9 time value in keypad_isr : interrupt count in keypad_isr : 1 time value in keypad_do_tasklet : interrupt count in keypad_do_tasklet : 1 time value in keypad_isr : interrupt count in keypad_isr : 2 time value in keypad_do_tasklet : interrupt count in keypad_do_tasklet : 2 time value in keypad_isr : Starta applikationen och generera interrupt [[[root@mp3machine:~]]]./irqapp opened keypad app opened /dev/keypad time value in keypad_isr : interrupt count in keypad_isr : 6 time value in keypad_do_tasklet : interrupt count in keypad_do_tasklet : 6 time value in app : released keypad [[[root@mp3machine:~]]] 16
17 Källkod irqdrv.c #if defined(config_modversions) #define MODVERSION #include <linux/modversions.h> #endif #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/slab.h> #include <asm/segment.h> #include <asm/uaccess.h> #include <asm/hardware.h> #include <linux/fs.h> #include <asm/delay.h> #include <asm/irq.h> #include <linux/sched.h> #include <linux/mm.h> #include <linux/sysctl.h> #include <linux/timer.h> #include <linux/tqueue.h> #include <linux/interrupt.h> #define DRIVER_NAME "keypad" #define MYDEV_MAJOR 43 long interrupt_cnt = 0; */ /*A global variable for counting interrupts, /* MyDEV File operations*/ static int mydev_open(struct inode *inode, struct file *filp); static int mydev_release(struct inode *inode, struct file *filp); static ssize_t mydev_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos); static ssize_t mydev_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); static int mydev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); static void keypad_isr(int irq, void *dev_id, struct pt_regs *regs); void keypad_do_tasklet(unsigned long unused); DECLARE_TASKLET(keypad_tasklet, keypad_do_tasklet, 0); /*The tasklet list we put our*/ DECLARE_WAIT_QUEUE_HEAD(keypad_queue); /*The queue we put read to sleep in*/ static struct file_operations mydev_fops = read: mydev_read, write: mydev_write, ioctl: mydev_ioctl, open: mydev_open, release: mydev_release, ; 17
18 static int mydev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) // Nothing here... return 0; static ssize_t mydev_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) int retvalue; unsigned char *kbuf, *ptr; retvalue = count; /*Sleeps until next interrupt wakes it*/ interruptible_sleep_on(&keypad_queue); kbuf = kmalloc(count, GFP_KERNEL); if (!kbuf) return -ENOMEM; ptr = kbuf; // Just return 1 when app is reading. *ptr = 1; copy_to_user(buf, kbuf, retvalue); kfree(kbuf); return retvalue; static ssize_t mydev_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) int retvalue = count; unsigned char *kbuf; kbuf = kmalloc(count, GFP_KERNEL); if (!kbuf) return -ENOMEM; if(copy_from_user(kbuf, buf, count)) return -EINVAL; printk("<1>recieved %d elements\n", count); kfree(kbuf); return retvalue; static int mydev_open(struct inode *inode, struct file *filp) MOD_INC_USE_COUNT; printk("<1>opened keypad\n"); return 0; static int mydev_release(struct inode *inode, struct file *filp) 18
19 MOD_DEC_USE_COUNT; printk("<1>released keypad\n"); return 0; int keypad_init() int result; printk(driver_name " initializing driver...\n"); result = register_chrdev(mydev_major, "keypad", &mydev_fops); if (result < 0) printk("<1>keypad: can't get major nr\n"); return result; // Interrupt /* Enable GPIO as interrupt line */ GPDR &= ~GPIO_GPIO9; set_gpio_irq_edge(gpio_gpio9, GPIO_FALLING_EDGE); // Allocate the IRQ result = request_irq(irq_gpio9, &keypad_isr, SA_INTERRUPT, "keypad_int", NULL); printk(kern_info " Request IRQ returned %d\n", result); if (result) printk(kern_info ": Bind IRQ error\n"); else printk(kern_info ": Bind IRQ done\n"); return 0; void keypad_cleanup() free_irq(irq_gpio9, NULL); printk(driver_name " cleaning up...\n"); unregister_chrdev(mydev_major, "keypad"); static void keypad_isr(int irq, void *dev_id, struct pt_regs *regs) struct timeval tv; do_gettimeofday(&tv); printk(kern_info "time value in keypad_isr : %ld.%ld\n", tv.tv_sec, tv.tv_usec); tasklet_schedule(&keypad_tasklet); interrupt_cnt++; printk(kern_info "interrupt count in keypad_isr : %ld\n", interrupt_cnt); 19
20 void keypad_do_tasklet(unsigned long unused) struct timeval tv; wake_up_interruptible(&keypad_queue); do_gettimeofday(&tv); printk(kern_info "time value in keypad_do_tasklet : %ld.%ld\n", tv.tv_sec, tv.tv_usec); printk(kern_info "interrupt count in keypad_do_tasklet : %ld\n", interrupt_cnt); module_exit(keypad_cleanup); module_init(keypad_init); Makefile för irqdrv TARGET = arm-linux- CC = $(TARGET)gcc LD = $(TARGET)ld NM = $(TARGET)nm INCLUDE = /home/pontus/stuff/lart/linux/include CFLAGS =-c -Wall -O2 -D KERNEL -DMODULE -I$(INCLUDE) LFLAGS = all: irqdrv.o $(NM) lcd.o >./syms clean: rm irqdrv.o rm syms irqdrv.o: irqdrv.c $(CC) $(CFLAGS) irqdrv.c -o irqdrv.o irqapp.c #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <string.h> #include <sys/time.h> int main(int argc, char *argv[]) char key; struct timeval tv; struct timezone tz; int fd = open("/dev/keypad", O_RDWR); if(fd == -1) perror("open"); 20
21 return 1; printf("app opened /dev/keypad\n"); read(fd, &key, 1); gettimeofday(&tv, &tz); printf("time value in app : %ld.%ld\n", tv.tv_sec, tv.tv_usec); close(fd); return 0; Makefile för irqapp CC = arm-linux-gcc CFLAGS = -g -O2 -Wall BIN = irqapp OBJS = irqapp.o HEADERS = all: $(BIN) $(BIN): $(OBJS) $(CC) $(OBJS) -o $(BIN) $(OBJS): %.o: %.c $(HEADERS) $(CC) $(CFLAGS) -c $< -o $@ #install: # install $(bin) /usr/bin clean: rm -f $(OBJS) $(BIN) *~ core 21
Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010
Programsystemkonstruktion med C++: Övning 1 Karl Palmskog palmskog@kth.se september 2010 Programuppbyggnad Klassens uppbyggnad en C++-klass består av en deklaration och en definition deklaration vanligtvis
(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
Fö 5+6 TSEA81. Real-time kernel + Real-time OS
Fö 5+6 TSEA81 Real-time kernel + Real-time OS Stackens användningsområde * JSR / RTS : returadress * Temporärdata (push / pop) void myfunc(void) { int i; // hamnar nog i register int test[10]; // hamnar
Raspberry Pi och Tellstick, ett program i C.
Raspberry Pi och Tellstick, ett program i C. Ett program skrivet i C för att med Tellstick tända och släcka en eller flera lampor. Programmet startas med kommandot: /home/pi/development/cprog/tellstick/tellstick-13
AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser
Namn: Laborationen godkänd: Digitala system 15 hp AVR 3 - datorteknik LTH Ingenjörshögskolan vid Campus Helsingborg Avbrott. Syften med den här laborationen är att introducera avbrott. Avbrott som uppkommer
Maskinorienterad programmering
Externa avbrott Anslutning av extern avbrottsvippa, programmering med konfigurering och hantering av externa avbrott. Introduktion till time-sharing, enkel task-switch. Ur innehållet: NVIC och EXTI (SYSCFG)
F8: Undantagshantering
F8: Undantagshantering Undantagshantering i 68 Vad är ett undantag? Typer av undantag Att skriva undantagsrutiner Undantagshantering, vad och varför? Exempel: Ett system ska mäta temperatur var :e sekund
... Funktionsanrop. Vad händer när man kör ett program?
Vad händer när man kör ett program? När man kompilerar ett program och sedan länkar ihop det så stoppar länkaren in lite extra kod i programmet. Det är denna kod som i sin tur anropar main-funktionen ungefär
Operativsystem IS1350
Operativsystem IS1350 LAB 2 2011-09-26 Förberedelser: Läs igenom labhäftet. Gör uppgifterna i förväg, använd labtiden till att ställa frågor om du kört fast. Läs igenom tipsen om kärnakompilering på http://bobcares.com/
Realtidsstöd i Minix. En laborationrapport. Oktober 2012
Realtidsstöd i Minix En laborationrapport Karl Zylinski Hampus Gustafsson Oktober 2012 1 Innehåll 1 Introduktion 3 1.1 Problem................................ 3 1.1.1 Skapa ett testprogram....................
Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00
Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen 2019-04-16 14:00-18:00 Instruktioner Du får, förutom skrivmateriel, endast ha med dig en egenhändigt handskriven A4 med anteckningar. Anteckningarna lämnas
LEU240 Mikrodatorsystem
Institutionen för data- och informationsteknik 2011-10-11 LEU240 Mikrodatorsystem Vi har tidigare i olika sammanhang sett att det är önskvärt att kunna använda ett högnivåspråk som C för att skriva program
printenv sort pager printenv grep args sort pager
1 Problembeskrivning Uppgiften var att skriva ett program, digenv för att visa miljövariabler. programmet vara ekvivalent med att köra: Kört utan argument så skulle printenv sort pager och kört med argument
Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering
Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk
F6: I/O hantering. Typer av I/O i ett datorsystem. Protokoll för synkronisering. Drivrutiner. Memory mapped Port mapped. Polling Timed Interrupt DMA
F6: I/O hantering Typer av I/O i ett datorsystem Memory mapped Port mapped Protokoll för synkronisering Polling Timed Interrupt DMA Drivrutiner 1 Memory mapped I/O enheter avkodas precis som ett minne
EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)
EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7) 1. Motivation ROM. 8kbyte 2 3 2 10 byte 13 Adressbitar [A12,A0] direkt till ROM-kapsel. RWM. 32kbyte 2 5 2 10 byte 15 Adressbitar
Lösningar till tentamen i EIT070 Datorteknik
Lösningar till tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Onsdagen den 13 mars 2013, klockan 14:00 19:00 i Vic 2 A-D, 3 A-C. Tillåtna hjälpmedel: på tentan utdelad
Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration
1 (12) Hur man kompilerar och kör IT++-program med MinGW 1 Sammanfattning Detta dokument visar hur man lätt (med några få extra raders kod) kan få IT++ att bli kompatibelt med kompilatorn MinGW. Med den
Beskrivning av porthantering i mikroprocessorn SAM3U som används på vårt labkort SAM3U- EK.
Tomas Nordström Högskolan i Halmstad Dokumentversion 0.1, 2012-04- 01 Beskrivning av porthantering i mikroprocessorn SAM3U som används på vårt labkort SAM3U- EK. Informationen till detta kompendium är
Tentamen *:58/ID100V Programmering i C Exempel 3
DSV Tentamen *:58/ID100V Sid 1(5) Tentamen *:58/ID100V Programmering i C Exempel 3 Denna tentamen består av fyra uppgifter som tillsammans kan de ge maximalt 22 poäng. För godkänt resultat krävs minst
Programallokering. Programtyper. Att placera program i flashrespektive. Program i FLASH-minne. Program i RAM-minne
Programallokering Att placera program i flashrespektive RAM-minne Program i FLASH-minne Bara lokala variabler Globala oinitierade variabler Globala initierade variabler Program med avbrott Program i RAM-minne
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
Datorteknik 2 (AVR 2)
Namn: Laborationen godkänd: Digitala system 15 hp Datorteknik 2 (AVR 2) LTH Ingenjörshögskolan vid Campus Helsingborg Enkel in- och utmatning. Drivrutiner. Bithantering. I denna laboration ska vi förbättra
Operativsystem ID1200/06 Tentamen :00-18:00
Operativsystem ID1200/06 Tentamen 2018-01-12 14:00-18:00 Instruktioner Du får, förutom skrivmateriel, endast ha med dig en egenhändigt handskriven A4 med anteckningar. Svaren skall lämnas på dessa sidor,
Varför behövs det? I Allegro finns t.ex. stöd för:
Allegro Introduktion Översikt vad är Allegro? Vad är lib och h-fil Kolla kodexempel Strukturen på ett Allegrospel Hur kommer jag igång? Var kan jag läsa mer Addons Alternativ Vad är Allegro? Ett spelprogrammeringsbibliotek
Att använda pekare i. C-kod
Att använda pekare i C-kod (Bör användas av de som känner sig lite hemma med C-programmering!) Rev 1, 2005-11-23 av Ted Wolfram www.wolfram.se Syfte: Man kan tycka att det är komplicerat att använda pekare
Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk
CUDA En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk Minnesareor och minnesaccess Delat minne Exempel CUDA = Compute Unified Device Architecture Utvecklat av NVidia
Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet
Vad händer när man kör ett program? Program och processer När man kompilerar ett program och sedan länkar ihop det så stoppar länkaren in lite extra kod i programmet. Det är denna kod som i sin tur anropar
Digital- och datorteknik
Digital- och datorteknik Föreläsning #19 Biträdande professor Jan Jonsson Institutionen för data- och informationsteknik Chalmers tekniska högskola Normaltillstånd vs undantagstillstånd I normaltillstånd
Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare
Funktionspekare, inledning: funktionsanropsmekanismen Vid funktionsanrop läggs aktuella argumentvärden och återhoppsadressen på stacken, därefter sker ett hopp till adressen för funktionens första instruktion.
Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.
ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 1 of 7 Laboration 4: Knappstuds Drivrutiner för att eliminera störningar. Inledning: Laborationskortet EasyAVR6 har bland annat tryckknappar
Institutionen för elektro- och informationsteknologi, LTH
Datorteknik Föreläsning 5 Realtidssystem och realtidsprogrammering Mål Att du ska förstå hur avbrott används för - Mätning - Styrning - Stöd för körning av flera processer Att du ska förstå begreppet tråd
Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.
Datorteknik Föreläsning 5 Realtidssystem och realtidsprogrammering Mål Att du ska förstå hur avbrott används för - Mätning - Styrning - Stöd för körning av flera processer Att du ska förstå begreppet tråd
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
Algoritmer och Datastrukturer Kary FRÄMLING/Göran PULKKIS (v23) Kap. 7, Sid 1 BINÄRA TRÄD Träd används för att representera olika slags hierarkier som ordnats på något sätt. Den mest använda trädstrukturen
Synkronisering - Semaforen. Om att vänta men inte i onödan
Synkronisering - Semaforen Om att vänta men inte i onödan Dörrvakten Har order uppifrån pga brandregler: Släpp in max 40 personer Garanterar att det aldrig är fler insläppta än order angivit Kommer fler
Föreläsning 3. Programmering, C och programmeringsmiljö
Föreläsning 3 Programmering, C och programmeringsmiljö Vad är programmering? Ett väldigt kraftfullt, effektivt och roligt sätt att kommunicera med en dator Att skapa program / applikationer till en dator
Tentamen. Datorteknik och realtidssystem
Tentamen Datorteknik och realtidssystem, TSEA81 Datum 2017-01-09 Lokal U1 Tid 08-12 Kurskod TSEA81 Provkod TEN1 Kursnamn Datorteknik och realtidssystem Institution ISY Antal frågor 5 Antal sidor (inklusive
TDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Pekare och Listor Eric Elfving Institutionen för datavetenskap 31 oktober 2014 Översikt 2/41 Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor Arbeta
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,
#include <stdio.h> #include <string.h>
#include #include void fun(char s[]) int i=-1; while(s[++i]!=0) if('a'
Effektpedal för elgitarr
EITF11 - Digitala Projekt Effektpedal för elgitarr Handledare: Bertil Lindvall Ivan Rimac (I05) Jimmy Lundberg (I08) 2011-05-10 Contents Bakgrund... 3 Kravspecifikation... 3 Kravspecifikation Effektpedal...
Att skriva till och läsa från terminalfönstret
Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen
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
En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.
2 1 0 / ) - & 9 > ; 7 * ( ) ) En klass behöver både deklaration och definition Deklaration i h (hh) och definition i cc (cpp) Private är förvalt Student::learn() Student::Student() Student::~Student()
CPU. Carry/Borrow IX. Programräknare
Laboration:. Jämförelser mellan assembler och C. CPU ACCA ACCD ACCB 8-bitars ackumulatorer eller 16- bitars ackumulator CCR 1 1 1 SXH I NZVC Flaggregister Carry/Borrow IX IY PC Indexregister X Indexregister
Tentamen PC-teknik 5 p
Tentamen PC-teknik 5 p Namn:. Klass:... Program: Di2, Em3, Et3 Datum: 03-08-15 Tid: 13:30-18:30 Lokal: E171 Hjälpmedel: Linjal, miniräknare, Instruktionsrepertoar för 8086 (utdelas), Lathund, Pacific C
F5: Högnivåprogrammering
F5: Högnivåprogrammering Parameteröverföring Koppling mellan låg- och högnivåprogrammering Lokala variabler Heapen Datatyper 1 Subrutin, parameteröverföring: 1(3) Via register genom värde Skicka data via
Lösningar till tentamen i EIT070 Datorteknik
Lösningar till tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Torsdagen den 13 mars 2014, klockan 14:00 19:00 i MA:10. Tillåtna hjälpmedel: på tentan utdelad formelsamling,
Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser
Innehåll Operativsystem Vad är operativsystem och hur fungerar de Vad är ett OS? Syfte Att tillåta flera program att köra samtidigt Att fungera som ett abstraktionslager mot hårdvaran Att hantera olika
F5: Högnivåprogrammering
1 F5: Högnivåprogrammering Parameteröverföring Koppling mellan låg- och högnivåprogrammering Lokala variabler Heapen Datatyper 1 Subrutin, parameteröverföring: 1(3) Via register genom värde Skicka data
Programsystemkonstruktion med C++
Programsystemkonstruktion med C++ Övning 1 Daniel Aarno bishop@kth.se Översikt övning 1 Kompilering och länkning Makefile Preprocessordirektiv Funktioner Funktionen main() Datatyper Minneshantering Pekare
Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok
Namn: Laborationen godkänd: Laboration 2. Cacheminne Laborationens syfte I laborationen ska du bekanta dig med cacheminnen. Genom laborationen fås kunskap om hur cacheminnen är konstruerade och hur de
Mål. Datorteknik. Introduktion. Innehåll. Verklig situation - pappaledighet. Introduktion (forts)
Mål Datorteknik Föreläsning 4 Att känna till begreppet polling (cyklisk avfrågning) och hur det implementeras Att förstå varför avbrottstyrd exekvering är överlägset polling Att veta vilken information
Övning från förra gången: readword
(9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver
Institutionen för elektro- och informationsteknologi, LTH
Datorteknik Föreläsning 4 Polling och avbrott Mål Att känna till begreppet polling (cyklisk avfrågning) och hur det implementeras Att förstå varför avbrottstyrd exekvering är överlägset polling Att veta
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 - Inbyggda system - Analog till digital signal - Utvecklingssystem, målsystem - Labutrustningen - Uppbyggnad av mikrokontroller - Masinkod, assemblerkod
Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning
Övning 3 i 2D1324 Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning Avancerad c-programering och repetition Typisk h-fil #ifndef special_a
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
Polling (cyklisk avfrågning) Avbrott
Polling (cyklisk avfrågning) Avbrott Större delen av materialet framtaget av :Jan Eric Larsson, Mats Brorsson och Mirec Novak IT-inst LTH Att känna till begreppet polling (cyklisk avfrågning) och hur det
Föreläsning 2. Operativsystem och programmering
Föreläsning 2 Operativsystem och programmering Behov av operativsystem En dator så som beskriven i förra föreläsningen är nästan oanvändbar. Processorn kan bara ges enkla instruktioner såsom hämta data
Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe
Kodningskonventioner Viktor Kämpe Varför kodningskonventioner? Förståelse för Skillnaden mellan lokala/globala variabler. Funktionsargument. Returvärde. Möjliggör Mix av assembler och C. Kodningskonventioner/VK
Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte
CT3760 Mikrodatorteknik Föreläsning 4 Tisdag 2005-09-06 Stacken I datasammmanhang är en stack ett minnesområde. Det är processorn som använder stacken. För att skapa en stack anger man en adress i stackpekarregistret.
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen
Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio
Ditt första C#-program med Visual Studio Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så
Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00
Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen 2019-04-16 14:00-18:00 Instruktioner Du får, förutom skrivmateriel, endast ha med dig en egenhändigt handskriven A4 med anteckningar. Anteckningarna lämnas
Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström
DST 1 Nicholas Wickström IDE, Högskolan i Halmstad 2009 1 Outline 1 Vad är Hårdvara? (Datorsystemmodell; processor m. periferi, IO, Minne) Typiskt för hårdvarunära programmering (datablad, register, datastrukturer,...)
In- och utenheter. Händelsebaserad programmering i GLUT. Interrupt-baserad interaktion. Sampling / polling. Händelsebaserad interaktion (forts.
Den första datormusen Douglas Englebart, 1968. programmering i GLUT Gustav Taxén CID gustavt@nada.kth.se In- och utenheter Alla datorsystem har in- och utenheter som behandlar information. Data skickas
Repetition C-programmering
Repetition 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. Repetition
Datorsystemteknik Föreläsning 7DAVA14
Datorsystemteknik Föreläsning 7DAVA14 Innehåll Introduktion (forts) Polling (cyklisk avfrågning) Större delen av materialet framtaget av :Jan Eric Larsson, Mats Brorsson och Mirec Novak IT-inst LTH Exempel
Demonstration och konsultation Arbetsbokens avsnitt 7 Händelsestyrt processbyte Förberedande inför laboration 4
Avbrott Demonstration och konsultation Arbetsbokens avsnitt 7 Händelsestyrt processbyte Förberedande inför laboration 4 Demonstrationsövning 5 1 Arbetsbok avsnitt 7: Undantag, avbrott - Uppgift 41 + enable_interrupt
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära
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
Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe
Fortsä'ning Pekare Ulf Assarsson Originalslides av Viktor Kämpe Pekare och Arrayer/VK 2 Pekare och Arrayer/VK 3 Förra föreläsningen Pekare Bll data Arrayer fix storlek och adress Dynamisk minnesallokering
Övningsuppgifter STYRNING - i Mikrodatorteknik för U2 2010
STYRNING - i Mikrodatorteknik för U2 2010 1. Uppgift M10 (5p) aug-09 Skriv ett program i PIC-assembler som - gör PortB till utport - ettställer bit 0, 3 och 4 i PortB - nollställer bit 5 och 6 i PortB
Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal
Tentamen Datorteknik och realtidssystem, TSEA81 Datum 2018-04-0 Lokal G6 Tid 14-18 Kurskod TSEA81 Provkod TEN1 Kursnamn Datorteknik och realtidssystem Institution ISY Antal uppgifter 5 Antal sidor 16 (inklusive
Avancerad SSL-programmering II
Tekn.dr. Göran Pulkkis Överlärare i Datateknik Avancerad SSL-programmering II 1 Innehåll Makron för generisk stackhantering Hantering av konfigureringsfiler Certifikathantering 2 1 Makron för generisk
Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00
Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp 2018-04-03 14:00-18:00 Omtentander på ID2200 TEN1 3.8 hp och ID2206 TEN1 4.5 hp skall inte skriva denna tentamen! Instruktioner Du får, förutom
F4. programmeringsteknik och Matlab
Programmeringsspråk Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer 1 Ett program är en eller flera instruktioner
Svar till Övning3 Datorteknik, HH vt12 Avbrott och timers
Svar till Övning3 Datorteknik, HH vt12 Avbrott och timers Avbrott generellt F7.1. Avbrott sköts med hårdvara i processorn, man läser av hårdvarumässigt. Polling är en enklare princip för I/O- hantering.
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.
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,
Tentamen i TDP004 Objektorienterad Programmering Praktisk del
Tentamen i TDP004 Objektorienterad Programmering Praktisk del Datum: 2011-04-28 Tid: 08-12 Plats: SU-salar i B-huset. Jour: Per-Magnus Olsson, tel 281456 Jourhavande kommer att besöka skrivsalarna ungefär
732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning
Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (
TDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Strömmar, externa filer och kommandoradsargument Eric Elfving Institutionen för datavetenskap 7 oktober 2015 Översikt 2/32 Strömmar Kommandoradsargument Jämförelseoperatorer
Arduinokurs. Kurstillfälle 4
Kurstillfälle 4 CW-generering Det här kan ses som överkurs men kan ändå vara roligt för att kunna generera CW på ett enkelt sätt. Det blir en hel del nytt men vi tar det steg för steg Som alla vet gäller
Datorteknik ERIK LARSSON
Datorteknik ERIK LARSSON Inledning Ken Thompson och Dennis M. Ritchie utvecklade C Turingpriset( Nobelpris i datavetenskap ), 1983 Alan Turing (1912-1954) För deras utveckling av generell OS teori och
Typkonvertering. Java versus C
Typer Objektorienterad programmering E Typkonvertering Typkonvertering Satser: while, for, if Objekt Föreläsning 2 Implicit konvertering Antag att vi i ett program deklarerat int n=3; double x = 5.2; Då
TDDC74 Lab 04 Muterbara strukturer, omgivningar
TDDC74 Lab 04 Muterbara strukturer, omgivningar 1 Översikt I den här laborationen kommer ni att lära er mer om: Tillstånd, och skillnader mellan ren funktionell programmering och imperativ. Skillnaden
Synkronisering. Ordning och reda
Synkronisering Ordning och reda Banköverföring struct account { int balance; char* owner; }; struct account account[ NUM_ACCOUNTS ]; bool transfer( int amount, unsigned from, unsigned to ); 2 Banköverföring
Assemblerprogrammering - fördjupning
Assemblerprogrammering - fördjupning Ur innehållet: Trampoliner tabellerade funktionsadresser Aktiveringspost med ARM Cortex M4 Mer om parameteröverföring Registerspill Kodgenerering - ISA "Kodoptimering"
Systemnära programmering 2012-11-05. Tentamen. Systemnära programmering, 7.5hp 5 november 2012
Tentamen Systemnära programmering, 7.5hp 5 november 2012 Skrivtid: 9 13 Hjälpmedel: EN av följande böcker Bilting & Skansholm: Vägen till C ELLER J.R. Hanly & E.B. Koffman: C Program Design for Engineers
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
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
Filer och structer Del 2
Filer och structer Del 2 Agenda: Typedef Alternativ strängläsning från fil Binära data Lagra Läsa Oväntat slut på input Spara till nästa programstart Typedef Kan användas till att sätta ett eget namn på
Lösningar till tentamen i EIT070 Datorteknik
Lösningar till tentamen i EIT070 Datorteknik Institutionen för Elektro- och informationsteknik, LTH Onsdagen den 7 mars 2012, klockan 14:00 19:00 i Vic 2, 3. Tillåtna hjälpmedel: på tentan utdelad formelsamling,
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
Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.
Programmering med Java Programmering med Java Programspråket Java Källkodsexempel Källkod Java API-exempel In- och utmatning Grunderna Ann Pan panda@nada.kth.se Rum 1445, plan 4 på Nada 08-7909690 Game.java
Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013
1 of 7 Örebro universitet Institutionen för naturvetenskap och teknik Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se) Tentamen i Programmering grundkurs och Programmering C för D1 m fl, även distanskursen
MESI i Intel Core 2 Duo
MESI i Intel Core 2 Duo Sammanfattning Denna rapport beskriver en processor (Intel Core 2 Duo) vars cache coherence protokoll är MESI. Rapporten beskriver hur processorn är uppbyggd, hur många kärnor den
Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.
Namn: Laborationen godkänd: Digitala system 15 p Datorprojekt, del 2 L T H I n g e n j ö r s h ö g s k o l a n v i d C a m p u s H e l s i n g b o r g Projektlaboration 2, skrivning till LCD. Förberedelser: