CPU-I/O 카드 데이터 동기화 문제

주싱·2021년 8월 8일
0

Trouble Shooting

목록 보기
5/21

1553B 통신 I/O 드라이버를 개발을 하면서 만났던 이슈에 대한 트러블 슈팅 과정을 정리합니다.

문제 현상

CPU와 I/O 카드(1553B)가 동시에 비동기적으로 데이터 블럭에 접근하게 됨으로 이전 데이터와 최신 데이터가 섞이는 문제가 발생하였습니다.

처리 과정

  1. I/O 칩 메뉴얼에는 위와 같은 상황을 위해 데이터 동기화 기법(Double Buffering)을 적용할 수 있다고 설명되어 있었지만, 제조사에서 제공하는 소프트웨어 라이브러리에서는 해당 기능을 제공하고 있지 않았습니다.
  2. 제조사에 문의한 결과 해당 기능이 라이브러리에 누락되어 있었고, 제조사에서는 내부적인 사정으로 라이브러리를 수정해 줄 수 없다는 답변을 받았습니다.
  3. 여러 번의 협의 과정을 거쳐 최종적으로 보안서약서를 쓰고 제조사로부터 소스코드를 받아서 직접 라이브러리를 수정해서 사용하기로 했습니다.
  4. 아래와 같이 제조사의 소스코드를 받아서 Double Buffering 기법을 적용하고, Ping-Pong 로직을 직접 구현하여 고객에게 안정적인 장치 드라이버를 제공할 수 있었습니다.

Before

dwDataBlkAddr = pNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr;

After

dwOldDataBlkAddr = FLEXMEMREAD(DevNum, (pMsgNode->U.Message.pMemNode->U.MemBlock.dwAceAddr + 2));

if (dwOldDataBlkAddr == pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr)
{
	dwNewDataBlkAddr = pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr + BC_DUAL_MSG_SIZE;
}
else
{
	dwNewDataBlkAddr = pDataNode->U.DataBlock.pMemNode->U.MemBlock.dwAceAddr;
}
profile
소프트웨어 엔지니어, 일상

0개의 댓글