마이그레이션과 런타임 문제사항들
기술노트 96045
아키텍처:
ARM
컴포넌트:
general
업데이트:
2021-05-28 오전 8:46
소개
이 특정한 경우는 주로 IAR Embedded Workbench for ARM 버전 4.x (혹은 하위 버전)에서 IAR Embedded Workbench for ARM 버전 5.x (혹은 상위 버전)대로 마이그레이션한 뒤에 발생하는 경우입니다.
물론 동작하지 않는 데는 많은 이유가 있을 수 있으나, 최소한 이 문제에 대해서는 다음의 문제 해결에 대한 토픽 리스트들을 통해 방지할 수 있습니다.
증상
해당 문제는 단지 의도대로 함수가 동작하지 않는 것부터, 전체 프로그램이 이상하게 작동하는 경우까지 포함합니다.
기본 지식
IAR Embedded Workbench for ARM 버전 5.x (혹은 상위 버전)은 AEABI를 준수합니다. AEABI 표준은 함수 입력시 스택 포인터는 반드시 8-byte 정렬되어야 한다고 지정하고 있습니다.
원인 진단
만약 프로그램이 스택 포인터를 4-byte 정렬시킨다면 프로그램은 의도한 대로 동작하지 않습니다. IAR Embedded Workbench for ARM 툴은 이러한 측면에서 프로그램이 올바른지(8-byte 정렬된 스택), 올바르지 않은지 감지하지 않습니다.
IAR C/C++ Compiler for ARM은 언제나 적절히 8-byte 정렬을 수행합니다. 이러한 이유로 문제가 될 것은 두 가지 경우 중에 있습니다:
- C 함수를 호출하는 어셈블러 루틴.
- .icf 파일상에 스택에 대한 잘못 정렬된 기본 주소.
이 원인에 대한 문제해결
- .icf 파일을 점검하여 각 스택에 대한 기본 주소가 8-byte-정렬되어 있는지 확인.
- 프로젝트의 .s 파일들을 분석합니다. 스택은 C 함수들을 호출하기 전과 C-함수로 부터 반환을 받을 때 (8 byte)로 정렬되어야 합니다. 만약 스택이 정렬되어 있지 않다면, 어셈블리 소스는 스택 포인터로 부터 add와 subtract를 하기 위해 반드시 다시 쓰여야 한다.
- 만일 (.s 파일들을) 검토한 결과 스택이 4-byte 정렬되어 있지 않은 것을 찾았다면, 어셈블리 소스는 8-byte-정렬을 가지기 위해 4-byte 를 추가, 감산하여야 합니다. 다음과 같이 조정할 수 있습니다:
SUB sp,sp,#4 ; push of 4 bytes for align to 8 bytes
STMFD sp!,{lr} ; Save the link register - a push of 4 bytes
LDR lr, = ReturnAddress ; Read the return address.
BX r0 ; Branch to the C function.
ReturnAddress
LDMFD sp!,{lr} ; Restore the link register - a pop of 4 bytes
ADD sp,sp,#4 ; Adjust stack - a pop of 4 bytes
요약
스택이 8-byte 정렬되었는지 점검하여, 프로그램이 예상대로 작동을 할 수 있도록 합니다. 그렇지 않으면 프로그램에서 다른 측면을 검토할 필요가 있습니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.