안녕하세요.

예전에 마이컴으로 HDLC 10Mbps 처리하는 프로젝트에 대해서 거의 성공했다고 말씀드린적이 있습니다.

나름 뿌듯해하고 있었는데, 다시 난관을 만났었습니다. 항상 지뢰밭이 연속

문제를 만났을 때 해결 방법에 대한 글로 읽어도 좋으므로 , 이쪽 관련 기술이 아니더라도

문제 해결 및 디버깅에 도움이 되실 거 같습니다.

신호 레벨은 RS-485 라 짧은 거리에서는 문제없이 잘 동작합니다.

그런데 테스트 조건이 10Mbps 로 무려 쉴드케이블 200M 24시간 동작 조건입니다.

저는 당연히 이 문제는 하드웨어에서만 해결하면 되겠지하고 테스트 했는데 웬걸

100ms 당 20-30번 이상 CRC 에러나 길이 에러가 발생하네요.

순간 무얼 수정해야 할지 멍해지면서 역시 FPGA 를 사용했었어햐 하는 생각이 막 들더군요.

그런데 돌아가기에는 너무 먼길을 왔지요.

저의 디버깅 순서는

1. HW 문제 일까 SW 문제일까?

- 확인 방법 : FPGA 로 동작하는 다른 회사 제품의 RS-485로직에서 점퍼를 띄워서 , 개발품에 입력시키면

485 HW 로직인지 SW 문제인지 판별이 될꺼야.

-결론 : HW 문제로 내심 기대했지만 동일한 에러가 발생하므로 SW 문제였습니다.

2. SW 문제라면 왜 놓치는 걸까?

- 확인 방법 : 놓치는 순간의 신호가 무언까 찌그러 질꺼야. 타이밍이 안 맞겠지

로직 아날라이저로 깨진 신호만 패턴 시간을 하나하나 읽어서 따라가봄.

역시 100ns 단위의 칼 같았던 신호가 , 80ns 90ns 뭉개져 있었음. 될때도 있고 안될때고 있고.

- 결론 : 데이터 파싱시 edge 떨어지마 마자 인식하도록 해놓았는데 노이즈로 데이터가 뭉게질때 놓치는 것 같음.

3. 위 가정을 설립하고 해결 방법 도출

- 고민 : 만약 펄스 중앙에서 읽는데 이런 현상은 DMA 타이밍이 흔들리는 것 밖에 없음.

아니면 펄스 중앙에서 읽지 않는 다는 것. 둘 중 하나임.

- 확인 방법 : DMA 읽어가는 속도가 흔들리는 거는 가능성이 낮고 , 2번째 가설이 확율이 높음.

그러나 언제 정확하게 DMA 가 읽어가는지 눈으로 타이밍 확인이 불가능 함.

정말 edge 근처인지 읽는건지 알수가 없음. 현재 정보로는 대략 edge 이후 60ns 근처로

거의 중앙에서 읽는 것으로 추정만 됨. -> 그렇다면 해당 문제는 없어야 함.

- 실행 : 읽는 타이밍을 카운터를 적당히 중간값으로 변경후 확인해보았으나 동일.

여기서 좌절. 해당 가설이 맞지가 않나..

이제 미궁속으로 빠짐. 어떻게 해야할지 머리가 하얗게 변함.

4. 해결 시도

- 23년의 해결 노하우 총동원 (별거 아닙니다. 불안한 마음을 잠재우고 심리 상태를 편하게 만들어

최대한 집중도를 높이는 방법이지요)

1) 편안한 배경음악 틀기

- 몇년마다 발생하는 이런 현상에 대비하기 위한 나만의 음악 플레이 리스트 재생

- 해당 플레이 리스트는 효과를 극대화 하기 위하여 평소에는 절대 재생하지 않으며

위와 같은 절체 절명의 순간에서만 재생. 23년간 한 6-7번만 사용함.

