[근무 일지] 22.03~04

타키탸키·2022년 3월 11일
0

근무 일지

목록 보기
4/16
post-thumbnail

SNET Interrupt API test

03.10 ~ 03.11

  • 경과 시간이 평소보다 2배 증가하는 문제
    • 제어기와 연결된 서보 전원이 차단되어 발생
    • OS 설정 상, 제어기가 서보와 연결이 되어야 설정값이 반영되도록 되어 있다
  • 프로그램에서 인터럽트를 받지 못하는 문제
    • Wireshark를 통해 전송 패킷 체크
    • 제어기가 자기 자신에게 인터럽트를 송신하여 발생
    • OS 업데이트가 안 된 제어기로 실험하여 발생
  • Interrupt 응답이 처리되지 않는 문제
    • API 상에서 interrupt를 저장하는 Queue가 push 후에 release하는 부분이 부재하여 발생한 문제
    • push 함수 내부에서 interrupt type을 정하는 변수의 비트 연산 오류

03.16

  • 콜백 함수를 활용한 eventFunction 방법이 나머지 방식에 비해 현저히 느린 문제
    • API 상에서 시간 해상도 조절
      • timeBeginPeriod / timeEndPeriod
    • I/O 출력인 Debug 코드 순서를 EventWaitHandle을 set하는 코드 아래 배치
      • set을 먼저함으로써 시간이 줄어들었다

03.18

  • 장기 aging test
    • 17일 오후 6시 반 경부터 프로그램을 무한으로 구동
    • 5000번째(약 11시간 경과)에서 동작 멈춘 것을 확인
      • 한 번이라도 멈추면 안 되기 때문에 원인 분석 필요함
    • 제어기 설정 상, 최대 count가 5000인 것으로 확인
  • OS 업데이트 후, 프로그램 동작 이상
    • min 값이 매우 작게 측정 됨
    • max 값이 구동을 두 번 반복했을 때 걸리는 시간과 유사한 값으로 측정됨
    • Polling 방식은 이상 없음
      • Interrupt API를 활용한 방식에서만 문제 발생
    • wireshark 확인 결과
      • 제어기와 PC 사이의 송수신 이상 없음
      • 특정 값이 주기적으로 중복 전송 됨(19-25)
    • 기존 DLL로 복구 후에도 같은 문제 발생
      • API가 아닌 사용 방법에서의 문제로 예상

03.21

  • 선임님이 작성하신 문서를 토대로 디버깅 진행
    • 팀장님이 제공해주신 dll 파일과 문서 사이의 차이 없음
    • debug 모드로 build하여 생성된 pdb 파일 활용
    • Multi Thread 진입 불가
  • 업데이트 된 OS와 기존 코드의 충돌이 원인인 것으로 확인
    • 기존 코드에는 왕복 운동을 위해 'startPos-endPos-startPos' 방식으로 구현
    • 업데이트 된 OS에서는 지령 위치와 현재 위치가 같으면 인터럽트가 발생
      • min이 아주 작은 값으로 측정된 이유
      • 지령 위치와 현재 위치가 달라야 한다
    • startPos-endPos 방식으로 코드 수정
      • 정상 동작 확인
  • RepeatNum
    • 기존 코드 수정에 따라 반복 구동 횟수의 정의 변경 필요함
    • 반복 구동보다는 구동 횟수에 더 가까운 기능
  • Log Form의 Load 버튼 클릭 시, 긴 로딩 시간 문제
    • 디버깅을 위해 MS Server에 접속하는 symbol 설정을 해두었다
    • Microsoft Symbol Servers를 체크 해제 하니 정상 동작

03.22

  • Function 타입 aging test 결과
    • 멈추지 않고 무한 동작
    • avg 값이 기존보다 높게 측정
      • 바뀐 dll이 timeBeginPeriod를 설정하지 않음
  • 최종 dll이 배포될 때까지 aging test 연기
    • 문서화 작업부터 시작할 것

03.25

  • 문서화 작업 진행 중
  • 최신 dll 반영 이후, 동작 이상
    • Function 타입으로 테스트 후, Event 방식으로 테스트하면, count error
      • 기존 dll에서는 event count가 존재하면 wait을 무시하는 조건으로 설계 됨
      • 사용자가 미리 event를 설정한 후, wait을 부르기 때문에 해당 조건 삭제
    • ClearInterruptEventTable 함수 사용
      • 양상은 다르지만 유사한 count error 발생
      • EraseIntteruptTable 함수의 조건문이 잘못 설정되어 발생한 문제
      • returnCode의 success는 0인데 true와 같은 값으로 잘못 작성 됨
      • 해당 코드 수정 후, 정상 동작 확인

03.28

  • 문서화 작업 완료
  • aging test 준비

03.29

  • InterruptFunction aging test 결과
    • 멈춤 없이 6666회까지 구동
    • dll 업데이트 이후, Event 방식에 거의 근사한 수치를 보이고 있다
    • Polling 방식에 비해 압도적으로 빠르다

04.01

  • 새로운 DLL 적용 후
    • 단기 테스트(10회)에서 FunctionEvent보다 빠른 결과 등장
    • Function: 80,022msec
      - Event: 80,023msec
    • 단기 테스트에서 두 방식 모두 80,022msec에 근접한 수치를 일정하게 보인다
    • 장기 테스트(100회)에서는 여전히 Event가 더 빠르다
    • Event의 시간 밀도가 높아서 최종적으로는 더 빠른 결과가 나오는 것으로 유추해 볼 수 있다

주저리

  • 프로그래밍에는 디버깅이 매우 중요한 것 같다
    • 디버깅을 통해 문제를 발견할 수 있다
  • 제품 특성 상, 유사한 문제가 발생할 수 있기 때문에 작성한 코드에 대해 정확히 이해하고 있어야 한다
    • 추후, 같은 문제 발생 시 곧바로 해결 가능하다
  • 팀원과의 소통이 항상 중요하다
    • 변경 되었거나 이상 사항이 있으면 즉시 보고할 것
    • git의 경우에 타인의 수정 사항을 반영하지 않고 독단적으로 수정하면 merge 시, conflict가 발생하므로 특히 주의할 것
  • 수정할 내용은 하나씩 차례대로 적용할 것
    • 한꺼번에 적용하면 뭐가 문제인지 알 수 없다
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글