본문 바로가기

Robotics/Software Tech.

CRC(cyclic redundancy checking)

CRC[cyclic redundancy checking]는 통신 링크로 전송되어온 데이터 내에 에러가 있는지 확인하기 위한 방법 중의 하나이다. 송신장치는 전송될 데이터 블록에 16 비트 또는 32 비트 다항식을 적용하여, 그 결과로 얻어진 코드를 그 블록에 덧붙인다. 수신측에서는 데이터에 같은 다항식을 적용하여 그 결과를 송신측이 보내온 결과와 비교한다. 만약 두 개가 일치하면, 그 데이터는 성공적으로 수신된 것이며, 그렇지 않은 경우 그 데이터 블록을 재 송신하도록 송신측에게 요구한다.

ITU-T(이전의 CCITT)는 송신블록에 부가될 코드를 얻는데 사용되는 16 비트 다항식에 대한 표준을 제정했다. IBM의 SDLC와 다른 프로토콜들은 CRC-16과 다른 16 비트 다항식을 사용한다. 16 비트 CRC는 두 개의 비트가 동시에 에러가 난 경우를 포함하여, 일어날 수 있는 모든 에러에 대하여 99.998% 검출을 보장한다. 이 정도의 검출보증은 4 KB 이하의 데이터 블록 전송에는 충분한 것으로 평가되고 있으며, 그 이상의 대량 전송에는 32 비트 CRC가 사용된다. 이더넷과 토큰링 프로토콜에서도 모두 32 비트 CRC를 사용한다.

어떤 기기들 간에 시리얼 통신을 할 경우, 통신중 발생되는 에러를 생각하지 않을 수 없다. 이러한 에러를 검출하는 방법에는 여러가지 기법이 있고, 간단하면서도 많이 쓰이는 방법으로는 Parity bit에 의한 방법과 Check-sum에 의한 방법등이 있다.

그러나, Parity Bit에 의한 방법은 데이타 중에 한꺼번에 2비트나 4비트가 변화하게 되면 검출을 할 수 없고, Check-sum에 의한 방법은 하나의 바이트에서는 +1로 에러, 다른 바이트에서는 -1로 에러일 경우만 해도 에러는 검출이 되지 않는다. 즉, 이들 방법으로는 에러를 검출해 낼 수 있는 확률이 대단이 낮다는 것이다.

따라서 시리얼 통신을 행 할 경우에 에러 검출 방법으로서 가장 보편적으로 사용되고 있는 방법은 아마도 CRC (Cyclical redundancy check)에 의한 방법일 것이다. 또한 이러한 CRC 방법에도 2가지 종류가 사용 되는데, 간단한 용도에서는 CRC-16이라는 방법이 사용되고, 이보다 더욱 정확한 에러 검출이 필요한 경우에는 CRC-32를 사용한다.

여기서는 가장 일반적으로 사용되고 있는 CRC-16에 관한 루틴들을 다루고 있다. 여기서 일반적이라는 말은 원칩 마이크로 프로세서나 마이크로 컨트롤러와 같은 단순 용도를 겨냥한 것이다. 단순한 기기들 간에 시리얼 통신으로 데이타 교환을 할 때, CRC-32는 지나치게 계산 시간이 길어 고성능 PC급 이상에서나 제 속도가 나고, 마이크로 컨트롤러등에서는 이 시간을 감당하기 어렵기 때문이다. CRC-16을 사용했을 경우, 연속된 17비트 에러는 99.9969%, 연속된 18비트 이상의 에러는 99.9984%의 검츌률을 보이므로 실용상 충분히 안정된 방법이다.

각 routine들은 module별로 구성되어 있어, CRC 계산이 필요한 데이타를 이 모듈에 입력만 하면 CRC가 계산되어 결과가 나타난다. 계산되는 예를 다음에 든다.

예) 78h, 3Eh, 9Ch 데이타의 CRC를 구한다.

CRC 변수를 0으로 지운다.

모듈에 78h를 입력한다. --> 78h만의 CRC 결과가 나타난다.

모듈에 3Eh를 입력한다. --> 앞의 78h와 3Eh에 대한 CRC 결과가 나타난다.

모듈에 9Ch를 입력한다. --> 앞의 78h, 3E와 9Ch에 대한 CRC 결과가 나타난다.

이와같이 계산이 필요한 데이타를 모듈에 입력만 시키면 그때 그때 CRC 값이 나타나므로, 데이타 길이에 제한을 받지 않고 사용할 수 있다.