timer programming in linux -...

61
Embedded System Lab. II Timer Programming in Linux Timer Programming in Linux 경희대학교 컴퓨터공학과 조진성

Upload: others

Post on 27-Dec-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II

Timer Programming in LinuxTimer Programming in Linux

경희대학교 컴퓨터공학과

조 진 성

Page 2: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 1

주요내용

주요내용

타이머 일반

리눅스 시스템에서의 타이머 처리

PXA255기반 시스템에서의 타이머 처리

타이머 프로그래밍 예제

PXA255에서 타이머 관련 레지스터

Page 3: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 2

타이밍 측정의 중요성

운영체제를관리하는대부분의커널함수가시간의흐름에따라동작

대부분의커널함수가이벤트기반(event-driven)이아닌시간기반(time-driven) 조절방식더정확히말하면 time-driven 방식은시간을이벤트로하는 event-driven 방식이라고도할수있음

타이밍측정은타이머인터럽트를통하여해결하고타이머인터럽트핸들러에서모든커널동작시간을조율

Page 4: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 3

하드웨어 클럭

RTC(Real Time Clock)RTC는시스템시간을저장하는비휘발성장치시스템전원이꺼져있을때도배터리로시간유지

CPU를비롯한다른모든칩과무관하게동작하는하드웨어장치

부팅이될때커널초기화시 RTC에서시간을읽어현재시간을관리하는 xtime구조체변수에저장

리눅스에서의 RTC날짜와시간을알아내는용도

/dev/rtc장치파일을통해프로세스가 RTC를프로그래밍할수있도록허용

Page 5: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 4

PIT(Programmable Interrupt Timer)시스템타이머

타이밍측정장치(타이밍의토대가되는하드웨어장치)PIT를이용하여커널이현재날짜와시간을유지커널은 PIT 장치를프로그램하여미리정해진고정주파수로인터럽트를계속발생(프로그램가능한하드웨어장치)틱(tick) 타이머인터럽트발생간격

틱을통해커널이현재시각과시스템가동시간을유지

시스템과관련하여모든동작시간을조율

커널이시간간격을추적하는방법

tick의값을 tick 변수에저장100Hz(10ms)마다한번씩 IRQ0에타이머인터럽트발생(예)

Page 6: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 5

타이머 인터럽트의 진동수(Tick Rate)

HZ시스템타이머의진동수는시스템의부팅시에미리정의된

preprocessor인 HZ에의해정해짐

<arm/param.h>에정의

Architecture에따라정의되어있는값이다름

현재대부분의플랫폼에서 100HZ 로정의됨

커널의시간개념은전적으로시스템타이머의주기성에달려있음

(적절한시스템타이머의주기값이중요)

// arm 아키텍처인경우

#define HZ 100

Page 7: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 6

아키텍처별 진동수

아키텍처 진동수(HZ)

alphaarmcrish8300i386ia64m68km68knommumipsmips64pariscppcppc64s390shsparcsparc64umv850x86-64

1024100100100100032 or 102410050,100, or 1000100100100 or 1000100100010010010010010024, 100, or 1221000

Page 8: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 7

HZ 값에 따른 장/단점

HZ 값이높을경우장점(짧은 tick)타이머인터럽트의해상도가높아지고결과적으로모든시간관련이벤트가높은해상도를가짐

시간관련이벤트의정확도가높아짐

poll(), select() 같이타임아웃값을받아들일수있는시스템콜을더높은정밀도로실행

자원사용현황이나시스템가동시간과같은측정값이더높은해상도로기록

프로세스선점이보다정확하게처리됨

HZ 값이높을경우단점진동수가높으면인터럽트가자주발생하여프로세서가타이머인터럽트핸들러를실행하는데더많은시간을소비해야하므로많은부하가

발생

다른작업에할당되는프로세스시간이감소

Page 9: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 8

jiffies

부팅될때커널은 jiffies값을 0으로초기화타이머인터럽트발생할때마다 jiffies값증가전역변수인 jiffies는시스템이부팅된이후발생한틱의수를저장<linux/jiffies.h>에정의되어있음

extern unsigned long volatile jiffiesJiffies/HZ seconds = system uptime1 jiffies = 1/HZ 초초를 jiffies로변환하는공식

(second * HZ)jiffies를초로변환하는공식

(jiffies / HZ)

Page 10: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 9

Jiffies overflow

32비트 jiffies100 HZ일경우 497일후에 overflow1000 HZ일경우 49.7일후에 overflow

64비트 jiffies사람의일생동안 overflow가발생하지않음64비트를사용하는 ALPHA는 5 억년동안사용가능리눅스커널 2.6 에서변수 jiffies자료형은unsigned long 에서 u64로변경

