도와주세요!!
글 수 15,339
2008.12.29 13:52:01 (*.100.112.25)
16451
임베이디드 리눅스에서 아래의 경우는 어떻게 처리를 해야 되는 지요?? 그간 펌웨어만 다루다가
이제 막 임베이디드 리눅스를 공부하기 시작했는데 아직 운용 방식이 생소하네요
(장치1 -이하[1]) / (장치 2-이하[2]) / (장치 3 -이하[3]) 이 485 통신을 이용하여 서로 정보를 주고 받습니다.
[1] 은 매 10 msec 마다 [2] 와 [3] 에게 현재 상태 요청 명령을 전송하고 [2] 와 [3]은 해당 명령을 수신하면
자기 data를 송신합니다. [1]은 명령 전송후 10 msec 이내에 첫번째 data를 수신 받지 않으면 해당 디바이스
가 없는 것으로 인식하고 다음 명령을 전송합니다. 즉 [2] 에게 현재 상태를 요청했는데 10 msec 이내 [2]
에게서 응답이 없으면 [3] 에게 현재 상태를 요청하는 구조입니다.
펌웨어로 [2] /[3] 장치 프로그램을 만든다면 10msec 이내 응답 조건을 만족시키기 위해 uart 수신 인터럽트
서비스 루틴 함수에서 수신 명령을 처리하고 전송 준비를 하면 10 msec 이내 응답조건을 충족 시키는데 아무런
문제가 없을것입니다.
Uart 관련 디바이스 드라이버는 커널에서 제공하는 함수를 그대로 사용 해서 상기 조건을 임베이디드 리눅스로
구현한다고 하면, open 함수로 디바이스 드라이버를 열고 read 함수로 data 수신 상태를 확인해서 새로 수신된 data가
있고 [1] 이 보낸 명령으로 확인되면 write 함수를 이용하여 현재 상태 data 를 송신 합니다.
그런데 read 함수의 경우 일종의 폴링 방식 이기 때문에 10 msec 이내 송신 조건을 충족 시키기 위해서는
응용 프로그램의 순환 시간이 10 msec 를 초과하지 않도록 만들던지 read 함수를 프로그램 여러 곳에서 호출
해야 될 것입니다. 이러면 경우에 따라 송신 시간이 초과 될 수 있고 시스템이 불안해 지겠죠
그래서 이런 생각을 해 봤습니다. read 함수를 매 일정 시간마다 호출 할 수는 없을까 ?
책을 뒤져 보면 임베이디드 리눅스에서 일정 시간 마다 특정 조건을 체크 하는 방법은 커널 타이머를 추가 해서 인터럽트
를 받던가 워크 큐 구조체를 이용하여 특정 시간마다 특정 함수를 호출 하면 된다는 것을 알았습니다.
그런데 문제가 워크 큐 도 디바이스 드라이버인데 디바이스 드라이버 에서 read 함수를 호출 할 수 있나요?
임베이드 리눅스를 처음 접할때 가장 답답했던건 응용 프로그램에서는 타이머 인터럽트 서비스 루틴을 만들지 못하고
응용 프로그램에서 사용된 변수 또한 디바이스 드라이버에서 그대로 사용할 수 없다는 점 입니다.
아직 임베이디드 리눅스를 접한지 한달 정도 밖에 않되다 보니 운용 방식에 대해 여러가지 답답한 점이 많습니다.
상기 조건일때 리눅스에서는 어떻게 처리 하면 되나요? 조언 부탁 드립니다.
이제 막 임베이디드 리눅스를 공부하기 시작했는데 아직 운용 방식이 생소하네요
(장치1 -이하[1]) / (장치 2-이하[2]) / (장치 3 -이하[3]) 이 485 통신을 이용하여 서로 정보를 주고 받습니다.
[1] 은 매 10 msec 마다 [2] 와 [3] 에게 현재 상태 요청 명령을 전송하고 [2] 와 [3]은 해당 명령을 수신하면
자기 data를 송신합니다. [1]은 명령 전송후 10 msec 이내에 첫번째 data를 수신 받지 않으면 해당 디바이스
가 없는 것으로 인식하고 다음 명령을 전송합니다. 즉 [2] 에게 현재 상태를 요청했는데 10 msec 이내 [2]
에게서 응답이 없으면 [3] 에게 현재 상태를 요청하는 구조입니다.
펌웨어로 [2] /[3] 장치 프로그램을 만든다면 10msec 이내 응답 조건을 만족시키기 위해 uart 수신 인터럽트
서비스 루틴 함수에서 수신 명령을 처리하고 전송 준비를 하면 10 msec 이내 응답조건을 충족 시키는데 아무런
문제가 없을것입니다.
Uart 관련 디바이스 드라이버는 커널에서 제공하는 함수를 그대로 사용 해서 상기 조건을 임베이디드 리눅스로
구현한다고 하면, open 함수로 디바이스 드라이버를 열고 read 함수로 data 수신 상태를 확인해서 새로 수신된 data가
있고 [1] 이 보낸 명령으로 확인되면 write 함수를 이용하여 현재 상태 data 를 송신 합니다.
그런데 read 함수의 경우 일종의 폴링 방식 이기 때문에 10 msec 이내 송신 조건을 충족 시키기 위해서는
응용 프로그램의 순환 시간이 10 msec 를 초과하지 않도록 만들던지 read 함수를 프로그램 여러 곳에서 호출
해야 될 것입니다. 이러면 경우에 따라 송신 시간이 초과 될 수 있고 시스템이 불안해 지겠죠
그래서 이런 생각을 해 봤습니다. read 함수를 매 일정 시간마다 호출 할 수는 없을까 ?
책을 뒤져 보면 임베이디드 리눅스에서 일정 시간 마다 특정 조건을 체크 하는 방법은 커널 타이머를 추가 해서 인터럽트
를 받던가 워크 큐 구조체를 이용하여 특정 시간마다 특정 함수를 호출 하면 된다는 것을 알았습니다.
그런데 문제가 워크 큐 도 디바이스 드라이버인데 디바이스 드라이버 에서 read 함수를 호출 할 수 있나요?
임베이드 리눅스를 처음 접할때 가장 답답했던건 응용 프로그램에서는 타이머 인터럽트 서비스 루틴을 만들지 못하고
응용 프로그램에서 사용된 변수 또한 디바이스 드라이버에서 그대로 사용할 수 없다는 점 입니다.
아직 임베이디드 리눅스를 접한지 한달 정도 밖에 않되다 보니 운용 방식에 대해 여러가지 답답한 점이 많습니다.
상기 조건일때 리눅스에서는 어떻게 처리 하면 되나요? 조언 부탁 드립니다.
2008.12.30 08:15:03 (*.100.112.25)
응용프로그램에서 커널 타이머를 추가 할 수 있다구요??? 혹시 add_timer() 함수로 등록 하는 방법을 말씀하시는 건가요?
유영창님의 디바이스 드라이버라는 책을 보면 응용 프로그램에선 커널타이머나 인터럽트 핸들러 선언이 않된다고 나와
있는거 같은데 아닌가요? 아니면 책 내용 자체가 디바이스 드라이버에 관한 내용을 다루다 보니 예제도 그쪽 위주로 설명
되어 있는지 모르겠네요... 일단 어차피 맨땅에 헤딩 하는 기분으로 접근 하고 있기 땜시 그냥 무작정 해보면 되겠네요
디바이스 드라이버 책을 보면 이런 내용이 있습니다.
" 응용 프로그램은 인터럽트를 받아 들일수 없다 궁여 지책으로 사용하는 것이라면 SIGIO 라는 특별한 시그널이다. 물론
이역시 정상적인 인터럽트와는 거리가 멀다 "
위 내용만 보면 응용 프로그램에서 타이머나 인터럽트 핸들러 함수를 생성 하지 못할거 같은데 ????? ^^
2009.01.07 20:23:20 (*.178.199.167)
응용프로그램에서 주기적으로 어떤일을 처리하는 것은 어려움이 따릅니다.
while 문을 돌련서 시간을 비교하는 방법이 있습니다. 무자정 돌리는 것은 아니며
poll()함수를 사용하여 프로세스를 재우면서 감시하여야 합니다. 10msec 이상의 시간주기를
지원합니다.
10msec이하의 시간을 감시하면서 어떤일을 하고자 한다면 디바이스 드라이버에서
하드웨어 타이머 인터럽트를 사용하셔야 합니다. 커널이 지원하는 add_timer() 함수로는
10msec 이하는 지원하지 못합니다. arm 커널의 경우 HZ 값이 100 이므로 지원하지 못하는 것입니다.
만일 i386 이라면 1msec 입니다.
while 문을 돌련서 시간을 비교하는 방법이 있습니다. 무자정 돌리는 것은 아니며
poll()함수를 사용하여 프로세스를 재우면서 감시하여야 합니다. 10msec 이상의 시간주기를
지원합니다.
10msec이하의 시간을 감시하면서 어떤일을 하고자 한다면 디바이스 드라이버에서
하드웨어 타이머 인터럽트를 사용하셔야 합니다. 커널이 지원하는 add_timer() 함수로는
10msec 이하는 지원하지 못합니다. arm 커널의 경우 HZ 값이 100 이므로 지원하지 못하는 것입니다.
만일 i386 이라면 1msec 입니다.
시스템에 따라서 타이머 최소주기가 10msec일 수는 있습니다만....
그리고 응용프로그램의 변수값등도 ioctl을 통해서 드라이버에 전달가능하고요.