라즈베리파이
Posts
191 posts[라즈베리파이] 커널타이머 - 동적 타이머 실행(__mod_timer) 코드 분석
이제 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() 함수를 호출하니 동
[라즈베리파이] 커널 타이머 - 동적 타이머 실행 코드
동적 타이머를 초기화만 하면 동적 타이머를 쓸 수 없습니다. 동적 타이머를 실행해야 합니다. 이를 위해 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
[라즈베리파이] 커널 타이머 - 동적 타이머 초기화
동적 타이머 초기화를 알아 보기 앞서 동적 타이머는 전체 동작 흐름에 대해 알아 봅시다.동적 타이머 동작은 3단계로 나눌 수 있습니다. 1. 동적 타이머 초기화2. 동적 타이머 실행3. 동적 타이머 만료 3.1 동적 타이머 해제 3.2 동적 타이머 핸들러 실행 첫 번째 초기화 단계입니다.동적 타이머 초기화는 보통 드라이버 레벨에서 수행합니다. 동적 타이머는 struct timer_list 이란 자료구조로 표현할 수 있는데 이 멤버 중 flags만 업데이트 합니다. 두 번째 동적 타이머 실행 단계입니다.동적 타이머 실행도 마찬가지로 드라이버 레벨에서 이루어집니다. 각자 드라이버 시나리오에 따라 동적 타이머 만료 시간을 HZ 단위로 지정한 다음에 add_timer() 함수를 호출합니다. 이제는 동적 타이머
[라즈베리파이] 커널 타이머 - timer_after/timer_before 함수
리눅스 커널 중요 시스템은 물론 여러 디바이스 드라이버에서 time_after()와 time_before() 함수를 써서 실행 시간과 타이밍을 제어합니다. 보통 함수 처리 시간과 실행 시간의 데드라인을 점검합니다. 그러니 이 함수들이 어떤 역할을 하는지 잘 알아둘 필요가 있습니다. 먼저 time_after()와 time_before() 함수 구현부를 보겠습니다.[include/linux/jiffies.h]1 #define time_after(a,b) \2 (typecheck(unsigned long, a) && \3 typecheck(unsigned long, b) && \4 ((long)((b) - (a)) < 0))5 #define time_before(a,b


