IELFTOOL Checksum - 체크섬 배치하기
기술노트 62709
아키텍처:
ARM, RH850, RX, SH, STM8
컴포넌트:
general
업데이트:
2021-05-26 오전 10:54
소개
다음은 체크섬을 배치하는 방법입니다.
메모리 끝에 배치하기
Covered in Technical Note 65473.
프로그램 코드 시작 전에 배치하기
define block CHECKSUM { ro section .checksum };
place in ROM_region { ro, first block CHECKSUM };
IAR Embedded Workbench for ARM 으로 만들어진 예제 프로젝트 Example (1 range, 3 diff. locations).zip는, 'PlaceInFirstBlock' 이라는 설정을 사용, 시작 주소를 84로 하고 끝 주소를 ff로 합니다.
주의:
시작주소는 인터럽트 벡터, 체크섬 값 뒤에 위치합니다. 이러한 경우, 체크섬 계산이 인터럽트 벡터를 포함하지 않기 때문입니다. (일반적으로 주소 0x0
에 위치하고 특정한 'place at
' 지시어로 배치됨)
프로그램 코드 끝 뒤에 배치하기
define block CHECKSUM { ro section .checksum };
place in ROM_region { ro, last block CHECKSUM };
상기의 예제 프로젝트 'Example (1 range, 3 diff. locations)', 'PlaceInLastBlock'로 설정, 시작 주소를 0x0
로 하고 끝 주소를 0x296B
로 한다. 개발 중에 실제 프로그램의 최종 주소는 빌드마다 다르므로, 자주 주소를 변경하는 것은 번거로워질 것입니다(체크섬이 체크섬된 메모리 외부에 배치되어야 하기 때문에). 프로젝트의 배포 단계에서 이 설정을 사용하는 것이 좋습니다. 주의 : 상기 불편함을 극복하려면, 체크섬-시작 마커와 체크섬-끝 마커를 사용하는 대안 방법을 참조하세요.
일반적인 예제 (한 범위)
상기의 예제 'Example (1 range, 3 diff. locations)'는, 실제 제네릭 C 소스를 포함하여 ielftool.exe
가 CRC 계산에서 생성하는 것과 동일한 체크섬 값을 계산합니다. 또한 특정 메모리의 위치에 CHECKSUM
섹션을 배치할 수 있도록 수정된 .icf
파일과 ILINK/IELFTOOL을 위한 IAR Embedded Workbench 셋팅이 포함되어 있습니다.
'Example (1 range, 3 diff. locations)' 예제는 세 가지 IAR Embedded Workbench 프로젝트 설정이 있습니다. 체크섬이 세 가지 다른 방법으로 배치되는 경우:
- ROM의 가장 끝에 배치 (PlaceEndOfROM 설정)
- 프로그램 코드 시작 전에 배치 (PlaceInFirstBlock 설정)
- 프로그램 코드 끝 뒤에 배치(PlaceInLastBlock 설정)
체크섬-시작 마커와 체크섬-끝 마커를 사용하는 대안 방법
체크섬 계산을 위한 일반 절차는 다음과 같습니다. "Options > Linker > Checksum" 대화 상자를 열고 "Fill unused memory"를 활성화 한 뒤, 채우기 패턴을 지정, 주소 범위 ((start address, end address
) 또한 지정합니다 - 다음 "Generate checksum"을 활성화 한 뒤 알고리즘을 지정합니다.
대화 상자를 사용하는데 까다로운 점은 시작주소와 끝주소를 프로그램과 맞도록 조정해야 합니다.
시작 주소는 일반적으로 고정되어 있으나, 끝 주소는 때로 조정될 필요가 있습니다, 이 대안 방법은 이러한 불편한 점을 특별한 심볼을 사용하여 편리하게 사용함에 있습니다(checksum_start
과 checksum_end
).
앞선 예제의 'Example (1 range, 3 diff. locations) PlaceInLastBlock 설정과 비교하여 대안의 예제 Example (alternative solution).zi에서 주 차이점은:
- "Project > Options... > Linker > Checksum 메뉴 > mark "Fill unused code memory"가 선택되어 있지 않습니다.
- C/C++ 소스가
checksum-start
와checksum-end
마커를 추가:
__root const unsigned char checksum_start @ "checksum_start_mark" = 0;
__root const unsigned char checksum_end[4] @ "checksum_end_mark" = {0,0,0,0xEE};
// The last byte is the actual "checksum area end mark"
// Any values can be assigned to the start and end markers.
// The keyword __root is only needed if the source is not referencing these symbols.
- 링커 설정파일이 ROM-block with
fixed order
를 추가
define block ROM_CONTENT with fixed order
{
readonly section checksum_start_mark,
readonly,
readonly section checksum_end_mark,
readonly section checksum
};
place in ROM_region { block ROM_CONTENT };
- C/C++ 소스는 외부 선언을 사용하여 체크섬 값을 참조
extern const unsigned short ielftool_checksum;
- "Project > Options > Linker > Extra Options > Use command line options"는
--place_holder
를 추가하여ielftool_checksum
심볼을 위한 공간을 만들거나 예약하고 --keep는 심볼이 포함되어 있는지 확인합니다.
--place_holder ielftool_checksum,2,checksum,4
--keep=ielftool_checksum
- "Project > Options > Build Actions > Post-build command line"에
ielftool.exe
명령 추가
ielftool --fill 0xFF;checksum_start-checksum_end+3
--checksum ielftool_checksum:2,crc16,0x0;checksum_start-checksum_end+3
--verbose "$TARGET_PATH$" "$TARGET_PATH$"
주의:
블록 ROM_CONTENT
는 일반적으로 0x0
주소에 위치하며, 특정한 "place at
" 지시어로 배치되는 인터럽트 벡터를 포함하지 않습니다. 체크섬 계산에 인터럽트 벡터를 포함하기 위해선, --fill
옵션과 --checksum
옵션에 대한 ielftool.exe
명령 라인에"checksum_start
"를 0x0
로 바꿉니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.