Intel HEX 파서
Intel HEX 파일을 붙여넣어 모든 레코드의 체크섬을 검증하고, 확장 주소를 계산해 실제로 프로그래밍되는 메모리 영역과 빈틈·중복을 확인합니다.
파일 내용을 붙여넣으세요. 어디로도 전송되지 않고 이 페이지 안에서 해석합니다.
메모리 영역
Contiguous stretches the file actually programs, after every extended address record is applied.
| 시작 | End | 크기 | 바이트 |
|---|---|---|---|
| 0x08000000 | 0x0800001F | 32 B | 32 |
| 0x08001000 | 0x08001003 | 4 B | 4 |
1 gap between regions. A programmer leaves these untouched, so they keep whatever was there before — usually erased flash.
- 0x08000020 – 0x08000FFF (3.97 KiB)
레코드
| 줄 | 종류 | 주소 | Len | 체크섬 | 비고 |
|---|---|---|---|---|---|
| 1 | 04Extended linear address | 0x0000 | 2 | F2 | |
| 2 | 00Data | 0x08000000 | 16 | 73 | |
| 3 | 00Data | 0x08000010 | 16 | 90 | |
| 4 | 00Data | 0x08001000 | 4 | F0 | |
| 5 | 05Start linear address | 0x0000 | 4 | 59 | |
| 6 | 01End of file | 0x0000 | 0 | FF |
이 파일의 레코드 종류
00Data301End of file104Extended linear address105Start linear address1레코드 한 줄의 구조
Intel HEX는 텍스트 형식이고 모든 줄이 콜론으로 시작합니다. 이어지는 바이트의 의미는 고정되어 있습니다.
- 바이트 수 1바이트 — 데이터 필드의 길이
- 주소 2바이트 — 16비트 오프셋
- 레코드 타입 1바이트
- 데이터 — 앞서 선언한 만큼
- 체크섬 1바이트
체크섬은 앞의 모든 바이트를 더해 하위 8비트를 취하고 2의 보수를 구한 값입니다. 체크섬까지 포함해 전부 더하면 0이 되어야 한다는 뜻이기도 합니다.
64KB 경계
주소 필드가 16비트뿐이라 한 레코드가 직접 가리킬 수 있는 범위는 64KB입니다. 요즘 마이크로컨트롤러의 플래시는 그보다 크므로 확장 레코드로 상위 주소를 따로 지정합니다.
타입 04가 상위 16비트를 설정하고, 이후 데이터 레코드의 주소는 그 값에 더해집니다. 확장 레코드를 건너뛰고 읽으면 0x08000000에 있어야 할 코드와 0x08010000에 있어야 할 코드가 같은 16비트 주소로 보여 서로 덮어쓴 것처럼 나타납니다.
파일이 실제로 만드는 메모리 맵
레코드를 하나씩 읽는 것과 파일이 최종적으로 무엇을 프로그래밍하는지는 다른 질문입니다. 이 파서가 연속 구간으로 묶어 보여 주는 이유가 그것입니다.
구간이 여러 개로 나뉘는 것은 정상입니다. 벡터 테이블, 코드, 설정 워드가 서로 떨어진 주소에 있는 것이 보통입니다. 확인할 것은 구간의 개수가 아니라 예상한 위치에 예상한 크기로 있는지입니다.
중복 구간은 대개 사고입니다
같은 주소에 두 번 쓰는 파일은 링커 스크립트가 겹쳤거나 두 이미지를 잘못 이어 붙인 결과인 경우가 많습니다. 프로그래머마다 나중 것으로 덮어쓰거나 오류를 내거나 제각각이라, 어느 쪽이든 의도한 결과가 아닐 가능성이 높습니다.
그래서 이 파서는 겹치는 구간을 따로 표시합니다. 정상적인 빈틈과 구분해서 보세요.
체크섬이 틀렸을 때
텍스트 편집기로 값을 직접 고치고 체크섬을 갱신하지 않는 것이 가장 흔한 원인입니다. 부트로더나 프로그래머는 그런 줄을 거부하고, 도구에 따라 어느 줄인지 알려 주지 않습니다.
파일을 손으로 고쳐야 한다면 고친 줄의 체크섬을 다시 계산하세요. 이 파서가 줄 번호와 함께 어긋난 값을 표시합니다.
시작 주소 레코드
타입 05는 프로그램의 진입점을 담습니다. 대부분의 마이크로컨트롤러는 리셋 벡터에서 시작 주소를 읽으므로 이 레코드를 무시하지만, 일부 부트로더는 참고합니다.
S-record 형식을 다룬다면 S-record 파서 쪽입니다. 구조는 비슷하지만 레코드 타입 체계와 주소 폭 표기가 다릅니다.
자주 묻는 질문
주소가 64KB에서 되돌아갑니다.
데이터 레코드의 주소 필드가 16비트뿐이기 때문입니다. 그보다 큰 주소는 확장 레코드(타입 04 또는 02)가 상위 비트를 따로 지정하고, 이후 데이터 레코드는 그 기준에 더해집니다. 확장 레코드를 무시하고 읽으면 서로 다른 영역이 같은 주소에 겹쳐 보입니다.
레코드 타입이 무엇을 뜻하나요?
00은 데이터, 01은 파일 끝, 04는 확장 선형 주소, 02는 확장 세그먼트 주소, 05는 시작 선형 주소, 03은 시작 세그먼트 주소입니다. 대부분의 파일은 00, 04, 05, 01만 씁니다. 02와 03은 x86 실모드 시절의 형식이라 임베디드 툴체인에서는 거의 나오지 않습니다.
체크섬은 어떻게 계산하나요?
콜론 다음부터 체크섬 앞까지의 모든 바이트를 더하고, 하위 8비트를 취해 2의 보수를 구합니다. 다르게 말하면 체크섬을 포함한 모든 바이트의 합이 0이 되어야 합니다. 텍스트 편집기로 값을 고치고 체크섬을 갱신하지 않으면 부트로더가 파일을 거부합니다.
메모리 영역에 빈틈이 있어도 되나요?
문제없습니다. Intel HEX는 연속된 이미지가 아니라 "이 주소에 이 바이트들을 쓰라"는 지시의 나열입니다. 코드와 설정 영역이 떨어져 있으면 빈틈이 생기는 것이 정상입니다. 다만 빈틈에 무엇이 남는지는 파일이 정하지 않으므로, 지워진 상태를 가정한다면 프로그래밍 전에 지우는 절차가 필요합니다.
같은 주소가 두 번 나오면 어떻게 되나요?
도구마다 다르게 처리합니다. 나중 것으로 덮어쓰는 경우가 많지만 오류로 처리하는 프로그래머도 있습니다. 링커 스크립트가 잘못됐거나 두 이미지를 잘못 합친 신호일 때가 많아서, 이 파서는 중복 구간을 따로 표시합니다.