TIMER

Category
아이템: TIMER(7)
포스트 갯수7

[라즈베리파이] 커널 타이머 -동적 타이머는 누가 언제 호출하나? (2)

By Guillermo Austin Kim | 2018년 8월 27일 | 
커널 타이머는 타이머 인터럽트가 발생 후 동작을 시작합니다. 다음 그림은 커널 시스템 타이머 전체 흐름도 중 1단계 부분입니다. [그림] 커널 타이머 전체 흐름도 1단계 타이머 인터럽트가 발생하면 인터럽트 핸들러 함수인 arch_timer_handler_phys() 가 실행하고 HZ (100)만큼 jiffies를 증감시키는 tich_sched_timer() 함수를 호출합니다. 이후 update_process_times() 함수를 호출하고 나서 run_local_timers() 함수가 run_local_timers() 함수를 호출합니다. 먼저 update_process_times() 함수를 봅시다.1 void update_process_times(int user_tick)2 {3struct ta

[라즈베리파이] 커널 타이머 -동적 타이머는 누가 언제 호출하나? (1)

By Guillermo Austin Kim | 2018년 8월 15일 | 
이전에 동적 타이머를 설정하는 코드 흐름까지 알아봤습니다. 이 과정을 요약하면 다음과 같습니다. 1. 동적 타이머를 표현하는 자료 구조인 struct timer_list 구조체에 기본 정보를 채운 다음 add_time() 혹은 mod_time() 함수를 호출합니다. 동적 타이머 기본 정보는 타이머 만료 시각(HZ단위)과 동적 타이머 핸들러 함수와 매개 변수입니다. 2. 동적 타이머를 초기화했을 때 실행했던 CPU 번호 기준으로 per-cpu 오프셋을 적용해서 timer_base 주소를 읽습니다. 이 주소에는 struct timer_base 구조체 멤버가 있는데 타이머 벡터 해시 인덱스에 동적 타이머를 등록했습니다. 이어서 이번에는 동적 타이머를 누가 언제 처리하는지 살펴봅니다. 동적 타이머는 커널 시스

[라즈베리파이] 커널타이머 - 동적 타이머 실행(__mod_timer) 코드 분석

By Guillermo Austin Kim | 2018년 8월 10일 | 
이제 add_timer()와 mod_timer() 함수들의 구현부를 살펴 보겠습니다. add_timer() 함수 구현부를 보면 mod_timer() 함수를 호출하니 기능적으로 add_timer() 함수와 mod_timer() 함수는 차이가 없습니다.void add_timer(struct timer_list *timer){ BUG_ON(timer_pending(timer)); mod_timer(timer, timer->expires);} int mod_timer(struct timer_list *timer, unsigned long expires){ return __mod_timer(timer, expires, false);} mod_timer() 함수는 __mod_timer() 함수를 호출하니 동

[라즈베리파이] 커널 타이머 - 동적 타이머 실행 코드

By Guillermo Austin Kim | 2018년 8월 8일 | 
동적 타이머를 초기화만 하면 동적 타이머를 쓸 수 없습니다. 동적 타이머를 실행해야 합니다. 이를 위해 add_timer()/add_timer_on() 이나 mod_timer() 함수에 적절한 인자를 채워 호출해야 합니다. 보통 add_timer() 함수를 써서 동적 타이머를 실행하며 이후 동적 타이머 만료 시간을 다시 설정한 후 동적 타이머를 실행시킬 때 mod_timer() 함수를 씁니다. add_timer()와 mod_timer() 함수를 써서 로컬 타이머를 설정하는 코드를 살펴보겠습니다. 먼저 라즈비안에서 로컬 타이머를 실행하는 코드를 봅시다.1 bool bcm2835_sdhost_send_command(struct bcm2835_host *host,2 struct mmc_command