ESP30076 임베디드시스템프로그래밍 (Embedded System Programming)
|
|
|
- Thorvald Strøm
- 7 år siden
- Visninger:
Transkript
1 Module 14: Kernel Timer ESP30076 임베디드시스템프로그래밍 (Embedded System Programming) 조윤석 전산전자공학부
2 주차별목표 리눅스에서커널타이머사용법알아보기 HZ, jiffies_64, struct timer_list 커널타이머를활용한하드웨어제어용디바이스드라이버작성 2
3 Timer 관련변수 HZ 리눅스커널에서주기적으로발생하는시스템타이머 interrupt 횟수 1 초에 HZ 상수값만큼발생 ( 예 ) HZ=100, 1 초에 system timer interrupt 100 번발생 #include <linux/timer.h> #define HZ 100 // <asm/param.h> jiffies_64 리눅스커널에서제공하는 global variable 커널전체에서동일한기준시간값제공 Scheduling 구현을위해 timer interrupt 가필요하고, 리눅스커널은 HZ 라는상수값을초기에설정함 3
4 get_jiffies_64() Timer interrupt 관련 HZ: 1 초당발생되는 timer interrupt 횟수 USER_HZ: HZ 값을보정하는수 jiffies: 커널 2.4 에서초당 HZ 값만큼증가하는전역변수 jiffies_64: 커널 2.6 에서초당 HZ 값만큼증가하는전역변수 get_jiffies_64(): jiffies_64 값을참조하기위한함수 HZ ARM: 100/128/200/1000 i386: 1000 x86-64: 1000 MIPS: 100/128 4
5 Timer API struct timer_list #include <linux/timer.h> struct timer_list { /*... */ unsigned long expires; void (*function)(unsigned long); unsigned long data; ; Kernel drivers with a number of functions to declare, register, and remove kernel timers void init_timer(struct timer_list *timer); struct timer_list TIMER_INITIALIZER(_function, _expires, _data); void add_timer(struct timer_list * timer); int del_timer(struct timer_list * timer); 5
6 timer_list <linux/timer.h> struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct list_head entry; unsigned long expires; /* the timeout, in jiffies */ struct tvec_base *base; void (*function)(unsigned long); /* handler of the timeout */ unsigned long data; /* argument to the handler */ ; int slack; 6
7 일정주기로 LED 점멸되는드라이버작성 LED 구동시나리오 응용프로그램의인자가 1 8개의 LED가 0.5초단위로지속적으로점멸됨 #./test_timer_led 1 응용프로그램의인자가 0 파일명 모든 LED를끔 #./test_timer_led 0 응용프로그램 : test_timer_led.c 디바이스드라이버 : led_timer_driver.c 디바이스노드 : /dev/led_timer_device Major number: 247 7
8 구조체정의 Timer 로구동되는 LED 관리구조체 KERNEL_TIMER_STRUCT type struct { struct timer_list timer; unsigned long led_state; attribute ((packed)) KERNEL_TIMER_STRUCT; ptimermgr: LED 상태와 timer 를관리하기위한구조체 led_state 는 LED 점멸을결정하기위한상태변수값임 Timer handler 에 argument 를 timer 구조체주소로지정하는데, LED 점멸을위해 led 상태값 ( 여기서는 led_sate 임 ) 도같이보내기위해추가구조체를생성하고, 그구조체주소값을 argument 로보냄 8
9 흐름도 % insmod led_timer_driver.ko led_timer_init() - register_chrdev() - ioremap() - ptimermgr 선언 - init ptimermgr - led_timer_register() led_timer_register() - init_timer() - add_timer() led_timer_timeover() - LED blinking if led_blink=1 - LED off if led_blink=0 - led_timer_register() led_timer_exit() - LED turn off - del_timer() - kfree(ptimermgr) - iounmap() - unregister_chrdev() 사용자 system call write(fd, arg, count) - led_blink = arg(0 or 1) % rmmod led_timer_driver 9
10 타이머연동 LED 구동디바이스드라이버 (led_timer_driver.c) mkdir /root/work/dd/kernel_timer_led cd /root/work/dd/kernel_timer_led vi led_timer_driver.c /* LED Kernel Timer Example FILE: led_timer_driver.c */ #ifndef LED_KERNEL_TIMER_DRIVER_ #define LED_KERNEL_TIMER_DRIVER_ #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/module.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/slab.h> /* kmalloc() */ #include <linux/timer.h> /* HZ */ typedef struct { struct timer_list timer; unsigned long led_state; attribute ((packed)) KERNEL_TIMER_STRUCT; #endif 10 #define DEV_NAME "led_timer_device" #define IOM_LEDTIMER_MAJOR_NUM 247 #define IOM_LED_ADDRESS 0xA #define TIME_STEP (5*HZ/10) /* 0.5 sec */ #define BLINK_MODE 1
11 led_timer_driver.c (2) static int ledport_usage = 0; static unsigned char *iom_led_addr; static KERNEL_TIMER_STRUCT *ptimermgr = NULL; static unsigned char led_blink = 0; MODULE_LICENSE("GPL"); MODULE_AUTHOR("HGU"); int led_timer_init(void); void led_timer_exit(void); module_init(led_timer_init); module_exit(led_timer_exit); void led_timer_timeover(unsigned long arg); /* timer.function */ void led_timer_register(kernel_timer_struct *pdata, unsigned long timeover); int led_timer_open (struct inode *, struct file *); int led_timer_release (struct inode *, struct file *); ssize_t led_timer_write (struct file *, const char user *, size_t, loff_t *); struct file_operations led_timer_fops = {.owner = THIS_MODULE,.open = led_timer_open,.release = led_timer_release,.write = led_timer_write, ; 11
12 led_timer_driver.c (3) int init led_timer_init(void) { int major_num; major_num = register_chrdev(iom_ledtimer_major_num, DEV_NAME, &led_timer_fops); if ( major_num < 0 ) { printk(kern_warning"%s: can't get or assign major number %d\n", DEV_NAME, IOM_LEDTIMER_MAJOR_NUM); return major_num; printk("success to load the device %s. Major number is %d\n", DEV_NAME, IOM_LEDTIMER_MAJOR_NUM); iom_led_addr = ioremap(iom_led_address, 0x1); ptimermgr = kmalloc(sizeof(kernel_timer_struct), GFP_KERNEL); /* GFP_KERNEL: Normal allocation of kernel memory. May sleep */ /* GFP_KERNEL: GFP_WAIT( 스케줄러선점가능 ), GFP_IO( 물리적 IO 가능 ), GFP_FS( 저수준 filesystem IO 가능 ) */ if ( ptimermgr == NULL ) return -ENOMEM; memset(ptimermgr, 0, sizeof(kernel_timer_struct)); // GFP_KERNEL GFP_ZERO (Kernel 2.6 가능 ) led_timer_register(ptimermgr, TIME_STEP); return 0; 12
13 led_timer_driver.c (4) void led_timer_register(kernel_timer_struct *pdata, unsigned long timeover) { /* init_timer(&timer) */ init_timer(&(pdata->timer)); /* timer API: void init_timer(struct timer_list *timer) */ pdata->timer.expires = get_jiffies_64() + timeover; pdata->timer.function = led_timer_timeover; /* handler of the timeout */ pdata->timer.data = (unsigned long) pdata; /* argument to the handler */ add_timer(&(pdata->timer)); void led_timer_timeover(unsigned long arg) { KERNEL_TIMER_STRUCT *pdata = NULL; pdata = (KERNEL_TIMER_STRUCT *) arg; if(led_blink == BLINK_MODE) { /* blink */ pdata->led_state = ~(pdata->led_state); if(pdata->led_state!= 0) outb(0x00, (unsigned int)iom_led_addr); else outb(0xff, (unsigned int)iom_led_addr); else outb(0xff, (unsigned int)iom_led_addr); /* turn off LED */ led_timer_register(pdata, TIME_STEP); 13
14 led_timer_driver.c (5) int led_timer_open (struct inode *inode, struct file *filp) { if(ledport_usage) return -EBUSY; ledport_usage = 1; return 0; int led_timer_release (struct inode *inode, struct file *filp) { ledport_usage = 0; return 0; ssize_t led_timer_write (struct file *filp, const char user *buf, size_t count, loff_t *f_pos) { if (copy_from_user(&led_blink, buf, count)) return -EFAULT; return count; void exit led_timer_exit(void) { outb(0xff, (unsigned int)iom_led_addr); /* LED turn off */ if(ptimermgr!= NULL ) { del_timer(&(ptimermgr->timer)); kfree(ptimermgr); iounmap(iom_led_addr); unregister_chrdev(iom_ledtimer_major_num, DEV_NAME); 14
15 타이머연동 LED 구동응용프로그램 (test_timer_led.c) vi test_timer_led.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define DEV_NAME "/dev/led_timer_device" int main(int argc, char **argv) { int led_fd; unsigned char led_blink; if ( argc!= 2 ) { printf("usage: %s [0 or 1] (0: all LED OFF, 1: LED blinking)\n", argv[0]); return -1; led_fd = open(dev_name, O_WRONLY); if ( led_fd < 0 ) { printf("led timer driver open error...\n"); return -1; 15
16 test_timer_led.c (2) led_blink = (unsigned char) atoi(argv[1]); printf("{a input: %d\n", led_blink); write(led_fd, &led_blink, sizeof(led_blink)); close(led_fd); return 0; 16
17 컴파일 % vi Makefile CC = arm-linux-gcc KDIR = /root/download/kernel obj-m = led_timer_driver.o PWD = $(shell pwd) TEST_TARGET = test_timer_led TEST_SRCS = $(TEST_TARGET).c all: module test_pgm module: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules test_pgm: $(CC) $(TEST_SRCS) -o $(TEST_TARGET) clean: rm -rf *.ko *.o rm -rf *.symvers *.order *mod.c *.cmd rm -rf $(TEST_TARGET) % make 17
18 실행 타겟보드에서실행 Host 컴퓨터의 /root 디렉토리를 NFS 로연결 # cd /root/nfs/work/dd/kernel_timer_led # insmod led_timer_driver.ko # mknod /dev/led_timer_device c #./test_timer_led 1 #./test_timer_led 0 18
Styresystemer og tjenester
Styresystemer og tjenester Indhold: 1. Introduktion til styresystemer 2. Processer og tråde 3. Synkroniseringsmetoder og IPC 4. Memory management 5. IO og devicedrivere 6. Analyse og design af embedded
Systemkald i Unix/Linux
Systemkald i Unix/Linux 1 Operativsystemet Fra proces: OS som værktøjskasse: tilgængelig via systemkald... OS som resurseadministrator, abstrakt/virtuel maskine: CPU: processer, tråde, schedulering I/O:
DM14-1. Obligatorisk opgave F.06. System Call. Jacob Aae Mikkelsen Ingen andre gruppe medlemmer. 6. marts 2005
- 1. Obligatorisk opgave F.06 System Call Jacob Aae Mikkelsen - 191076 Ingen andre gruppe medlemmer 6. marts 2005 1 Indhold 1 Opgave beskrivelse 2 2 Analyse 2 2.1 Hukommelses allokering.....................
Principper for Samtidighed og Styresystemer
Principper for Samtidighed og Styresystemer Kursusgang 12: Device drivere [email protected] Ph.D.-studerende Distribuerede og Indlejrede Systemer Institut for Datalogi Aalborg Universitet 17. maj 2010 Intro
Processer og tråde. dopsys 1
Processer og tråde dopsys 1 Motivation.. parallelle processer udnytter hardwaren bedre: Batch operativsystemer (50 erne) hhv. små systemer: Multiprogrammering og time-sharing (fra 60 erne og frem): dopsys
Operativsystemer - dopsys
Operativsystemer - dopsys Erik Ernst [email protected] dopsys 1 Q/A Mange deltagere er nu på 2. år af datalogistudiet, med dcomnet 1 for år siden Er din baggrund anderledes? dopsys 2 Praktiske oplysninger
Asus computer og hvad man kan gøre ved den. For flere år siden købte jeg en lille maskine der hed Asus Eee Pc 900.
Asus computer og hvad man kan gøre ved den. For flere år siden købte jeg en lille maskine der hed Asus Eee Pc 900. Den kørte med et Linuxsystem, som jeg ikke kunne få til at virke godt, så jeg brændte
Programmering i C. Lektion 4. 5. december 2008
Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )
Systemkald DM14. 1. Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111
DM14 1. Obligatoriske opgave Systemkald Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/3-2004 Afleveret af: Jacob Christiansen, 130282-2111 Side 1 af 5 Intro: Formålet med opgaven at et lave en system kald
Introduktion til C programmering
Introduktion til C programmering Rasmus Erik Voel Jensen Uge 17 [email protected] Dagens forelæsning Formalia Indledende programmering, main, include, printf, variable, scanf, if-else, statements, eksempler
Metoder og værktøjer til programmering
Metoder og værktøjer til programmering Hjemmeside http://www.control.aau.dk/~jal/mvp.php Spørgsmål vedrørende kurset: [email protected] Metoder og værktøjer til programmering Kursusgange: Brugergrænseflader
Delay(100); Man skriver fx blot delay(100); for at få Microcontrolleren til at vente 100 ms inden programmet fortsætter.
Funktionen delay() Funktionen delay() er ofte praktisk at bruge i et program i Arduino-verdenen. Man skriver fx blot delay(100); for at få Microcontrolleren til at vente 100 ms inden programmet fortsætter.
Erklæring af variabler. Void indstil (Indstiller starttidspunkt og måleinterval).
Indholdsfortegnelse til Bilag 1.: Side 1: Include filer. Side 1: Erklæring af variabler. Side 2: Void indstil (Indstiller starttidspunkt og måleinterval). Side 3: Void indstil (Indstiller starttidspunkt
Programmering i C Programmering af microcontroller i C (4 af 4) 12. april 2007
Programmering i C Programmering af microcontroller i C (4 af 4) 12. april 2007 Mads Pedersen, OZ6HR [email protected] Plan i dag Afrunding af OZ3VB's program Fra "almindelig C" til "microcontroller C" Lighederne
//--------------------------------- Definition af porte og funktioner -------------------------
Temeraturmåler (C-program).txt // Initialiserings-sekvens #include #pragma model=medium #pragma code=0x0000 #pragma xdata=0x4000 #pragma asm=on #pragma parameters=register //#define display P4
Internt interrupt - Arduino
Programmering for begyndere Brug af Arduino Internt interrupt - Arduino - Afslutning EDR Hillerød Knud Krogsgaard Jensen / OZ1QK 1 Intern interrupt Jeg vil rydde lidt op. Her er nogle punkter vil har glemt
Netværk & elektronik
Netværk & elektronik Oversigt Ethernet og IP teori Montering af Siteplayer modul Siteplayer teori Siteplayer forbindelse HTML Router (port forwarding!) Projekter Lkaa Mercantec 2009 1 Ethernet På Mars
Fra programmering til mikroprocessor
Programmering for begyndere Brug af Arduino Fra programmering til mikroprocessor EDR Hillerød Knud Krogsgaard Jensen / OZ1QK 1 Start på Arduino og programmering Programmerings kursus Sidste gang (Introduktion)
Maskinarkitektur. Lars Kristensen [email protected]. Christian Storm [email protected]. dmasark 1
Maskinarkitektur Lars Kristensen [email protected] Christian Storm [email protected] dmasark 1 Praktiske oplysninger http://www.daimi.au.dk/dmasark dmasark 2 Forelæsninger Tirsdag 12.15-14.00, Store Aud,
Kursusarbejde 2 Grundlæggende Programmering
Kursusarbejde 2 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 31. oktober 2003 Indhold 1. Kode 2 1.1. hotel.h.................................................... 2 1.2. hotel.cc...................................................
Pentium IA-32 Maskinarkitekturen
Pentium IA-32 Maskinarkitekturen 1 Historie (1) Starter i 1970 med udviklingen af Intel 4004: 2 Historie (2) Baglæns kompatibilitet tilbage til 8086. 3 Intel 4004 and Pentium 4 http://www.intel.com/museum/archives/index.htm
Karaktergivende rapportopgave i Styresystemer og multiprogrammering
Karaktergivende rapportopgave i Styresystemer og multiprogrammering 1. marts 2005 Den karaktergivende rapportopgave i Styresystemer og multiprogrammering stilles tirsdag den 1. marts 2004 og skal afleveres
Brug af digitale ind og udgange
Programmering for begyndere Brug af Arduino Programmeringskursus Brug af digitale ind og udgange Oversigt over aftenen Digitale ind- og udgange Det er der ikke så meget i: Digitale indgange kan tænde og
Computere og Netværk (dcomnet)
Computere og Netværk (dcomnet) http://www.cs.au.dk/dcomnet Jens Kargaard Madsen ([email protected]) Jens Bennedsen ([email protected]) dcomnet 1 Computere og netværk Beskrivelse At give den studerende kendskab til computere
Rigtig SQL Programmering
Rigtig SQL Programmering 1 SQL i Rigtige Programmer Indtil nu har vi brugt SQL direkte i kommandolinje promt/gui program, hvor vi kan lave forespørgsler til databasen I virkeligheden: Programmer kontakter
MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.
Denne guide er oprindeligt udgivet på Eksperten.dk MySQL C API Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab
1 Indholdsfortegnelse.
ET106 Ringsted Tekniske Skole 21. maj 1999 1 Indholdsfortegnelse. 1 Indholdsfortegnelse. 2 2 Indledning. 3 3 Generelt om DSP. 3 4 Om EZ-kittet. 4 5 Signalbehandling. 5 5.1 Indgangs lavpasfilter. 5 5.2
Introduktion til Operativsystemer
Introduktion til Operativsystemer 1 Niels Olof Bouvin Institut for Datalogi Aarhus Universitet Oversigt Formål Hvad er en computer? Operativsystemets rolle Multitasking 2 Formål Introduktion af de basale
DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index
DET KONGELIGE Index Download driver... 2 Find the Windows 7 version.... 2 Download the Windows Vista driver.... 4 Extract driver... 5 Windows Vista installation of a printer.... 7 Side 1 af 12 DET KONGELIGE
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) int wmid, wmevent; PAINTSTRUCT Introduktion ps; til HDC hdc; programmering med switch (message) case WM_COMMAND: wmid = LOWORD(wParam);
Mikroarkitektur. Niels Olof Bouvin Institut for Datalogi Aarhus Universitet
Mikroarkitektur Niels Olof Bouvin Institut for Datalogi Aarhus Universitet 1 Level 1: Mikrokode niveauet Level 5 Problem-oriented language level Translation (compiler) Level 4 Assembly language level Translation
Hvad er et distribueret objekt? Plan 12.3. Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation
Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Hvad er et
VMware og dopsys-linux
VMware og dopsys-linux 1 Virtuel maskine: OS Hardware Virtualisering: Resurser deles mellem processer: En virtuel maskine er til rådighed for hver proces. Virtualisering nu dybere: hver proces hvert OS.
Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune
Værktøjer fra værktøjskassen Søren Breddam, Stevns Kommune [email protected] 1stevns kommune Mapbasic i Stevns Kommune Data Kørsel af planlagte opgaver, så data altid er opdaterede. Logfil til overvågning Dagligt
Hvordan vælger jeg dokumentprofilen?
Hvordan vælger jeg dokumentprofilen? Valget af OIOUBL profil i en konkret dokumentudveksling vil bl.a. afhænge af, hvilke OIOUBL profiler den anden part i udvekslingen understøtter. Et konkret eksempel
F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank
F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank 03-10-2018 Rune Ibsen Softwareudvikling Seniorkonsulent Mentoring 10 konsulenter F# Programmeringssprog som oversættes til.net Functional-first,
Interrupt - Arduino. Programmering for begyndere Brug af Arduino. Kursusaften 6 EDR Hillerød Knud Krogsgaard Jensen / OZ1QK
Programmering for begyndere Brug af Arduino Programmeringskursus Interrupt - Arduino EDR Hillerød Knud Krogsgaard Jensen / OZ1QK Interrupts Programmeringskursus Genbrug Interrupts Betyder blot at man afbryder
Softwareudvikling: Miljøer
Softwareudvikling: Miljøer Præsentation af mig Praktiske oplysninger Overblik Host-target setup UNIX, historisk UNIX egenskaber UNIX ulemper UNIX, netværk, X11, brugerflader Windows fordele/ulemper Øvelse
Programmering i C Intro og grundlæggende C 5. marts 2007
Programmering i C Intro og grundlæggende C 5. marts 2007 Mads Pedersen, OZ6HR [email protected] Plan for kurset Ma. 5/3: Ma. 19/3: Ma. 2/4: To. 12/4: Formål, intro, grundlæggende Videre, sprogkonstruktioner
Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/11-2012
Server side Programming Wedesign Forelæsning #8 Recap PHP 1. Development Concept Design Coding Testing 2. Social Media Sharing, Images, Videos, Location etc Integrates with your websites 3. Widgets extend
Sådan forbindes Arduinoen via et fumlebræt til ATTiny45 chippen.
Arduino software: https://www.arduino.cc/en/main/software Klaus modeltog, det levende hus: http://www.moppe.dk/levhusel.html TV simulation: http://www.herberts-n-projekt.de/basteleien-1/belebtes-haus/
Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22.
Klasser og Objekter i Python Uge 46 Learning Python: kap 15-16, 19-22. Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. En kage form Klassens
Python programmering. Per Tøfting. MacFest
Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer
Modbus data modellen er opbygget af fire primære data typer. I nedenstående skema er en kort oversigt over disse.
Modbus RTU protokol Indledning Modbus er en application layer messaging protocol, placeret på 7. lag i OSI modellen, der sørger for client/server kommunikation mellem enheder koblet på forskellige typer
Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1
Project Step 7 Behavioral modeling of a dual ported register set. Copyright 2006 - Joanne DeGroat, ECE, OSU 1 The register set Register set specifications 16 dual ported registers each with 16- bit words
