[완료]디바이스 드라이버를 짜면서 마이크로 초단위의 인터럽트 발생은 어떤 방식으로 해야하나요?
글쓴이: kkyama / 작성시간: 목, 2009/11/19 - 6:08오전
안녕하세요.
임베디드 리눅스를 공부하는 학생입니다.
제가 디바이스 드라이버단에서 센서를 제어해보려고 GPIO핀을 이용하려고하는데요.
근데 이걸 제어하고 센서값을 읽기위해서는 마이크로초단위의 시간측정이 필요하더군요.
근데 커널 타이머 인터럽트를 이용해도 10ms가 최소단위더군요..
8비트 컨트롤러를 사용할때는 펌웨어단에서 레지스터값을 설정하면서 인터럽트 서비스루틴 함수를 이용하면 충분히 가능했는데,
리눅스커널 위에서는 이런 제어가 어려운것인가요?
timespec 구조체를 보면 나노초단위까지 측정이 가능하던데...(머..이건 보드스펙상 나노초까진 무리고요..)
질문1.마이크로 초단위의 제어를 할수 있는 방법좀 알려주셨으면 합니다.
질문2.그래서 리눅스 헤더파일을 열심히 뒤져보니 타이머카운터인터럽트와 관련된 레지스터 define 헤더파일을 찾았습니다.(at91_rt.h던가.)
그래서 이 레지스터들을 건드려볼까하는데...레지스터를 건드릴수있는 함수를 못찾겠더라구요..(당연히 있겠다고 생각했지만 헤더파일을 다 뒤져봐도 비스무리한걸 못찾겠습니다..)
레지스터값을 write할수있는 함수는 어디서 찾을수 있을까요??
현재 보드를 제공해주는 회사에서 RTOS를 제공해주며 이 OS는 회사여건상 중요 코드가 공개가 안되서 OS포팅을 다시할수 있는 상황은 아닙니다.(그렇기에 제 짧은 소견으로는 펌웨어단 수정은 불가능한거 맞죠...?)
그럼 조언 부탁드립니다.
Forums:
업체에 질문해 보는게 빠르지 않을까요?
제가 알기론, nanosleep() 같은 것도 일정 값 이하로 떨어지면 나노 단위의 시간을 출력할 수 없는 걸로 알고 있습니다.
아마 sleep()인가 usleep() 이하의 sleep함수는 실제로 cpu클럭을 센 다음 출력( 인터럽트가 아닌) 하기 때문이던가...뭐 그런 식이라고 해서요.
요점은, 일정 값 이하의 짧은 시간은 리눅스에서 잴 수 없다고 알고 있습니다.
고로, 제어하시려는 시간 간격이 ( GPIO를 이용한 드라이버 레벨에서 ) 측정 + 제어 가능한지를 보드 제작 업체에게 먼저 물어봐서 확인한 다음, 그 이후 작업을 진행하는 게 어떠하시련가 합니다.
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
타이머 카운터 유닛헤더파일의 레지스터들을 건들면...어떨까요??
답변 감사합니다.
헤더파일중 /include/asm-arm/arch-at91/at91_tc.h 가 있더군요.
여기에 나와있는 값들을 이용하여 outb()함수로 직접 건드려볼수 있을까요..
at91sam9260이라 데이터시트도 공개가 안돼있는지..데이터시트도 없더군요..
Let`s do mybest for learning Linux
RTC를 사용하면 되지
RTC를 사용하면 되지 않을까요..?
어떤 보드를 사용하는지 모르겠습니다만..
RTC를 10ms 마다 인터럽트가 일어나도록 만들면 될것 같은데요..
물론 그 RTC도 Programable 해야 하겠지만요...
답변 감사합니다..^^
결국엔 다른 방법을 써봤습니다..
커널 타이머 인터럽트를 이용해서 주기를 만들고 커널타이머 호출 시 동작하는 함수내에서 delay함수를 이용하여 하이값을 유지하고.
수신부쪽은 시간구조체를 이용하여 시간을 측정하기로 했습니다...
일단 송신부쪽은 파형이 나오는데...수신부는 데이터값만 나오는것을 확인했으나 아직 거리값으로 변환이 필요한 상태입니다..
여러 답변들 감사드려요..^0^
Let`s do mybest for learning Linux
타이머의 값을 읽을
타이머의 값을 읽을 수 있다면 타이머 인터럽트 주기보다 더 짧은 시간을 측정 가능합니다.
써놓고 보니까 뻘소리인듯 싶네요 ㅡ_ㅡ
타이머값을 읽을수 있다면요??
타이머 값을 읽을 수있다는것은 커널에서 제공하는 gettimeofday함수와 timeval구조체를 이용하여 usec 단위의 값을 읽어왔습니다.
그런데 커널 타이머 인터럽트는 기본적으로 구동되는 상수가 HZ/100또는 HZ/1000값으로 이루어져있기에 그 이하값으로 타이머인터럽트를 생성할수 없는거 같다는것이 저의 생각이였습니다.
그리고 님의 답변처럼 타이머 인터럽트보다 더 짧은 주기의 인터럽트를 만들어주기 위해서는 펌웨어단에서 ARM칩에서 제공하는 타이머/카운터인터럽트를 직접 사용하는방법밖에 생각이 안드는데요..
이렇게 될경우 펌웨어단으로 내려가야하고 그렇게 되면 OS를 올리게 되는것이 무용지물이 될것이고, OS에서 기본적으로 사용되는 TICK값도 이 타이머/카운터의 주기에 의해 결정된다는것이 저의 생각인데요..
님께서 말씀하신 내용이 정확히 어떤것인지 자문좀 구해도 될까요..
(저의 생각이 틀렸다면 바로 지적해주세요..^^)
Let`s do mybest for learning Linux
댓글 달기