타이머 인터럽트에 관련하여...

jymnet의 이미지

리눅스에서 타이머 인터럽트를 10mS이하로 사용할려고 합니다.
어떻게 사용할수 있는지 궁굼합니다.

stoneshim의 이미지

setitimer()를 사용하세요.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

xyhan의 이미지

sdl 게임 라이브러리를 이용하시면
1000ms 까지 가능 할껄요..

============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

jymnet의 이미지

답변 감사드립니다.

제가 지금 하려는 일은 20kHz로 샘플링하려고 하고 있습니다.
즉 50us마다 값을 읽어 들여야 하는 데 어떻게 하면 되겠습니다.
stoneshim님이 setitimer를 사용한다면 된다고 하셨는데 어떻게
사용할지 잘 모르겠습니다.

부디 자비를 베플어 사용방법을 가르쳐주시면 감사하겠습니다.
또한 novice님도 관심을 가져주셔서 감사합니다.

ksil의 이미지

제가 알기로는 setitimer도 역시 10ms이하는 보장 못하는것으로 알고 있습니다.

linux에서 커널의 보통 컴파일이 10ms단위로 스케쥴링을 실행하기 때문으로 알고 있는데요..(아니라면 linux도 RTOS라는 얘기가 되겠죠 ^^; )

일반적인 방법은 없는것으로 알고 있습니다.

전 buffer를 크게 잡아서 사용하고 있습니다. :)

예를 들어 Audio driver에서 매 100ms 마다 데이타를 가져 와야 합니다만 이 정도도 정확히 보장해 주지 못하더군요.

그래서 전 드라이버에 약 400ms 정도의 데이타를 위한 버퍼 2개를 잡아 놓고
쓰레드 내에서 gettimeofday로 시간을 체크하면서 100ms마다 가져 옵니다.
(이렇게 하면 300ms동안 쓰레드가 스케쥴링 못받아도 대충 견디더군요)

단 이의 과정은 드라이버 레벨에서 계속 데이타를 지가 펌핑해 놓을수 있다는것이 필요하겠지요.

이 과정만 만족시키면 50us마다는 아니겠지만 데이타 손실없이 처리가 가능할것 같은데요. ^^;

stoneshim의 이미지

그렇게 정확하게 까지는 어려울지 몰라도, scheduling 정책을 SCHED_FIFO나 SCHED_RR로 변경하고, priority를 높인 후, setitimer를 사용한다면 어느정도 결과를 얻으실 수 있을 듯 합니다.

scheduling 정책 변경은 sched_setscheduler() 를 참고하시면 될 것이구요. 물론 프로세스가 root 권한이 있어야 합니다.

setitimer()는 단지 signal을 일정 시간 후부터 일정 interval 마다 발생시키는 함수입니다.

참고로 linux에서 SCHED_FIFO 나 SCHED_RR 정책을 사용하는 프로세스가 artsd 라는게 있다는데요, 이게 KDE 에서 audio 관련해서 사용하는 데몬이라는군요.

다음은 bbs.kldp 내에 scheduling 정책 관련 URL 입니다.
http://bbs.kldp.org/viewtopic.php?t=1988&start=0&postdays=0&postorder=asc&highlight=SCHED_RR

http://bbs.kldp.org/viewtopic.php?t=1833&start=0&postdays=0&postorder=asc&highlight=SCHED_RR

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

han2011의 이미지

어떠한 방식을 사용하더라도 기본 리눅스 타이머만으로는 10ms 이하의 타이머를 만들 수 없습니다...
setitimer등을 이용하여 nano seconds 단위로 시간을 주더라도 시스템콜에서 타이머를 등록할 때 10ms 이하자리는 끊어버릴 것입니다..
sourceforge에 가보시면 Hish Resolution Timer 를 구현하는 프로젝트 그룹이 있습니다...( 그룹 이름이 Hish Res. Timer 던가.. )
다른 아키텍쳐는 아직 제대로 구현이 되어 있지 않지만 i386에서는 그런대로 쓸만하게 구현이 되어 있던 거 같더군요..
리눅스 커널에 패치를 하고 나면 몇 개의 시스템 콜이 추가되는데 이를 이용하면 High Resolution Timer를 사용하실 수 있습니다...
Resolution은 이론상 1/CPU Clock Speed 까지 가능한 걸로 알고 있습니다...(물론 이론이구요...시스템콜 내부에서 적절한 단위 이하는 버리는 걸로 알고 있습니다..)
그럼 이만...

- shhan -

익명 사용자의 이미지

대충 커널의 수정이 있어야 될듯 하며
다음과 같은 코드로 Timer를 재설정할수 있습니다.
하지만 이로 인한 부작용은 말로 설명하기 벅찰거 같군요.

윗분중에 버퍼를 사용하는쪽을 말씀하셨는데 저 역시
그쪽에 동감합니다.

밑의 코드는 그냥 참고사항일뿐 적용하려면 너무 어려운 문제입니다.
Default로 countdown 값이 0으로 되어 있는데 이 값은 65536을 가정한 값으로
이 값을 조정하면 됩니다만 현실적으로 시도하지 말라고 권하겠습니다.
Linux에서 Timer interrupt 초기화 부분을 찾으면 비슷한 곳이 어렵게나마
찾을수 있을겁니다. HZ상수도 고려대상입니다.

보다 자세한 정보는 8253 chip에 대해서 찾아보시기 바랍니다.

만약 수정이 가능하다면 그에 따른 부작용을 충분히 고려해보세요.
Scheduler의 성능저하와 키보드 입력 불가능 사태등이 예상됩니다.

  cli
  mov  al,00110110b  ; bit 7,6 = (00) timer counter 0
                     ; bit 5,4 = (11) write LSB then MSB
                     ; bit 3-1 = (011) generate square wave
                     ; bit 0 = (0) binary counter
  out  43h,al        ; prep PIT, counter 0, square wave&init count
  jmp  $+2
  mov  cx,countdown  ; default is 0x0000 (65536) (18.2 per sec)
                     ; interrupts when counter decrements to 0
  mov  al,cl         ; send LSB of timer count
  out  40h,al
  jmp  $+2
  mov  al,ch         ; send MSB of timer count
  out  40h,al
  jmp  $+2
  sti

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.