2016-09-07 3 views
2

인터럽트 벡터 테이블에 대한 링커 스크립트 섹션 집합이 있습니다. 섹션은 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 
} 
+0

이 질문을하는 또 다른 방법은 다음과 같습니다. 링커가 추가 정보를 추가하지 않고 섹션을 버리지 않도록하려면 어떻게해야합니까? (벡터가 정의 된 경우 더 커야 만합니다)? –

+1

이것은 XY 문제입니다. 모든 벡터에 대해 단일 섹션을 갖는 대신 단일 섹션에서 코드에 단일 ** 테이블 **을 사용해야합니다. 그런 다음이 섹션을 적절한 주소에 배치하십시오. MSP430뿐만 아니라 ARM Cortex-M과 같은 다른 MCU의 일반적인 시작 코드도 살펴볼 수 있습니다. – Olaf

+0

@Olaf가 제안하는 것과 관련이 있습니다. 이 작업을 수행하는 일반적인 방법은 인터럽트 벡터 섹션에 배치되는 어셈블리 파일이나 C 파일에 정의 된 테이블을 사용하는 것입니다. 당신은 충분한 힘을 사용하는 경우 둥근 구멍에 사각형의 못을 망칠 수 있지만 둥근 못을 사용하는 것이 더 쉽습니다. – rjp

답변

0

내가 주변에 작품을 만들었습니다

나는 아래에 내 현재 링커 스크립트를 요약 된 있습니다. 되돌아 보면 분명하지만 다른 사람에게 도움이 될 경우 여기에서 설명하겠습니다.

입력 섹션에 데이터가 없으면 링커에서 출력 섹션을 삭제하기 때문에 내 위치 포인터가 향상되지 않습니다. 즉, ROM에 데이터가 추가되지 않습니다. 항상 같은 크기가되도록 벡터 테이블이 필요하기 때문에 ROM에 패딩을 추가해야합니다.

OUTPUT_ARCH(msp430) 
ENTRY(_start) 

MEMORY { 
    ROM (rx)   : ORIGIN = 0x9C02, LENGTH = 0x61FE 
    VECTABLE   : ORIGIN = 0x5B80, LENGTH = 0x007E 
} 

SECTIONS 
{ 
    .vector_table : 
    { 
    __vectable_load__ = LOADADDR(.vector_table); 
    __vectable_start__ = .; 
    __interrupt_vector_1__ = .; 
    KEEP (*(__interrupt_vector_1)) 
    . = __interrupt_vector_1__ + 2; 
    __interrupt_vector_2__ = .; 
    KEEP (*(__interrupt_vector_2)) 
    . = __interrupt_vector_2__ + 2; 
    ... 
    __interrupt_vector_63__ = .; 
    KEEP (*(__interrupt_vector_63)) 
    KEEP (*(__interrupt_vector_sysnmi)) 
    . = __interrupt_vector_63__ + 2; 
    __vectable_end__ = .; 
    } > VECTABLE AT> ROM 
} 
이제

필요한 패딩은 모두 RAM에 추가 얻을 것이다 ROM은 벡터 테이블이 완전히 비어 있지 않은지 제공 : 나는 위치 포인터 발전을 사용하지만 하나의 섹션에 인터럽트 벡터를 모두 넣어이 문제를 해결했다 . 그것이 나를 귀찮게하지 않는다면, 단지 복사되지 않을 것입니다, 주된 것은 벡터가 잘못된 장소에서 끝나지 않는다는 것입니다.

관련 문제