인터럽트 벡터 테이블에 대한 링커 스크립트 섹션 집합이 있습니다. 섹션은 RAM에 있으며 내 코드에 의해 RAM에로드됩니다. 각 벡터는 절대 위치에 있어야하므로 각 벡터에 대해 별도의 섹션 (및 별도의 메모리 영역)이 있습니다.링커 스크립트 섹션의 최소 크기를 강제하십시오.
일부 벡터는 응용 프로그램에서 사용할 수 없지만 다른 벡터는 응용 프로그램에서 사용할 수 없습니다. 복사 코드가 여전히 작동하는지 확인하려면 벡터가 없으면 동등한 공간 인 ROM (2 바이트)이 채워져 있는지 확인해야합니다. 나는 위치 포인터를 앞으로 나아가려고 노력했지만 VMA에만 영향을 미치기 때문에 전혀 도움이되지 못한다.
섹션이 항상 ROM의 필요한 공간을 차지하도록하려면 어떻게해야합니까? 즉, 섹션에 데이터가 없으면 LMA를 어떻게 움직일 수 있습니까?
힌트 또는 팁을 주시면 감사하겠습니다.
OUTPUT_ARCH(msp430)
ENTRY(_start)
MEMORY {
ROM (rx) : ORIGIN = 0x9C02, LENGTH = 0x61FE
VECT1 : ORIGIN = 0x5B80, LENGTH = 0x0002
VECT2 : ORIGIN = 0x5B82, LENGTH = 0x0002
...
VECT63 : ORIGIN = 0x5BFC, LENGTH = 0x0002
}
SECTIONS
{
__interrupt_vector_1 :
{
__vectable_load__ = LOADADDR(__interrupt_vector_1);
__vectable_start__ = .;
__interrupt_vector_1__ = .;
KEEP (*(__interrupt_vector_1))
. = __interrupt_vector_1__ + 2;
} > VECT1 AT> ROM
__interrupt_vector_2 :
{
__interrupt_vector_2__ = .;
KEEP (*(__interrupt_vector_2))
. = __interrupt_vector_2__ + 2;
} > VECT2 AT> ROM
...
{
__interrupt_vector_63__ = .;
KEEP (*(__interrupt_vector_63))
KEEP (*(__interrupt_vector_sysnmi))
. = __interrupt_vector_63__ + 2;
__vectable_end__ = .;
} > VECT63 AT> ROM
}
이 질문을하는 또 다른 방법은 다음과 같습니다. 링커가 추가 정보를 추가하지 않고 섹션을 버리지 않도록하려면 어떻게해야합니까? (벡터가 정의 된 경우 더 커야 만합니다)? –
이것은 XY 문제입니다. 모든 벡터에 대해 단일 섹션을 갖는 대신 단일 섹션에서 코드에 단일 ** 테이블 **을 사용해야합니다. 그런 다음이 섹션을 적절한 주소에 배치하십시오. MSP430뿐만 아니라 ARM Cortex-M과 같은 다른 MCU의 일반적인 시작 코드도 살펴볼 수 있습니다. – Olaf
@Olaf가 제안하는 것과 관련이 있습니다. 이 작업을 수행하는 일반적인 방법은 인터럽트 벡터 섹션에 배치되는 어셈블리 파일이나 C 파일에 정의 된 테이블을 사용하는 것입니다. 당신은 충분한 힘을 사용하는 경우 둥근 구멍에 사각형의 못을 망칠 수 있지만 둥근 못을 사용하는 것이 더 쉽습니다. – rjp