extern u64 jiffies_64;몇가지특별한링커스크립트(linker scripts)를사용하여기존jiffies 변수를새로운 jiffies_64 변수에 overlay하여호환성유지

Page 11: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 10

Jiffies wraparound

틱(tick) 카운트는최대값에서 1만큼증가되면다시 0으로되돌아가기때문에틱의되돌림을정확히고려할수있는 4 가지매크로를사용

<linux/jiffies.h>에정의되어있음#define time_after(unknown, known) ((long)(known) – (long)(unknown) < 0)#define time_before(unknown, known) ((long)(unknown) – (long)(known) < 0)#define time_after_eq(unknown, known) ((long)(unknown) – (long)(known) >= 0)#define time_before_eq(unknown, known) ((long)(known) – (long)(unknown) >= 0)

// 0.5초후에타임아웃unsigned long timeout = jiffies + HZ/2;

If (timeout < jiffies) {/* not time out*/

} else {/*time out*/

}

// 0.5초후에타임아웃unsigned long timeout = jiffies + HZ/2;

If ( time_after(jiffies, timeout) ) {/* not time out*/

} else {/*time out*/

}

잠재적인 overflow 문제 소지 잠재적인 overflow 문제 해결

Page 12: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 11

타이머 인터럽트 핸들러

타이머인터럽트핸들러는아키텍처종속적인부분과독립적인부분으로나누어짐

아키텍처종속적인부분은시스템타이머의인터럽트로등록되며타이머인터럽트가발생할때실행

정확한작업내역은아키텍처에따라다르지만대부분의핸들러는다음과같은일수행

xtime_lock록얻음Jiffies_64에대한접근과현재시각값인 xtime을보호

필요에따라시스템타이머를승인하거나초기화

주기적으로현재시각을갱신하여실시간클럭에저장

아키텍처독립적인타이머루틴 do_timer()를호출xtime_lock록해제

Page 13: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 12

타이머 인터럽트 핸들러(2)

아키텍처독립적인부분인 do_timer()의역할Jiffies_64 값을 1만큼증가값을사용하기전에 xtime_lock록을잠그기때문에 32비트아키텍처에서도안전

현재실행중인프로세스에대해시스템및유저시간소비량과같은자원사용현황을갱신

만료된동적타이머가있다면다시실행

scheduler_tick()을실행xtime에저장된현재시각을갱신악명높은부하평균(load average) 계산

Page 14: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 13

타이머 인터럽트 핸들러(3)

user_mode() 매크로는프로세서레지스터인 regs의상태를검사유저공간에서타이머인터럽트가발생했으면 1을, 커널모드에서인터럽트가발생했으면 0을 returnupdate_process_times()로하여금이전의타이머틱이유저와커널모드중어디에서일어났는지알수있도록하는역할

/* 실제함수는다음과같이간단함 *//* 대부분의작업이다른함수에서처리됨 */void do_timer(struct pt_regs* regs){

jiffies_64++;update_process_times(user_mode(regs));

/* 현재시각을갱신 */update_times();

}

Page 15: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 14

현재 시각

xtime변수를사용하려면 xtime_lock록을얻어야하는데이것은일반적인스핀록이아닌 seq록으로구현되어있음xtime을갱신하는방법

xtime을읽기위한방법

write_seqlock(&xtime_lock);/* xtime갱신 */write_sequnlock(&xtime_lock);

do {unsigned long lost;seq = read_seqbegin (&xtime_lock);usec = timer->get_offset();lost = jiffies – wall_jiffies;if (lost)

usec += lost * (1000000 / HZ);sec = xtime.tv_sec;usec += (xtime.tv_nsec / 1000);

} while (read_seqretry(&xtime_lock, seq));

이 loop는 writer가 없는 상태에서reader가 데이터를 읽을 때까지반복만약 loop가 진행되는 동안 타이머인터럽트가 발생하여 xtime이갱신된다면, return 되는 시퀀스번호가 유효하지 않게 되므로loop는 계속 반복된다.

Page 16: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 15

현재 시각(2)

현재시각(wall time)은 <kernel/time.c>에정의되어있음struct timespec xtime;

timespec자료구조의정의<linux/time.h>

xtime.tv_sec값에는 1970년 1월 1일(UTC)부터지금까지의시간이초단위로저장 -에포크(epoch : 신기원)라부름대부분의유닉스시스템에서의현재시각은바로이에포크를기준으로한상대적인날짜를의미

xtime.v_nsec값은마지막초이후에경과된나노초값

struct timespec {time_t tv_sec; // 초long tv_nsec; // 나노초

};

Page 17: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 16

현재 시각(3)

