2011-03-07 4 views
6

ARM 칩 용 프로그램을 IAR 컴파일러에서 gcc로 이식하고 있습니다.C 코드에서 세그먼트 시작 및 크기를 참조하는 방법

원래의 코드에서 __segment_begin__segment_size과 같은 IAR 특정 연산자는 특정 메모리 세그먼트의 시작과 크기를 각각 얻는 데 사용됩니다.

GCC에서 동일한 작업을 수행 할 수있는 방법이 있습니까? GCC 설명서를 검색했지만 관련성이있는 항목을 찾을 수 없습니다.


더 상세 : 해당
메모리 세그먼트는 프로그램에 특정 된 주변 칩 올바르게 인터페이스 할 수 있도록 고정 된 위치에 있어야한다. 원래 코드는 __segment_begin 연산자를 사용하여이 메모리의 주소를 가져오고이 메모리를 오버플로하지 않도록 __segment_size을 사용합니다.

이러한 메모리 세그먼트의 시작과 끝을 나타내는 변수를 추가하여 동일한 기능을 얻을 수 있지만 컴파일러 종속 코드의 양을 최소화하는 데 도움이되는 유사한 연산자가 GCC에 있으면 쓰기 및 유지 관리가 필요합니다.

+0

세그먼트에 대한 세그먼트 주소 및 크기가 더 구체적 일 수 있습니까? – JeSuisse

답변

2

링커의 플래그는 무엇입니까? --section-start? 내가 읽은 것은 here입니다.

를 사용하는 방법에 대한 예

AVR Freaks Forum에서 찾을 수 있습니다 : -Wl,--section-start=.honk=address : 당신은 다음 링커의 옵션에 추가해야합니다

const char __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1"; 

.

+0

감사합니다. 내가 포팅하는 코드는 라이브러리를위한 것이므로 라이브러리의 모든 사용자가 링커 설정을 편집하여 작동하도록해야하기 때문에 링커 설정을 변경하지 않아도되도록하고 싶었습니다. 가능한 경우, 피하고 싶다. – tomsgd

0

최신 버전의 GCC는 각 세그먼트에 대해 __start_MY_SEGMENT 및 __stop_MY_SEGMENT라는 두 개의 변수를 선언합니다. 이 변수를 사용하려면 원하는 유형의 extern으로 선언해야합니다. 그런 다음 '&'연산자를 사용하여 해당 세그먼트의 시작 및 끝 주소를 가져옵니다.

extern uint8_t __start_MY_SEGMENT; 
extern uint8_t __stop_MY_SEGMENT; 
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT) 
관련 문제