스타트업 때 인터럽트 벡터를 플래시에서 RAM으로 복사 (ARM7)

기술노트 27158

아키텍처:

ARM

컴포넌트:

general

업데이트:

2021-07-15 오후 9:47

소개

이 기술 노트에서는 RAM에서 ARM7/9 인터럽트 벡터를 찾고 시작 코드에서 인터럽트 벡터를 자동으로 초기화하는 방법에 대해 설명합니다.

참고

시뮬레이터 사용

예제 프로젝트(27158.zip)는 시뮬레이터에 대해 작성되고 디버깅됩니다. 시뮬레이터는 이 기술 노트의 초점이 시작 시 벡터 테이블 초기화 메커니즘에 있기 때문에 충분히 좋습니다.

시뮬레이션된 장치의 메모리 맵에 대한 가정

디바이스가...

Flash at 0x1000000 to 0x100FFFF

...

RAM at 0x2000000 to 0x2007FFF

...시작 시에 플래시를 에 미러링하고...

0x0000000 to 0x000FFFF

...다시 매핑한 후 RAM이 에 미러링된다고 가정합니다...

0x0000000 to 0x0007FFF

Remap (본 예제에서는 다루지 않음)

리맵은 다른 칩 공급업체의 ARM7/9 기기에서 리맵을 수행하는 것과 같이 여기서는 다루지 않습니다.

이론적 가정(이 기술 노트와 그 예에서)은 리맵이 초기화가 이루어지기 전에 __low_level_init()에서 수행된다는 것이다.

해결방법

이 해결방법을 선택해야 하는 이유

IAR ILINK 링커는 일반적으로 벡터 테이블의 복사 초기화를 위한 코드를 생성하지 않는다. 그러나 IARILINK 링커에는 벡터 테이블을 초기화해야 한다는 정보가 있습니다.

startup .s 파일에 추가

다음이 추가되어야 합니다:

  • 두 번째 벡터 테이블, 즉 RAM에 위치할 벡터 테이블을 추가합니다. (예를 들어, RAM 벡터 테이블은 원본 벡터 테이블의 소스 코드의 복사 붙여넣기일 뿐입니다.)
  • 이 벡터 테이블을 자체 섹션에 배치합니다. (예에서 이 섹션에는 .intvec_RAM이라는 이름이 있습니다.)
  • 벡터 테이블에 자체 레이블을 지정합니다. (예에서 이 레이블은 __vector_RAM)
  • 벡터 테이블의 레이블 위에 있는 라인에 이 특수 레이블 __iar_init$$done을 추가합니다. (이 레이블은 ILINK에 이 벡터 테이블을 시작할 때 초기화해도 괜찮다고 말합니다.)

.icf 파일에 추가

.icf 파일에 변경점:

define symbol _region_COPY_start__ = 0x00;
define symbol _region_COPY_end__ = 0x7F;
define region COPY_region = mem:[from _region_COPY_start__ to _region_COPY_end__];

initialize by copy { section .intvec_RAM };
define block RamCode { section .intvec_RAM };
define block RamCodeInit { section .intvec_RAM_init };
place in ROM_region { block RamCodeInit };
place in COPY_region { block RamCode };

세부사항은:

해당 라인이...

define symbol _region_COPY_start__   = 0x00;
define symbol _region_COPY_end__     = 0x7F;
define region COPY_region = mem:[from _region_COPY_start__ to _region_COPY_end__];

...복사를 수행할 영역을 정의하기 위해 추가됩니다.

해당 라인이...

initialize by copy { section .intvec_RAM };

...섹션을 초기화해야 함을 ILINK에 알립니다.

In the line...

define block RamCodeInit { section .intvec_RAM_init };

...section .intvec_RAM_init 파트는 ILINK에 알립니다(블록이 섹션 section .intvec_RAM에 대한 이니셜라이저 데이터를 보관하도록 하는 문자열 사용).

.icf 파일의 마지막 변화는 IARILINK 링커가 RAM과 플래시 메모리의 가장 낮은 0x80 바이트에 '정상' 데이터/코드를 배치하지 않아야 한다는 것이다. 따라서 시작 주소는 다음과 같이 조정됩니다.

define symbol __ICFEDIT_region_ROM_start__ = 0x1000080;
define symbol __ICFEDIT_region_RAM_start__ = 0x2000080;

예제를 사용하기 위해

빌드

IAR Embedded Workbench for ARM의 모든 편집기 탭을 닫고 프로젝트를 다시 구성하십시오.

디버깅 시작

C-SPY를 시작합니다. 애플리케이션이 라벨 __iar_program_start에서 중지됩니다. 메모리 창에서 볼 수 있듯이 이는 의도적인 것으로서 주소 0x00(이상)의 메모리가 모두 0입니다.

Perform Go

중단점이 있으므로 프로그램이 main()에서 중지됩니다. 이제 메모리 창에서 주소가 0x00(이상) 복사된 벡터 테이블을 고정하는 것을 볼 수 있습니다.

 

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

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