S-Record는 모토로라가 1970년대 개발한 파일 포맷으로, 16진수 ASCII (아스키) 코드로 되어 있다. 보통 Flash memory, EEPROM 등에 데이터를 전송하기 위해서 Intel-Hex 포맷과 함께 많이 사용된다.
이 파일 포맷은 SRecord, SRecord19, SREC, S19, S28, S37 등으로 불리고 있으며, 확장자는 보통 S19 또는 SREC이다.
여기에서 S19는 16bit 주소를 갖는 데이터 형식을 말한다.
* S-Record 파일 포맷
파일의 기본형식은 다음과 같다.
헤더를 제외한 모든 포맷은 Hex를 아스키로 표현하고 있다.
헤더는 처음 S 문자가 가장 앞에 고정값으로 들어간다. S문자는 ASCII로 0x53이다.
S 이외의 문자는 모두 ASCII-Hex 포맷이다. 예를 들어, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F로 표현되며 ASCII로 봤을 때, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46으로 표현될 수 있다.
다음의 S-record 파일 예를 보자.
S00A000001020304050607D9
S1137AF00A0A0D0000000000000000000000000061
S11300004D5A90000300000004000000FFFF0000B0
S1130010B8000000000000004000000000000000E4
S9030000FC
ASCII로 보면 0x53 0x30 0x30 ~ 와 같이 Hex 데이터를 ASCII로 표현하고 있다. 이는 Intel-Hex와 매우 유사하다.
Intel-Hex는 다음과 같은 형식이다.
:100000004D5A90000300000004000000FFFF0000B4
:10001000B8000000000000004000000000000000E8
:1000200000000000000000000000000000000000D0
* Header와 Record type
Record type은 S0 ~ S9로 표현된다. 각 타입은 다음과 같은 의미를 가지고 있다.
< 헤더 타입 >
파일의 헤더 타입은 보통 S0로 표현한다.
S0 : 파일 헤더. Address는 16bit address(4 bytes)로써 항상 0이다.
< 데이터 타입 >
데이터 타입은 데이터가 위치할 주소의 바이트 수에 따라서 S1, S2, S3으로 표현한다.
S1 : 16bit address(ASCII 4 bytes)를 갖는 데이터
S2 : 24bit address(ASCII 6 bytes)를 갖는 데이터
S3 : 32bit address(ASCII 8 bytes)를 갖는 데이터
< 종료 타입 >
만약 S1이로 이루어진 데이터라면 종료 타입은 S9가 사용된다.
S9 : S1과 짝이다. Count는 항상 0x0003이고, data 영역은 없다.
S8 : S2와 짝이다. Count는 항상 0x0004이고, data 영역은 없다.
S7 : S3와 짝이다. Count는 항상 0x0005이고, data 영역은 없다.
이러한 이유로, 확장자가 S19로 되어 있는 파일은 보통 16 bits의 주소를 갖는 데이터가 들어 있다.
< 옵션 타입 >
옵션으로 생략 가능한 레코드 타입이다.
S5 : 현재까지 data record를 몇 개 썼는지 표시한다. Count는 항상 0x0003이고, address 영역은 없으며,
데이터 영역은 16 bits로 현재까지 작성된 레코드 개수를 표현한다.
< 그 외 기타 타입 >
S4와 S6은 사용되지 않는다.
* Count, Address, Data, Checksum
실제 데이터의 구성에 대해서 알아보자.
< Count >
Count카운트는 Address + Data + Checksum의 바이트 수이다. Record type에 관계없이 모두 동일하게 2바이트(8 bits)로 표현된다. 보통 한 줄에 16 bytes, 24 bytes, 32 bytes의 데이터를 쓰기 때문에, 8 bits로 충분히 표현이 가능하다.
< Address >
* 타깃에 따라서 16 bytes, 24 bytes, 32 bytes 등의 주소를 갖는 바이너리가 있을 것이다. 이를 기반으로 Record type을 결정하고 그에 따라 address 바이트 수가 결정된다.
S10A1234FFFFFFFFFFFFFFB6
S20B123456FFFFFFFFFFFFFF5F
S31212345678FFFFFFFFFFFFFFFFFFFFFFFFFFE6
< Data >
Data실제 데이터를 Hex-ASCII로 표현한다. 예를 들어 Hex값 0x19는 ASCII값 1과 9로 표현한다.
< Checksum >
Checksum은 count + address + data의 1의 보수이다. 예를 들어 다음과 같은 데이터가 있다고 가정하자.
S10A1234FFFFFFFFFFFFFFB6
0x0A + 0x12 + 0x34 + 0xFF + 0xFF + 0xFF + 0xFF + 0xFF + 0xFF + 0xFF = 0x749이다. 이를 1의 보수로 계산하면, 0xFF - 0x49 = 0xB6 이 된다.
< Last character >
0x0D, 0x0A
Last마지막 문자는 마지막 문자로 많이 사용되는 '\r\n'이다. Carrriage Return + Line Feed이다.
Hex값으로는 0x0D 0x0A 이기 때문에, S-Record 파일을 메모장 등으로 보면 보이지 않는다.
* VSCODE로 보기
마지막 팁으로, VSCODE의 언어 선택 모드를 변경해서 SRecord 형식으로 볼 수 있다. S-Record 형식의 바이너리 구조를 쉽게 파악할 수 있다.
'개발' 카테고리의 다른 글
[윈도우] 배치파일 명령어 setlocal 사용 방법 (0) | 2022.03.24 |
---|---|
[윈도우] 배치파일 문법 setlocal EnableDelayedExpansion 사용하기 (0) | 2022.03.24 |
자바스크립트(JavaScript) 기초 문법 - 초급 (0) | 2022.03.13 |
가속도 센서(Acceleration sensor) 개발하기. g? G? (0) | 2022.02.28 |
시리얼 통신 - VScode로 Serial log 보기 (Serial Port Helper) (0) | 2022.02.11 |
댓글