2012-03-21 2 views
18

ARM Cortex M3 칩 (STM32F2)으로 작업 중이며 ST는 "표준 주변 장치 라이브러리"를 제공합니다. 유용한 .c 및 .h 파일이 있습니다. .s 파일도 있습니다.C 프로젝트에서 .s 파일의 역할은 무엇입니까?

C 프로젝트의 컨텍스트에서 이러한 .s 파일의 용도는 무엇입니까? 컴파일러/링커 /를 어떻게 얻을 수 있습니까? 그들을 고려해야합니까?

답변

27

.s 확장자는 GNU 및 기타 많은 도구 체인에서 어셈블러 파일에 사용되는 규칙입니다.

마지막으로 STM32 표준 주변 장치 라이브러리 자체에는 어셈블러 파일이 포함되어 있지 않지만 CMSIS 라이브러리에는 다양한 STM32 부품의 시작 코드가 들어 있습니다. 예를 들어 startup_stm32f2xx.s는 모든 STM32F2xx 시리즈 장치의 시작 코드입니다. 툴 체인마다 다른 구현이 있습니다. 특정 파트와 툴 체인과 관련된 파일을 빌드하고 링크해야합니다. 빌드하고 실행하는 예제 프로젝트 또는 파트 별 프로젝트를 생성하는 IDE를 사용하는 경우이 코드는 이미 실행 된 코드가있는 경우 이미 완료되었을 것입니다.

코드를 작성하고 연결하는 방법은 사용중인 툴 체인에 따라 다릅니다. 대부분의 IDE 기반 도구는 자동으로 확장을 인식하고 다른 것과 마찬가지로 링크 될 객체 파일을 생성하기 위해 어셈블러를 호출합니다. 정확한 내용은 도구 체인 버전간에 약간 다르지만 주로 C 런타임 환경 (스택 및 힙)을 생성하고 프로세서를 초기화하며 초기 인터럽트/예외 벡터 테이블을 정의하고 정적 데이터를 초기화하고 main()으로 이동합니다.

예를 들면 케일/ARM 리얼 뷰 버전에 대한 파일의 핵심은 다음과 같다 :

; Reset handler 
Reset_Handler PROC 
       EXPORT Reset_Handler    [WEAK] 
     IMPORT SystemInit 
     IMPORT __main 
       LDR  R0, =SystemInit 
       BLX  R0 
       LDR  R0, =__main 
       BX  R0 
       ENDP 

Reset_Handler 프로그램 카운터 (PC) 레지스터는 프로세서의 리셋 후 설정 될 어드레스이다.

SystemInit은 대부분의 초기화 작업을 수행하는 외부 C 코드 기능입니다. 하드웨어에 대한 사용자 정의가 필요할 수 있습니다. Cortex-M은 벡터 테이블에 재설정 주소와 초기 스택 포인터 주소가 모두 포함되어 있기 때문에 재설정 후 즉시 C 코드를 시작할 수 있다는 점에서 특이한 점이 있습니다. 재설정시 SP 레지스터에 자동으로로드됩니다. 따라서 하나의 실행을 얻으려면 많은 어셈블러 지식이 필요하지 않습니다.

__main()은 C 코드에 대한 컴파일러가 제공 한 진입 점입니다.main() 함수를 호출하지 않고 표준 라이브러리, 정적 데이터, 힙에 대한 초기화를 수행한다.

Keil/ARM RealView 버전에서 __main()에 의해 수행 된 많은 작업을 수행하기 때문에 GCC 버전이 다소 복잡하지만 본질적으로 동일한 기능을 수행합니다.

CMSIS SystemInit()은 system_stm32f2xx.c에 정의되어 있으며 보드 (올바른 수정 진동수, PLL 설정, 외부 SRAM 구성 등)에 대한 사용자 정의가 필요할 수 있습니다. 이것은 C 코드이며 잘 주석 처리되었으므로 아마 더 편안 할 것입니다.

+0

방금 ​​STM32F2xx를 지정했음을 알았습니다. 귀하의 경우 각각의 파일 이름은 startup_stm32f2xx.s 및 system_stm32f2xx.c입니다. 필자는 STM32F2에보다 구체적으로 답변을 수정했습니다. – Clifford

+0

Clifford - ARM 웹 사이트의 설명서에 startup_xxx.s, __user_initial_stack_heap의 다른 루틴에 88 바이트 이상의 스택을 사용해서는 안된다는 내용이 나와 있습니다. 그 한계가 어디에서 오는지 알고 있습니까? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_cihhdahf.htm – NickHalden

+0

@NickHalden : 아마도 독자적으로 질문을 게시 할 가치가 있다고 생각하십니까? 이 질문은 2 세 이상이며 귀하의 질문조차 아닙니다. 이것은 그가 섹션에 대한 의견이 아닙니다 - 그래서 토론 포럼이 아닙니다. 게다가; 그렇게하면 더 큰 청중을 얻을 수 있습니다. – Clifford

7

일반적으로 어셈블리 코드가 들어 있습니다. 어셈블러는 그것들을 오브젝트 파일로 바꾸고 나중에 링커에 의해 메인 파일과 링크됩니다. 하지만 컴파일러, 툴체인 등에 따라 다르다고 생각합니다.

1

ST 키트에 Keil 기반 개발 환경이있을 것입니다. 컴파일러 버전에 따라 프로젝트 파일의 C, C++ 및 어셈블러 코드 섹션이 달라야합니다. IDE에서 프로젝트를 열고 "프로젝트 속성"또는 이와 비슷한 것을 찾으십시오.

어셈블러 코드와 심볼을 가져오고 내보낼 수 있으므로 어셈블러 코드와 C/C++ 코드가 링크됩니다. Keil을 사용하면 모두 합리적으로 잘 통합됩니다.

EXPORT 지시문은 C/C++ 코드가 연결할 수 있도록 지정된 심볼을 public으로 만들도록 어셈블러에 지시합니다.

IMPORT 지시문은 지정된 심볼이 다른 곳에 정의되어 있으며 링크 타임에 확인된다는 것을 어셈블러에 알립니다.

관련 문제