도와주세요!!
글 수 15,339
2004.06.08 20:09:50 (*.88.50.18)
6661
안녕하세요~~ 간만에~~ 들리는 군요~~
프로젝트 막바지에~~ 다달 았습니다 ...
이제 조금만 하면 끝이 나는데요~~ 엄청난 버그를 발견 했습니다 ...
지금 현재 제 프로그램은 시그널을 굉장히많이 사용 합니다 ..
그것두 일반 시그널이 아닌 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 % 이상 진행 되어 버렸구~~ 돌이키기엔 너무 멀리 와버렸
습니다. 버그를 잡아야 할텐데 ...
조그만 힌트라도 도와 주세요~~
그럼
프로젝트 막바지에~~ 다달 았습니다 ...
이제 조금만 하면 끝이 나는데요~~ 엄청난 버그를 발견 했습니다 ...
지금 현재 제 프로그램은 시그널을 굉장히많이 사용 합니다 ..
그것두 일반 시그널이 아닌 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 % 이상 진행 되어 버렸구~~ 돌이키기엔 너무 멀리 와버렸
습니다. 버그를 잡아야 할텐데 ...
조그만 힌트라도 도와 주세요~~
그럼