2) 혼잣말하며 주변 산책

3) 다시 처음부터 내 생각에 오류가 없는지 차근차근 되집어봄.

4) 아무나 붙잡고 내 생각의 설명함 (러버덕코딩 기법)

- > 최근 그 아무나에 대한 부작용이 심각( 그 사람은 매우 피곤해 하기 때문에) 하여 사용을 자제하고 있었음.

5. 해결

1) 2시간의 집중 처방 이후 아이디어 떠오름

2) 타이밍 카운터를 임의로 중간값만 해보았는데 , 그냥 한칸식 밀면서 하나씩 해보자. 250번만 해보면 되겠네.

3) 1씩 증가시켜가며 컴파일 테스트 반복.

4) 어라 특정 값 범위부터 동작함. 유레카!

5) 자 그럼 안되는 값 범위를 찾아. 다시 1씩 증가시켜가며 컴파일 테스트 반복.

6) 동작잘하는 범위 확보. 따라서 최종 값은 최소값과 최대값의 중간 값.

7) 나머지 속도도 마찬가지로 테스트.

-> 숫자 1 바꾸고 컴파일하고 해당 값 범위 찾고 수시간 소요.

8) 모든 속도에서 정확하다고 생각되는 지연값 검출.

6. 결론.

1) 노이즈에 따른 신호 타이밍 흔들림이 맞으며 소프트웨어로 중간에서 읽어가도록 변경하여 해결.

2) 24시간 동안 한번의 데이터 누락없이 파싱 성공.

7. 어려운 프로젝트의 보상 - 지식 부스러기들

1) 2.5Mbps 에서 부터 종단 저항없이는 200m 라인 사용이 어려움.

6-700kbps 아래는 종단 저항없이 쉴드케이블 200m 정도는 가뿐히 동작.

UART 신호라면 over sampling 되는 uart 나 아예 gpio로 만들면 해결될 것으로 보임.

2) DMA 타이머 동작은 믿을만 하다. 항상 그렇지만 내가 문제.

3) 역시 내 음악 플레이 리스트의 효과가 좋구나.

4) 예전에는 이런 문제는 한달이상 소요되었는데 하루안에 되는 걸 보면 나도 이제 고인물?

5) 최적화를 거급하다보니 10Mpbs 에서 읽어내기가 초기에는 매우 빠듯했는데 , 이제는 RX TX 사이에

딜레이를 걸고 동작시킴. 너무 최적화했나..여유가 있으니 중간에 로직 처리를 더 넣더라도 마음이 편안함.

6) 현재 MCU 에서 20Mbps 읽기도 가능할거 같으나 스펙이 아니므로 그냥 할수 있을거 같다 정도..

7) 현재 MCU 가 최소의 사양으로 생각되었으나, 더더욱 노력하면 더 저가의 MCU 및 클럭으로도 가능할 것 같은

생각이 드나, 나는 용역이므로 여기서 마무리. 근데 자꾸 원가를 절감하지 않으면 무언가 마음 한켠이

불편함. 예전에는 남이 안하는 거 오버해서 제공했으나 프로는 돈보다 10-20%만 더해주면 됨.

더 해주면 내 손해, 고객 이익이 아니라 . 나도 손해, 장기적으로 고객도 손해. 이 시장의 다른 분들에게도 손해.

8) MCU 풀로 동작키시니 10Mbps 에서는 꽤 열이 발생. 항온조 테스트시 염려할 정도는 아니나

차가운 FPGA 에 비하면 없어보이는 정도. 이거는 MCU 의 한계. 전류 소모가 많음.

처리 속도를 낮추면 기가막히게 온도가 내려감. 100ns가 나름 MCU 입장에서는 빡신가 봄.

이제 해당 제품은 공식 인증절차에 들어가게 되는데 남은 지뢰가 얼마나 될지..걱정이지만 잘 될거라 봅니다.

+ Recent posts