FirmGod

S-record 파서

Motorola S-record 파일을 레코드별로 검증하고, 체크섬과 종료 레코드 불일치를 표시하며, 파일이 실제로 프로그래밍하는 영역을 보여 줍니다.

파일 내용을 붙여넣으세요. 어디로도 전송되지 않고 이 페이지 안에서 해석합니다.

예시
레코드70 with problems
데이터 바이트52 B4 data records
주소 범위0x00000000to 0x00000033
진입점0x00000000

Header (S0): HDR — a module name or build string. Programmers ignore it, so it never reaches the device.

메모리 영역

파일이 실제로 프로그래밍하는 연속 구간입니다.

시작End크기바이트
0x000000000x0000003352 B52

레코드

줄종류주소개수데이터체크섬비고
1S0Header0x00000000631B
2S1Data, 16-bit address0x0000000019162A
3S1Data, 16-bit address0x00000010191613
4S1Data, 16-bit address0x00000020191652
5S1Data, 16-bit address0x000000307492
6S5Record count, 16-bit0x0000000430F8
7S9Termination, 16-bit start address0x0000000030FC

이 파일의 레코드 종류

S0Header1
S1Data, 16-bit addressclosed by S94
S5Record count, 16-bit1
S9Termination, 16-bit start address1

레코드 한 줄의 구조

S-record는 텍스트 형식이고 모든 줄이 S와 숫자 한 자리로 시작합니다. 그 숫자가 레코드 타입이고 나머지 구조를 결정합니다.

  • 타입 — S0부터 S9까지
  • 길이 1바이트 — 주소 + 데이터 + 체크섬의 바이트 수
  • 주소 — 타입에 따라 2, 3, 4바이트
  • 데이터
  • 체크섬 1바이트

길이 필드가 주소와 체크섬까지 포함한다는 점이 Intel HEX와 다릅니다. 데이터 길이만 세는 습관으로 읽으면 모든 레코드의 경계가 어긋납니다.

주소 폭이 타입을 정합니다

  • S1 — 16비트 주소. 종료 레코드는 S9.
  • S2 — 24비트 주소. 종료 레코드는 S8.
  • S3 — 32비트 주소. 종료 레코드는 S7.

짝이 맞아야 합니다. S3 데이터 레코드를 쓰면서 S9로 끝내는 파일은 규격에 어긋나고, 도구에 따라 거부됩니다. 이 파서가 종료 레코드의 짝을 확인하는 이유입니다.

체크섬은 1의 보수입니다

길이 필드부터 데이터 끝까지의 바이트를 모두 더하고, 하위 8비트를 취해 1의 보수를 구합니다. 비트를 뒤집는 것이지 부호를 바꾸는 것이 아닙니다.

Intel HEX는 2의 보수라 한 자리 차이가 납니다. 두 형식을 모두 다루는 코드를 쓴다면 이 부분을 분기해야 하고, 잘못 적용하면 모든 줄이 1만큼 틀린 것으로 나옵니다.

S0과 S5는 데이터가 아닙니다

S0은 헤더입니다. 주소는 보통 0이고 데이터에 파일 이름이나 생성 도구 정보가 들어갑니다. 프로그래밍 대상이 아니라 메모리 맵에서 빠집니다.

S5는 앞선 데이터 레코드의 개수를 담는 선택적 레코드입니다. 없어도 유효하지만, 있다면 실제 개수와 맞는지 확인할 가치가 있습니다. 어긋난다면 파일이 잘렸거나 줄이 빠진 것입니다.

파일이 실제로 프로그래밍하는 영역

레코드는 흩어진 지시의 나열이고, 중요한 것은 그것을 모두 적용했을 때 어떤 주소 구간이 채워지는가 입니다. 이 파서가 연속 구간으로 묶어 보여 줍니다.

구간이 여러 개로 나뉘는 것은 정상입니다. 벡터 테이블과 코드, 설정 영역이 떨어져 있는 것이 보통입니다. 확인할 것은 개수가 아니라 예상한 위치에 예상한 크기로 있는지입니다.

Intel HEX와 함께 쓸 때

같은 이미지를 두 형식으로 내보내 비교하는 경우가 있습니다. 메모리 맵이 같아야 하고, 다르다면 변환 과정에서 확장 주소나 레코드 경계 처리가 잘못된 것입니다.

Intel HEX 쪽은 Intel HEX 파서에서 같은 방식으로 확인할 수 있습니다.

자주 묻는 질문

S1, S2, S3는 무엇이 다른가요?

주소 폭입니다. S1은 16비트, S2는 24비트, S3는 32비트 주소를 씁니다. 파일 하나에 섞여 있을 수 있고, 툴체인이 필요한 만큼만 고릅니다. 종료 레코드도 짝이 맞아야 해서 S3에는 S7, S2에는 S8, S1에는 S9가 옵니다.

체크섬 계산이 Intel HEX와 다른가요?

다릅니다. S-record는 길이 필드부터 데이터 끝까지를 더해 하위 8비트를 취하고 1의 보수를 구합니다. Intel HEX는 2의 보수입니다. 한 형식의 계산을 다른 형식에 적용하면 모든 줄이 틀린 것으로 나옵니다.

길이 필드에 무엇이 들어가나요?

주소와 데이터와 체크섬을 합한 바이트 수입니다. 레코드 타입과 길이 필드 자신은 빠집니다. 데이터 길이만 세는 Intel HEX와 다른 지점이라, 두 형식을 같은 코드로 다루려다 어긋나는 부분입니다.

S0 레코드는 무엇인가요?

헤더입니다. 주소 필드는 보통 0이고 데이터에 파일 이름이나 툴체인 정보 같은 텍스트가 들어갑니다. 프로그래밍 대상이 아니므로 메모리 맵에는 포함되지 않습니다.

S5 레코드가 없어도 되나요?

없어도 됩니다. S5는 앞선 데이터 레코드의 개수를 담는 선택적 레코드입니다. 있다면 실제 개수와 맞는지 확인할 가치가 있고, 어긋난다면 파일이 잘렸거나 편집 중에 줄이 빠진 신호입니다.