도와주세요!!
글 수 15,339
2004.06.10 00:17:29 (*.127.38.181)
6672
커널과 사용자 프로그램을 동기화 하는 방법으로 시그널을 사용하셨군요..
일반적으로 커널과 사용자 프로그램 동기화 방법중에서 빈번하지 않은 경우에
는 시그널을 사용하는 것이 맞는데..
사용이 빈번해 질때는... 문제가 생깁니다. 시그널이 사용자 프로그램에서 수
행되기 때문에 시그널 핸들러를 사용할때마다.. 빈번한 컨택스트 스위칭 오버
헤드가 발생합니다. (생각보다..심합니다.... RT 시그널에서 데이터를 잃어 버
릴 정도로..)
따라서.. 이런 문제를 처리하기 위해서는 파이프를 사용하거나.. ioctl을 사용
하여 blocking 이벤트를 좀 특별하게 처리하는 방법이 있습니다.
파이프를 사용하려면... 커널 안에서 파일 처리하는 정도만 하시면 됩니다.
물론.. 아주.. 최악의 상황을 생각한다면.. dead lock을 경험하실 수 있겠지만
요..
현지아빠 wrote..
: 안녕하세요~~ 간만에~~ 들리는 군요~~
:
: 프로젝트 막바지에~~ 다달 았습니다 ...
:
: 이제 조금만 하면 끝이 나는데요~~ 엄청난 버그를 발견 했습니다 ...
:
: 지금 현재 제 프로그램은 시그널을 굉장히많이 사용 합니다 ..
:
: 그것두 일반 시그널이 아닌 RTS (Real-time Signal) 을 전부 사용 합니다 ..
:
: 일단 디바이스 드라이버에서 하드웨어 PLL 을 500 hz 로 발생 하고~~
:
: 그러니까 2 ms 마다 .. 인터럽을 띄우고~ 그걸 디바이스 드라이버에서 받으 면
:
: 데이타 프로세서에게 RTS 를 날리고~ 그럼 그 RTS 를 받아서 전 디바이스
:
: ( AD 16 CH, DA 8 CH, DI 32 CH, DO 32 CH, PID 4 CH, ENCORDER CNT 2 CH )
:
: 를읽어 500 HZ Real-time 10 초간격으로 파일링 하고~ 그걸 삼바를 이용
:
: 해서~ 피시쪽에서 가져 옵니다.
:
: 그래서 피시쪽에서 데이타 프로세싱을 하는데요~
:
: 피시에서 UDP로 제어 명령을 내리면 이또한 마찬가지로~ 500 HZ 로 데이타 를
:
: 저장하고 있는 그프로세서에서 RTS 시그널 벡터가 실행됩니다.
:
: 또 암쪽에서 또다른 프로세서가 제어 스크립트엔진을 가지고 있고~ 스크립 트
:
: 언어를 해석 해서 제어를 보낼 필요가 있을때 127.0.0.1 로 UDP 를 송출 하 고
:
: 이또한 500 HZ 로 데이타를 저장하고 있는 그프로세서에서 RTS 시그널 벡터 가
:
: 실행됩니다.
:
: 이렇게 프로그램이 전부 시그널 백터로만 구성 되어 있을 정도 입니다.
:
: 그런데~~ 그 프로세서 에서 실수(float point) 연산을 하면 ... 100 번 계산
:
: 에 1~2 번 정도 계산이 실제로 되지 않습니다.
:
: float A = 10.;
: float B = A / 3.;
: float C = B * 3.;
:
: if(ABS(A - C) < 1.0) 실수 연산이 정상으로 되었다고 판단
: else 실수 연산이 에러가 되었음.
:
: 이런 로직을 메인 루프에 걸어 두면 100 번 계산에 한두번 실제 에러가 발생
:
: 합니다.
:
: 제가 생각 하기엔 시그널 벡터와 실수 연산 사이의 먼가 문제가 있는듯 한 데 ~~
:
: 쩝 도저히 알수가 없습니다 ....
:
: 시그널 벡터를 코딩 할때 주의 해야 할점은 무엇인가요~
:
: 아니면 해결 책이 없는건가요~~
:
: 아래에~ 시리얼 인터럽트 방식에 대해...
:
: 이란글에서 개구리님의 글을 인용하면
:
: "저희가 드린 샘플 소스는 가장 원초적인 방식입니다
: 시그널 핸들러를 사용하시는 방법은 다른 여러가지 요인에 의해서
: 버그가 생길수 있읍니다.
: 그러므로 시그널의 특성을 잘 모르시는 분들은 안 사용하시는 것이
: 좋을 듯 합니다.
: 차라리 poll 함수를 사용하여 다중 입출력 함수를 이용하시는 방법을
: 추천해 드리고 싶습니다."
:
: ==>
: 시그널 핸들러를 사용하시는 방법은 다른 여러가지 요인에 의해서
: 버그가 생길수 있읍니다.
: : 다른여러가지 요인이란 어떤걸 말합니까 ?
:
: ==>
: 시그널의 특성을 잘 모르시는 분들은 안 사용하시는 것이 좋을 듯
: : 시그널이 프로그램이 미치는 영향및 특성은 무엇 입니까 ?
:
: 이미 프로젝트가 90 % 이상 진행 되어 버렸구~~ 돌이키기엔 너무 멀리 와버 렸
: 습니다. 버그를 잡아야 할텐데 ...
:
: 조그만 힌트라도 도와 주세요~~
: 그럼
일반적으로 커널과 사용자 프로그램 동기화 방법중에서 빈번하지 않은 경우에
는 시그널을 사용하는 것이 맞는데..
사용이 빈번해 질때는... 문제가 생깁니다. 시그널이 사용자 프로그램에서 수
행되기 때문에 시그널 핸들러를 사용할때마다.. 빈번한 컨택스트 스위칭 오버
헤드가 발생합니다. (생각보다..심합니다.... RT 시그널에서 데이터를 잃어 버
릴 정도로..)
따라서.. 이런 문제를 처리하기 위해서는 파이프를 사용하거나.. ioctl을 사용
하여 blocking 이벤트를 좀 특별하게 처리하는 방법이 있습니다.
파이프를 사용하려면... 커널 안에서 파일 처리하는 정도만 하시면 됩니다.
물론.. 아주.. 최악의 상황을 생각한다면.. dead lock을 경험하실 수 있겠지만
요..
현지아빠 wrote..
: 안녕하세요~~ 간만에~~ 들리는 군요~~
:
: 프로젝트 막바지에~~ 다달 았습니다 ...
:
: 이제 조금만 하면 끝이 나는데요~~ 엄청난 버그를 발견 했습니다 ...
:
: 지금 현재 제 프로그램은 시그널을 굉장히많이 사용 합니다 ..
:
: 그것두 일반 시그널이 아닌 RTS (Real-time Signal) 을 전부 사용 합니다 ..
:
: 일단 디바이스 드라이버에서 하드웨어 PLL 을 500 hz 로 발생 하고~~
:
: 그러니까 2 ms 마다 .. 인터럽을 띄우고~ 그걸 디바이스 드라이버에서 받으 면
:
: 데이타 프로세서에게 RTS 를 날리고~ 그럼 그 RTS 를 받아서 전 디바이스
:
: ( AD 16 CH, DA 8 CH, DI 32 CH, DO 32 CH, PID 4 CH, ENCORDER CNT 2 CH )
:
: 를읽어 500 HZ Real-time 10 초간격으로 파일링 하고~ 그걸 삼바를 이용
:
: 해서~ 피시쪽에서 가져 옵니다.
:
: 그래서 피시쪽에서 데이타 프로세싱을 하는데요~
:
: 피시에서 UDP로 제어 명령을 내리면 이또한 마찬가지로~ 500 HZ 로 데이타 를
:
: 저장하고 있는 그프로세서에서 RTS 시그널 벡터가 실행됩니다.
:
: 또 암쪽에서 또다른 프로세서가 제어 스크립트엔진을 가지고 있고~ 스크립 트
:
: 언어를 해석 해서 제어를 보낼 필요가 있을때 127.0.0.1 로 UDP 를 송출 하 고
:
: 이또한 500 HZ 로 데이타를 저장하고 있는 그프로세서에서 RTS 시그널 벡터 가
:
: 실행됩니다.
:
: 이렇게 프로그램이 전부 시그널 백터로만 구성 되어 있을 정도 입니다.
:
: 그런데~~ 그 프로세서 에서 실수(float point) 연산을 하면 ... 100 번 계산
:
: 에 1~2 번 정도 계산이 실제로 되지 않습니다.
:
: float A = 10.;
: float B = A / 3.;
: float C = B * 3.;
:
: if(ABS(A - C) < 1.0) 실수 연산이 정상으로 되었다고 판단
: else 실수 연산이 에러가 되었음.
:
: 이런 로직을 메인 루프에 걸어 두면 100 번 계산에 한두번 실제 에러가 발생
:
: 합니다.
:
: 제가 생각 하기엔 시그널 벡터와 실수 연산 사이의 먼가 문제가 있는듯 한 데 ~~
:
: 쩝 도저히 알수가 없습니다 ....
:
: 시그널 벡터를 코딩 할때 주의 해야 할점은 무엇인가요~
:
: 아니면 해결 책이 없는건가요~~
:
: 아래에~ 시리얼 인터럽트 방식에 대해...
:
: 이란글에서 개구리님의 글을 인용하면
:
: "저희가 드린 샘플 소스는 가장 원초적인 방식입니다
: 시그널 핸들러를 사용하시는 방법은 다른 여러가지 요인에 의해서
: 버그가 생길수 있읍니다.
: 그러므로 시그널의 특성을 잘 모르시는 분들은 안 사용하시는 것이
: 좋을 듯 합니다.
: 차라리 poll 함수를 사용하여 다중 입출력 함수를 이용하시는 방법을
: 추천해 드리고 싶습니다."
:
: ==>
: 시그널 핸들러를 사용하시는 방법은 다른 여러가지 요인에 의해서
: 버그가 생길수 있읍니다.
: : 다른여러가지 요인이란 어떤걸 말합니까 ?
:
: ==>
: 시그널의 특성을 잘 모르시는 분들은 안 사용하시는 것이 좋을 듯
: : 시그널이 프로그램이 미치는 영향및 특성은 무엇 입니까 ?
:
: 이미 프로젝트가 90 % 이상 진행 되어 버렸구~~ 돌이키기엔 너무 멀리 와버 렸
: 습니다. 버그를 잡아야 할텐데 ...
:
: 조그만 힌트라도 도와 주세요~~
: 그럼