ARM Cortex M3 칩 (STM32F2)으로 작업 중이며 ST는 "표준 주변 장치 라이브러리"를 제공합니다. 유용한 .c 및 .h 파일이 있습니다. .s 파일도 있습니다.C 프로젝트에서 .s 파일의 역할은 무엇입니까?
C 프로젝트의 컨텍스트에서 이러한 .s 파일의 용도는 무엇입니까? 컴파일러/링커 /를 어떻게 얻을 수 있습니까? 그들을 고려해야합니까?
ARM Cortex M3 칩 (STM32F2)으로 작업 중이며 ST는 "표준 주변 장치 라이브러리"를 제공합니다. 유용한 .c 및 .h 파일이 있습니다. .s 파일도 있습니다.C 프로젝트에서 .s 파일의 역할은 무엇입니까?
C 프로젝트의 컨텍스트에서 이러한 .s 파일의 용도는 무엇입니까? 컴파일러/링커 /를 어떻게 얻을 수 있습니까? 그들을 고려해야합니까?
.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 코드이며 잘 주석 처리되었으므로 아마 더 편안 할 것입니다.
일반적으로 어셈블리 코드가 들어 있습니다. 어셈블러는 그것들을 오브젝트 파일로 바꾸고 나중에 링커에 의해 메인 파일과 링크됩니다. 하지만 컴파일러, 툴체인 등에 따라 다르다고 생각합니다.
ST 키트에 Keil 기반 개발 환경이있을 것입니다. 컴파일러 버전에 따라 프로젝트 파일의 C, C++ 및 어셈블러 코드 섹션이 달라야합니다. IDE에서 프로젝트를 열고 "프로젝트 속성"또는 이와 비슷한 것을 찾으십시오.
어셈블러 코드와 심볼을 가져오고 내보낼 수 있으므로 어셈블러 코드와 C/C++ 코드가 링크됩니다. Keil을 사용하면 모두 합리적으로 잘 통합됩니다.
EXPORT 지시문은 C/C++ 코드가 연결할 수 있도록 지정된 심볼을 public으로 만들도록 어셈블러에 지시합니다.
IMPORT 지시문은 지정된 심볼이 다른 곳에 정의되어 있으며 링크 타임에 확인된다는 것을 어셈블러에 알립니다.
방금 STM32F2xx를 지정했음을 알았습니다. 귀하의 경우 각각의 파일 이름은 startup_stm32f2xx.s 및 system_stm32f2xx.c입니다. 필자는 STM32F2에보다 구체적으로 답변을 수정했습니다. – Clifford
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
@NickHalden : 아마도 독자적으로 질문을 게시 할 가치가 있다고 생각하십니까? 이 질문은 2 세 이상이며 귀하의 질문조차 아닙니다. 이것은 그가 섹션에 대한 의견이 아닙니다 - 그래서 토론 포럼이 아닙니다. 게다가; 그렇게하면 더 큰 청중을 얻을 수 있습니다. – Clifford