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로 바꿉니다.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.