저는 STM32 (Cortex-M3)에서 FreeRTOS를 사용하고 ST의 CMSIS 라이브러리를 사용하여 모든 것을 부트 스트랩합니다.번역 단위 외부에서 작동하는 GCC 별칭 -AKA-이 작업에 적합한 도구입니까?
CMSIS 라이브러리는 시작 ".s"파일에 약한 기호 SVC_Handler
을 정의합니다. 인터럽트 벡터 테이블에서 ISR을 얻으려면 어딘가에서 오버라이드되어야합니다. FreeRTOS는 SVC 인터럽트를 처리하고자하는 ISR 인 vPortSVCHandler
을 정의합니다.
내 응용 프로그램 코드 (예 : FreeRTOS 또는 CMSIS 소스 코드가 필요 없음)를 사용하여 두 코드를 함께 붙이고 싶습니다. 나는 별명이 작업에 적합한 도구가 될 것이라고 생각, 그래서 나는 (별도의 소스 파일에서 main.c의)를이 시도 : error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
가에 따라, 알고 보니 : 결과
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
여기 GCC 문서 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html을 사용하면 alias
속성을 사용하기 위해 번역 단위 외부의 기호를 별명으로 지정할 수 없습니다.
extern void vPortSVCHandler(void) __attribute__ ((naked));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
이 같은 오류가 발생합니다 : 그래서 나는 내가 너무 좋아하는 main.c에 extern
에 기호를 시도라고 생각했다. 어떤 제안 ???
정말 라이브러리 중 하나를 수정하지 않으려합니다. 나는 vPortSVCHandler
을 단순히 호출하는 SVC_Handler
함수를 작성할 수 있지만 ISR에 불필요한 오버 헤드를 추가 할 수 있음을 알 수 있습니다 (최적화 설정에 따라 가능할 수도 있음). 참고 : FreeRTOS 예제는 사용자 정의 시작 파일을 통해이를 수행합니다. C 또는 내 링커 스크립트에서이 작업을 수행 할 방법을 찾고 있습니다.
- 컴파일러 버전 : GCC 버전 4.5.2 (소서리 G ++ 라이트 2011.03-42)
- 대상 : 팔 - 없음 - EABI
링커 스크립트 상단에'SVC_Handler = vPortSVCHandler; '를 추가하면 작업이 완료됩니다. 여전히 지저분 해 보이지만 작동합니다. –
이 솔루션은 LTO에서 전혀 작동하지 않는 것으로 보입니다. 생성 된 명령어에서 "CALL 0"으로 이어지는 0x0을 가리키는 심볼이 항상 나오는 것 같습니다. –