2011-10-04 1 views
6

저는 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

답변

8

당신은, 또는 예를 들어, 링커에 적절한 옵션을 전달하여 하나 링커 스크립트를 사용하여이 작업을 수행 할 수 있어야합니다. LD를 들어, --defsym=SVC_Handler=vPortSVCHandler

는 LD --defsym 옵션에 대한 자세한 내용은 바이너리 유틸리티 설명서를 참조하고, assignments in linker scripts

+1

링커 스크립트 상단에'SVC_Handler = vPortSVCHandler; '를 추가하면 작업이 완료됩니다. 여전히 지저분 해 보이지만 작동합니다. –

+0

이 솔루션은 LTO에서 전혀 작동하지 않는 것으로 보입니다. 생성 된 명령어에서 "CALL 0"으로 이어지는 0x0을 가리키는 심볼이 항상 나오는 것 같습니다. –

0

나는 SVC 처리기 만 FreeRTOS에서 사용하는 확신 해요 핸들러를 추가하면 성능이 저하되지 않습니다 (단, 추한) FreeRTOS 포럼에서이 질문을 던지십시오. 응답은 보통 입니다. 이 도움이

희망, 최고 감사합니다, 데이브

+0

. FreeRTOS 포럼에서도 물어볼지도 모르겠지만 FreeRTOS보다는 GCC 툴체인에 관한 질문이 더 많습니다. –

1

나는 FreeRTOS 예 중 하나에서 수집 한 또 다른 해결책은 당신의 FreeRTOSConfig.h에 다음을 추가하는 것입니다 .. .

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS 
standard names - or at least those used in the unmodified vector table. */ 
#define vPortSVCHandler SVC_Handler 
#define xPortPendSVHandler PendSV_Handler 
#define xPortSysTickHandler SysTick_Handler 

원본 파일은 또한 구성에 CMSIS 시스템 클럭을 통합 FreeRTOS/데모/CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo/소스/FreeRTOSConfig.h에서이다. CMSIS/FreeRTOS 프로젝트를위한 아주 좋은 출발점.

2

별칭 문제는 단지 별칭이기 때문에 선언되고 정의 된 함수가 필요하다고 생각합니다. 이것을 다른 함수의 전방 선언으로 사용하려고합니다.

void SVC_Handler(void) asm("vPortSVCHandler"); 

이는 SVC_Handler의 진입 점 이름을 변경, 당신은 다음을 정의하지 않는 경우, 그것은 vPortSVCHandler을 찾아야한다 : 그 같은 일을 할 수있는 비슷한 일을 얻었다.

은 참조 : 나는뿐만 아니라 SysTick와하는 PendSV 핸들러 승 /이 작업을 수행 할 필요가 있음을 추가해야 https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

관련 문제