2014-05-12 2 views
0

정기적으로 정보를 인쇄하는 리눅스 장치 드라이버 코드를 작성해야합니다. 이 정보는 모듈이 언로드 될 때까지 인쇄되어야합니다. 나는 (내가 __init 때문에 가정 및 __exit 동시에 작동 할 수 없기 때문에 부울 값은 변경할 수 없습니다)이 코드는 작동하지 않습니다, 분명히이주기적으로 정보를 출력하는 리눅스 장치 드라이버

int boolean = 1; 
static int hello_init(void) 
{ 
    while(boolean){ 
     printk(KERN_ALERT "An information\n"); 
     msleep(1000); 
    } 
    return 0;  
    } 

static void hello_exit(void) 
{ 
    boolean=0; 

    printk(KERN_ALERT "Goodbye, cruel world\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

같은 것을 작성해야합니다. 누구든지이 문제를 해결하도록 도와 줄 수 있습니까?

답변

1

hello_init()에서 hrtimer_start()으로 타이머를 설정해야합니다. struct hrtimer *timer에는 설정시에 호출 할 함수 포인터가 들어 있습니다. 그 콜백 함수는 printk()를 포함해야합니다. 콜백이 호출 될 때마다 타이머를 갱신해야합니다. hello_exit()에서 hrtimer_cancel()으로 전화하는 것을 잊지 마십시오. ktime_set() 함수를 사용하여 원하는 만료 시간을 계산할 수 있습니다. 여기를 살펴보면, 몇 가지 관련 유용한 기능이 있습니다. High-resolution timers

+0

printk()의 ​​경우에만 매우 정확한 타이머가 필요하지 않으므로 해당 기능도 고려해야합니다. https://www.kernel.org/doc/htmldocs/device-drivers/ch01s03.html – Ray

2

주기적으로 수행해야하는 작업이 절전 모드로 전환해야하는 경우 타이머 기능을 사용하지 못할 수 있습니다. 지연된 작업 대기열은 해당 상황에서 사용될 수 있습니다. 즉, hrtimer만큼 정확하지는 않지만 타이밍 요구 사항이 너무 엄격하지 않으면 정상적으로 작동합니다. Calling spi_write periodically in a linux driver

난 당신이 유용하게 사용할 수있는 그것의 Workqueue는 예를 게시 :

는 최근 주기적으로 여기 일을에 대한 질문을 기록했다.

나는 또한 도움이 될이 문서를 발견 :이 게시 된 이후 http://www.makelinux.net/ldd3/chp-7-sect-6

그러나 일부 변경이 API 변경되었습니다. 이 기사에서는 다음과 같은 변경 사항을 간략하게 설명합니다. http://lwn.net/Articles/211279/