유저공간에서현재시각을알아내기위한인터페이스는gettimeofday() 이며이는 sys_gettimeofday()로구현되어있음커널은 time() 시스템콜도제공time()보다 gettimeofday()가훨씬나은기능을제공C 라이브러리에는 ftime(), ctime() 과같은시간관련함수도제공

asmlinkage long sys_gettimeofday(struct timeval* tv, structtimezone* tz){

if (likely(tv != NULL)) {struct timeval ktv;`do_gettimeofday(&ktv);if (copy_to_user(tz, &sys_tz, sizeof(ktv)))

return -EFAULT}if (unlikely(tz != NULL)) {

if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))return -EFAULT

}return 0;

}

tv에 NULL이아닌값이주어질경우에는아키텍처종속적인_do_gettimeofday()를호출하는데이함수는 xtime읽기루프를수행.

tz에 NULL이아닌값이주어지면유저에게시스템타임존(zone)을return

만약현재시각을복사하거나 time zone을유저에게 return하는과정에서오류발생시 –EFAULT를 return하고성공하면 0을 return.

Page 18: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 17

동적 타이머(커널 타이머)

장래의특정시간에함수(타이머핸들러)의실행처리시사용어떤특정한시간만큼작업을지연시킬수있는방법

타이머사용법

초기값설정

만료시간지정

만료시실행할함수를지정

타이머를활성화

지정한함수는타이머가만료될때실행

타이머는만료가되면한번그것을호출하고정지하게됨

타이머는주기적이아님(동적타이머가필요한이유)동적타이머는끊임없이생성되고소실되며, 타이머의수에는제한이없음타이머는커널에서전체적으로널리사용됨

Page 19: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 18

타이머 사용

커널타이머의구조는 struct timer_list자료형으로표현<linux/timer.h>에정의되어있음

타이머의타임아웃은 jiffies가 timer->expires보다크거나같을때 timer->function이동작할필요가있다는점에서 “jiffy”값참조타임아웃은절대값

current value + the amount of the desired delay 현재시간에상대적이지않고갱신될필요가없음

struct timer_list {struct list_head entry; // 타이머는연결리스트의일부unsigned long expires; // 만료시간, jiffy 단위spinlock_t lock; // 이타이머를보호하는록void (*function)(unsigned long); // 타이머핸들러함수unsignde long data; // 핸들러의인수struct tvec_t_base_s* base; // 내부적으로사용되는필드

}

Page 20: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 19

타이머 사용(2)

<linux/timer.h> 에타이머관리를위한인터페이스포함실제구현은 kernel/timer.c에정의

// 타이머의내부값을초기화void init_timer(struct timer_list *timer);

// 활동중인타이머의전역리스트에타이머를삽입void add_timer(struct timer_list *timer);

// 타이머만료시간변경int mod_timer(struct timer_list *timer, unsigned long expires);

// 타이머가만료되기전에리스트에서제거(비활성화)// 타이머만료가되면자동으로리스트에서삭제

int del_timer(struct timer_list *timer);

// 멀티프로세싱시스템의경우경쟁상태를회피하기위해사용int del_timer_sync(struct timer_list *timer);

Page 21: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 20

타이머 경쟁 상태

타이머는현재실행중인코드에대해비동기적으로실행되므로잠재적인경쟁상태위험을가짐

mod_timer() 대신다음과같이처리하는것은피해야하며 멀티프로세싱시스템에서안전하지않음

SMP 경우다른 CPU가타이머핸들러를실행하고있을수있음

SMP에서안전한타이머함수del_timer_sync()timerlist_lock spin lock

타이머핸들러함수에서사용하는공유데이터보호필수함수가다른코드에대해비동기적으로실행되기때문

…del_timer(my_timer);my_timer->expires = jiffies + new_delayadd_timer(my_timer);

…del_timer(&mytimer);x_Release_Resources();…

Page 22: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 21

효율적인 타이머 관리

타이머는연결리스트의형태로저장

커널은만료시간을기준으로타이머를 5개의그룹으로분할하고만료시간이가까워진타이머일수록하위그룹으로이동시켜관리

struct timer_vec_root {int index;struct list_head vec[256];

} tv1;

struct timer_vec {int index;struct list_head vec[64];

} tv2, tv3, tv4, tv5;

동적 타이머 리스트

tvecs

tv1 tv2 tv3 tv4 tv5

(0-255) (<214-1) (<220-1) (<226-1) (<232-1)

Page 23: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 22

실행 지연

커널코드는타이머나 Bottom-Half메커니즘을사용하지않고서도실행을일정시간동안지연할수있는방법필요

특히드라이버의경우

Lock 이걸려있거나인터럽트가비활성화될동안에는실행지연을하면안됨

busy 루프

짧은지연

<linux/delay.h>

unsigned long delay = jiffies + 2*HZ; /* two seconds */while (time_before(jiffies, delay))

;while (time_before(jiffies, delay))

cond_resched( );

void udelay(unsigned long usecs); /* microsecond delay */void mdelay(unsigned long msecs); /* millisecond delay */

Page 24: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 23

실행지연의 최적화 방법

Schedule_timeout()지정된시간이경과할때까지태스크를휴면시킴

단순히커널타이머를응용한것

….timeout = 2*HZ;set_current_state(TAST_INTERRUPTIBLE);timeout = schedule_timeout(timeout);….

schedule_timeout(timeout){

struct timer_list timer;expire = timeout + jiffies;init_timer(&timer);timer.expires = expire;timer.data = (unsigned long)current;timer.function = process_timeout;add_timer(&timer);schedule();del_timer_sync(&timer);timeout = expire - jiffies;return (timeout < 0 ? 0 : timeout);

}

void process_timeout(unsigned long data){wake_up_process((struct task_struct *)data);

}

Page 25: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 24

타이밍 측정과 관련한 시스템 콜

time(), ftime(), gettimeofday() 시스템time()

1970년 1월 1일자정부터시작하여경과한시간을초단위로반환ftime()

timeb자료구조반환gettimeofday()

ftime()과같은정보를 timeval과 timezone자료구조로반환

Page 26: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 25

PXA255에서의 타이머 처리(In uP)

모든시간관련활동은 PIT에의해서동작time_init()으로인터럽트게이트 IRQ0을설정

타이머서비스개략적인흐름

timer_interrupt() -> do_timer_interrupt() -> do_timer()BHs활성화

TIMER_BHTQUEUE_BH(tq_timer태스크큐가비지않았을경우)

ARM(PXA255 CPU)의경우setup_timer() -> pxa_timer_interrupt() -> do_timer()

-> update_process_times() -> timer_bh() -> update_times() -> run_timer_list()

static struct irq0= { timer_interrupt, SA_INTERRUPT, 0, “time”, NULL, NULL }

Page 27: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 26

setup_timer (void)

extern inline void setup_timer (void){

gettimeoffset = pxa_gettimeoffset;set_rtc = pxa_set_rtc;xtime.tv_sec = pxa_get_rtc_time();timer_irq.handler = pxa_timer_interrupt;OSMR0 = 0; /* set initial match at 0 */OSSR = 0xf; /* clear status on all timers */setup_arm_irq(IRQ_OST0, &timer_irq);OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */OSCR = 0; /* initialize free-running timer, force first match */

}

Page 28: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 27

주요소스 코드 내용(구조)

static void pxa_timer_interrupt(int irq,void *dev_id, struct pt_regs *regs){

long flags;int next_match;

do_profile(regs);

do { do_leds();do_set_rtc();save_flags_cli( flags );do_timer(regs);OSSR = OSSR_M0; /* Clear match on timer 0 */next_match = (OSMR0 += LATCH); restore_flags( flags );

} while( (signed long)(next_match - OSCR) <= 0 ); }

void do_timer(struct pt_regs *regs){

(*(unsigned long *)&jiffies)++;#ifndef CONFIG_SMP

/* SMP process accounting uses the local APIC timer */

update_process_times(user_mode(regs));#endif

mark_bh(TIMER_BH);if (TQ_ACTIVE(tq_timer))

mark_bh(TQUEUE_BH);}

void timer_bh(void){

update_times();run_timer_list();

}

Page 29: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 28

pxa_timer_interrupt()static void pxa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs){

long flags;int next_match;do_profile(regs);

/* Loop until we get ahead of the free running timer.* This ensures an exact clock tick count and time acuracy.* IRQs are disabled inside the loop to ensure coherence between* lost_ticks (updated in do_timer()) and the match reg value, so we* can use do_gettimeofday() from interrupt handlers.*/do {

do_leds();do_set_rtc();save_flags_cli( flags ); do_timer(regs); OSSR = OSSR_M0; /* Clear match on timer 0 */next_match = (OSMR0 += LATCH); restore_flags( flags );

} while( (signed long)(next_match - OSCR) <= 0 ); }

Page 30: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 29

do_timer(struct pt_regs *regs)void do_timer(struct pt_regs *regs){

(*(unsigned long *)&jiffies)++;

#ifndef CONFIG_SMP/* SMP process accounting uses the local APIC timer */update_process_times(user_mode(regs));

#endif

mark_bh(TIMER_BH);

if (TQ_ACTIVE(tq_timer))mark_bh(TQUEUE_BH);

}

Page 31: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 30

update_process_times()void update_process_times(int user_tick){

struct task_struct *p = current;int cpu = smp_processor_id(), system = user_tick ^ 1;

update_one_process(p, user_tick, system, cpu);if (p->pid) {

if (--p->counter <= 0) { p->counter = 0;p->need_resched = 1;

}if (p->nice > 0)

kstat.per_cpu_nice[cpu] += user_tick;else

kstat.per_cpu_user[cpu] += user_tick;kstat.per_cpu_system[cpu] += system;

} else if (local_bh_count(cpu) || local_irq_count(cpu) > 1)kstat.per_cpu_system[cpu] += system;

}

Page 32: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 31

timer_bh(void)void timer_bh(void){

update_times();run_timer_list();

}

Page 33: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 32

void update_times(void)static inline void update_times(void){

unsigned long ticks;

/** update_times() is run from the raw timer_bh handler so we* just know that the irqs are locally enabled and so we don't* need to save/restore the flags of the local CPU here. -arca*/

write_lock_irq(&xtime_lock);

ticks = jiffies - wall_jiffies;if (ticks) {

wall_jiffies += ticks;update_wall_time(ticks);

}write_unlock_irq(&xtime_lock);calc_load(ticks);

}

Page 34: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 33

update_wall_time(unsigned long ticks)static void update_wall_time(unsigned long ticks) {

do { ticks--; update_wall_time_one_tick();

} while (ticks);

if (xtime.tv_usec >= 1000000) { xtime.tv_usec -= 1000000; xtime.tv_sec++; second_overflow();

} }

Page 35: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 34

run_timer_list(void) (1)static inline void run_timer_list(void){

spin_lock_irq(&timerlist_lock);while ((long)(jiffies - timer_jiffies) >= 0) {

LIST_HEAD(queued);struct list_head *head, *curr;if (!tv1.index) {

int n = 1;do {

cascade_timers(tvecs[n]);} while (tvecs[n]->index == 1 && ++n < NOOF_TVECS);

}run_timer_list_running = &queued;

Page 36: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 35

run_timer_list(void) (2)repeat:

head = tv1.vec + tv1.index;curr = head->next;if (curr != head) {

struct timer_list *timer;void (*fn)(unsigned long);unsigned long data;

timer = list_entry(curr, struct timer_list, list);fn = timer->function;data= timer->data;

detach_timer(timer);timer->list.next = timer->list.prev = NULL;timer_enter(timer);spin_unlock_irq(&timerlist_lock);fn(data);spin_lock_irq(&timerlist_lock);timer_exit();goto repeat;

}

Page 37: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 36

run_timer_list(void) (3)run_timer_list_running = NULL;++timer_jiffies;tv1.index = (tv1.index + 1) & TVR_MASK;

curr = queued.next;while (curr != &queued) {

struct timer_list *timer;

timer = list_entry(curr, struct timer_list, list);curr = curr->next;internal_add_timer(timer);

}}spin_unlock_irq(&timerlist_lock);

}

Page 38: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 37

타이머 프로그램 예제(1)

Timer 프로그램 소스 예제 (mytimer.c)/* Timer Handling */

#include <linux/kernel.h>

#include <linux/module.h>

#ifdef CONFIG_MODVERSIONS

#define MODVERSIONS

#include <linux/modversions.h>

#endif

#include <linux/sched.h>

#include <linux/timer.h>

/* type definitions */

struct mytimer_data {

int m_times;

int m_endtimes;

};

Page 39: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 38

타이머 프로그램 예제(2)

/* global variables */static struct timer_list s_mytimer;static struct mytimer_data s_mytimer_data;

/* function prototypes */static void mytimer_proc(unsigned long ptr);static void add_mytimer(void);void del_mytimer(void);

/* Module startup/cleanup */int init_module(void){

printk("Loading Timer\n");s_mytimer_data.m_times = 0;s_mytimer_data.m_endtimes = 5;

add_mytimer();

return 0;}

Timer 등록

Page 40: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 39

타이머 프로그램 예제(3)

void cleanup_module(void){

del_mytimer();

printk("Unloading Timer\n");}

void mytimer_proc(unsigned long ptr){

struct mytimer_data *pdata = (struct mytimer_data *) ptr;++pdata->m_times;printk("Timer called %d/%d\n", pdata->m_times, pdata->m_endtimes);

if (pdata->m_times < pdata->m_endtimes)

add_mytimer();}

Timer 제거

Timer 재등록

Page 41: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 40

타이머 프로그램 예제(4)

void add_mytimer(void){

init_timer(&s_mytimer);

s_mytimer.function = mytimer_proc;s_mytimer.data = (unsigned long) &s_mytimer_data;s_mytimer.expires = jiffies + HZ * 5; /* 5 seconds */

add_timer(&s_mytimer);}

void del_mytimer(void){

del_timer(&s_mytimer);}

Timer 생성

Timer 추가

Page 42: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 41

타이머 모듈 실행 예

커널 타이머 인터페이스를 이용

Page 43: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 42

PCFR (Power Manager General Configuration Register)

[0x 40F0 001C]

OPDE [0] 3.6864MHz oscillator power-down enable.FP [1] Float PCMCIA controls during Sleep Mode.FS [2] Float Static Chip Selects during Sleep Mode.

Address : 0x40F0001C

OPDE

FPFSReserved

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 44: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 43

PXA255 Processor Clock

32.768K

RTC

32.768K

PWR_MGR

3.6864

PWM

3.6864

SSP

3.6864

GPIO

3.6864

OST

CPU

CORE

MEM

Controller

LCD

Controller

USB

47.923

FICP

47.923

12C

31.949

MMC

19.169

UARTs

14.746

AC97

12.288

12S

5.672

32.768

KHz

OSC

3.6864

MHz

OSC

/1 /112

100-400

MHz

PLL*

147.46

MHz

PLL

95.846

MHz

PLL

DMA /

Bridge

/M/2/4

/N

RETAINS POWER IN SLEEP PXbus

L

1 0 10

OSCC, OON

CCLKCFGcp14 c6.1 : turbo

CCCR

Page 45: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 44

Core PLL Output Frequencies

196ㅡ

[email protected] V

[email protected] v

[email protected] V

427

165.9ㅡㅡ[email protected] V

245

132.7ㅡㅡ[email protected] V

236

66ㅡ

[email protected] V

227

[email protected] v

[email protected] V

[email protected] V

127

3.002.001.501.00(Run)

SDRAMmax Freq

MEM, LCDFrequency

(MHz)

PXbusFrequency

Turbo Mode Frequency (MHz) for Values “N” and Core Clock Configuration Register (CCCR[15:0])

Programming for Values of “N”:ML

36 1 [email protected] V

99.5

99.5

165.9

132.7

132.7

99.5

99.5

99.5

83

66

66

99.5

99.5

Page 46: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 45

Core Clock Configuration Register(CCCR) (1)

N[9:7] Run Mode Frequency 에서 Turbo Mode Frequency 로변환하기위해서곱하는수

Turbo Mode Freq. = Run Mode Frequency * N

000 , 001 , 101 , 111 – Reserved001(Multiplier) = 1011(Multiplier) = 1.5100 (Multiplier) = 2110 (Multiplier) = 3

☞ Hardware Reset , Watchdog Reset 이되면 010 값이 default가된다.☞ Turbo Mode Freq(398.1MHz) = Run Mode Freq(199.1MHz) * N(2)

Address : 0x4130/0004

LMNReserved

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 13 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 47: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 46

Core Clock Configuration Register(CCCR) (2)

M [6:5] Memory Frequency에서 Run Mode Frequency로변환하기위해서곱하는수Memory Freq = Crystal Frequency * L

00 , 11 – Reserved01(Multiplier) = 1(Multiplier가 1이면 Run Mode Freq와

Memory Frequency가같다.)10(Multiplier) = 2(Multiplier가 2이면 Run Mode Freq가

Memory Frequency의 2배가된다.)

☞ Hardware Reset , Watchdog Reset 이되면 10 값이 default가된다.☞ Memory Freq(99.5MHz) = Crystal Frequency(3.6864MHz) * L(27)

LMNReserved

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 13 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 48: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 47

Core Clock Configuration Register(CCCR) (3)

L[4:0] Crystal Frequency에서 Memory Frequency로변환하기위해서곱하는수 (3.6864MHz Crystal을사용)

00000 , 00110 to 11111 – Reserved00001(Multiplier) = 27 (Memory Freq는 99.53MHz가된다.)00010(Multiplier) = 32 (Memory Freq는 117.96MHz가된다.)00011(Multiplier) = 36 (Memory Freq는 132.71MHz가된다.)00100(Multiplier) = 40 (Memory Freq는 147.46MHz가된다.)00101(Multiplier) = 45 (Memory Freq는 165.89MHz가된다.)

☞ Hardware Reset , Watchdog Reset 이되면 00001 값이 default가된다.

LMNReserved

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 13 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 49: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 48

Clock Enable Register(CKEN)(1)

CKEN16[16] LCD Unit Clock Enable0 = Clock이 LCD Unit으로전달되지않는다.1 = Clock이 LCD Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN14[14] I2C Unit Clock Enable0 = Clock이 I2C Unit으로전달되지않는다.1 = Clock이 I2C Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN13[13] FICP Unit Clock Enable0 = Clock이 FICP Unit으로전달되지않는다.1 = Clock이 FICP Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN12[12] MMU Unit Clock Enable0 = Clock이 MMU Unit으로전달되지않는다.1 = Clock이 MMU Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

Address : 0x4130/0004

Reserved CKEN16

Reserved

CKEN14

CKEN11

CKEN12

CKEN13

Reserved

CKEN8

CKEN5

CKEN6

CKEN7

Reserved

CKEN3

CKEN2

CKEN1

CKEN0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 13 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 50: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 49

Clock Enable Register(CKEN)(2)CKEN11[11] USB Unit Clock Enable

0 = Clock이 USB Unit으로전달되지않는다.1 = Clock이 USB Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.GP7 Alternate Function 1 에서 48MHz 의 Clock이출력되려면 1로 set

CKEN8[8] I2S Unit Clock Enable0 = Clock이 I2S Unit으로전달되지않는다.1 = Clock이 I2S Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN7[7] BTUART Unit Clock Enable0 = Clock이 BTUART Unit으로전달되지않는다.1 = Clock이 BTUART Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN6[6] FFUART Unit Clock Enable0 = Clock이 FFUART Unit으로전달되지않는다.1 = Clock이 FFUART Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN5[5] STUART Unit Clock Enable0 = Clock이 STUART Unit으로전달되지않는다.1 = Clock이 STUART Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

Page 51: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 50

Clock Enable Register(CKEN)(3)CKEN3<3>SSP Unit Clock Enable

0 = Clock이 SSP Unit으로전달되지않는다.1 = Clock이 SSP Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.GP7 Alternate Function 1 에서 48MHz 의 Clock이출력되려면 1로 set

CKEN2<2>AC97 Unit Clock Enable0 = Clock이 AC97 Unit으로전달되지않는다.1 = Clock이 AC97 Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN1<1>PWM1 Unit Clock Enable0 = Clock이 PWM1 Unit으로전달되지않는다.1 = Clock이 PWM1 Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

CKEN0<0>PWM0 Unit Clock Enable0 = Clock이 PWM0 Unit으로전달되지않는다.1 = Clock이 PWM0 Unit으로전달된다.Hardware Reset , Watchdog Reset시 1로 set 된다.

Page 52: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 51

Oscillator Configuration Register(OSCC)

Reserved OON OOK

OSCC는 32.768MHz Oscillator의 Configuration을 Control하는 Register이다. Oscillator가동작되었을때안정화가되는데는 10초가걸린다. Oscillator가안정화되면 OOK bit가 1로 set된다.

OON[1] Write-once only bit0 = 32.768MHz Oscillator 사용불가능이때 RTC 와 Power Manager 의 Clock은3.6863MHz Oscillator의값이공급된다.(112로나누어진값) ☞ Page 3-3 의 Figure 3-1 Clocks Manager Block Diagram 참고

1 = 32.768KHz Oscillator 사용가능. 이비트는 Hardware Reset으로만 Clear가된다.

OOK[0] Read-only bit0 = OON bit가 0 이거나 Oscillator가안정화되지않았을경우1 = OON bit가 1 로 set 되고 Oscillator가안정화되었을경우RTC 와 Power Manager의 Clock은 32.768KHz Oscillator의 Clock을사용이비트는 Hardware Reset으로만 Clear가된다.

Address : 0x4130/0008

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 53: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 52

Timers and Watchdog

One free running timer Runs from 3.68 MHz clock

Three general purpose timer registersUser programs a specific value in the registersWhen timer reaches the preprogrammed value, interrupts may be generated

One timer register general purpose or watchdogOperation determined by state of bit 0 in OWERValue loaded at resetIf enabled, cannot be disabled until reset occursOS should occasionally check timer and add to this value if necessary

Page 54: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 53

RTC Alarm Register(RTAR)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

RTMV

• RTAR과 RCNR의값이같아지고 RTSR[ALE] bit가 1로 set 되어있으면RTSR[AL] bit가 1로 set 된다.

• RTMV<31:0> RTC Target Match Value이값은 RTC counter Register(RCNR)의값과비교를한다.

• Physical Address 0x40900004

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 55: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 54

RTC Counter Register(RCNR)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

RCV

• RCNR Register의값은 1Hz(Default)의 rising edge에서 1씩증가한다.

• RCV<31:0> RTC Count ValueRTC Counter Register의값이다.

☞ Ex) RTAR = RCNR + 1;위와같이하면 RTC Interrupt는 1초마다발생한다.

• Physical Address 0x40900000

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 56: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 55

RTC Status Register(RTSR)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 0 0 0

<3> HZE : HZ 인터럽트가능0 = HZ 인터럽트불가능1 = HZ 인터럽트가능

<2> ALE : RTC alarm 인터럽트가능0 = RTC alarm 인터럽트불가능1 = RTC alarm 인터럽트가능

<1> HZ : HZ rising-edge 발견유/무0 = rising-edge가발견되지않았다.1 = rising-edge가발견되었다. 그리고현재 HZE bit가 1이다.

<0> AL : RTC alarm 발견유/무0 = RTC alarm이발견되지않았다.1 = RTC alarm이발견되었다.(RCNR 과 RTAR이같아졌을때 1로set)

그리고현재 ALE bit가 1이다. • Physical Address 0x40900008☞ RTC alarm 인터럽트를발생시키려면 ALE bit를 1로 set 시켜주어야한다.

HZE

ALE

HZ ALReserved

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 57: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 56

RTC Status Register(RTSR)

0 ? ? ? ? ? 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

<31> LCK 0 = RTTR value 값의변경가능1 = RTTR value 값의변경불가능

<25:16> DEL Trim delete countThis value represents the number of 32KHz clocksto delete when clock trimming begins

<15:0> CK_DIVClock divider count32KHz 클럭을 CK_DIV값으로나눈다. Default로 0x7fff이렇게되면 RTC 클럭이 1Hz 가된다. 32KHz의클럭을사용하려면이 부분을모두 0으로바꿔줘야한다.

☞ Ex1) RTAR = RTCR + 1;CK_DIV 값을설정하지않고위와같이설정을하게되면 1초마다 RTC

Interrupt 가발생하게된다. • Physical Address 0x4090000C

ReservedLCK DEL CK_DIV

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 58: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 57

OS Timer Match Register 0-3(OSMR0,OSMR1,OSMR2,OSMR3)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

OSMV<31:0> : OS Timer Match Value 이 Register의값은 OSCR Register의값과비교를한다.이때 Register의값이 OSCR Register의값과같으면 Interrupt를발생시킨다. (4개의 OSMR Register 중비교하고자하는 OSMR Register에해당하는 OIER Bit가 1로 Set 되어있어야한다.)

☞ Ex) OSMR1 = OSCR + 1000 (OSMR1 = 0 OSCR = 0 이라고가정)위와같이하면 OSMR1 = 1000 이되고 OSCR 의값은 0 이다.이때 OSCR 이 counting을하면서 OSMR1 Register의값과비교를한다. OSCR의값이 OSMR1의값과같아지면 Interrupt가발생한다.

OSMR IRQ No.OSMR0 : 26 OSMR1 : 27 OSMR2 : 28 OSMR3 : 29

(ICPR Register 참고)Physical Address : 0x40A00000, 0x40A00004, 0x40A00008, 0x40A0000C

OSMV

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 59: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 58

OS Timer Counter Register(OSCR)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

OSCV

OS Timer Counter Register- 32bit counter 로서 3.6863MHz의 rising edge시에 1씩

OSCV<31:0> : OS Timer Counter Value이 Register의값은 OSMR Register의값과비교

Physical Address 0x40A00010

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

Page 60: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 59

OS Timer Interrupt Enable Register(OIER)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

이 Register는 OSMR[0-3] 의값과 OSCR의값이같아졌을때해당 OSMR에대한Interrupt를발생시킬지여부를결정하는 Register이다.

E[3-0] :0 = OSMR[3-0] 의값이 OSCR의값과같아도 Interrupt를발생시키지않는다.1 = OSMR[3-0] 의값이 OSCR의값과같으면 Interrupt를발생시킨다.

Physical Address 0x40A0001C

E3 E2 E1 E0Reserved

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

0 0 0 0

Page 61: Timer Programming in Linux - khu.ac.krmesl.khu.ac.kr/lecture/doc/esl2/closed.pxa255/esl2-14...이loop는writer가없는상태에서 reader가데이터를읽을때까지 반복 만약loop가진행되는동안타이머

Embedded System Lab. II 60

OS Timer Status Register(OSSR)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

4개의 OSMR Register중하나와 OSCR과match가됐는지여부를알려줌OSMR Register중하나와그에상응하는 OIER bit 가 1로 set 되어있고 OSMR과

OSCR이match가되면 OSSR[3-0]의 bit가 1로 set 된다.

M[3-0] :0 = OSMR[3-0]과 OSCR의값이match가되지않았다.1 = OSMR[3-0]과 OSCR의값이match가되었다.

Physical Address 0x40A00014

M3 M2 M1 M0Reserved

3 2 1 07 6 5 411 10 9 815 14 13 1219 18 17 1623 22 21 2027 26 25 2431 30 29 28

0 0 0 0