2012-03-26 2 views
0

나는 SCB 포럼에서이 질문을했지만 대답이 없었다. uVision IDE에서 SCB로 일부 프로젝트를 이식하려고한다. 문제는 벡터 테이블 구현에서 시작되었습니다. SCB 라이브러리 "INT 주 (무효)"선언을 찾고 있기 때문에 examle, 나는, 간단한 C++ 코드Sourcery CodeBench ARM Cortex-M 벡터 테이블 구현

#define STACK_TOP 0x20000800 
typedef void (*handler_ptr)(); 

void ResetHandler() { while (1); } 
void NMIHandler() { while (1); } 
void HardFaultHandler() { while (1); } 

__attribute__ ((section("vectors"))) handler_ptr const vector_table[] = { 
    (handler_ptr) STACK_TOP, 
    ResetHandler, 
    NMIHandler, 
    HardFaultHandler, 
}; 

이 코드는 컴파일되지 않습니다 있습니다. 자,이 함수를 추가 할 수는 있지만 SCB는 벡터 테이블 구현을 무시하고 자신을 사용합니다 (VT의 주소 함수를 호출하면 SCB 더미 핸들러 참조).

어떻게 내 SCB VT 구현을 다시 작성할 수 있습니까? 특별한 SC3 함수 이름을 사용하지 마십시오 (2 IDE를 지원하는 것은 좋지 않습니다). 또는 벡터 테이블을 다른 메모리 위치로 이동하십시오. 루미 내리 마이크로의에서

__attribute__ ((section(".isr_vector"))) void (* const g_pfnVectors[])(void) 

"startup_gcc.c - GNU 도구와 함께 사용하기위한 시작 코드는"아무런 영향도

감사합니다가 없습니다.

답변

1

임베디드 지원을위한 저수준 C 확장에 관해서는 두 컴파일러 모두에 대해 단일 접근법을 사용하지 않을 수 없습니다. ARM의 CMSIS 공식 배포에서도 지원되는 모든 컴파일러에 대해 별도의 시작 프로그램이 있습니다.

그러나 명시 적 테이블 선언보다 더 잘 작동하는 것은 포함되지 않습니다. 구현하고자하는 핸들러를 선언하십시오. CMSIS 벤처 기업은 보통 자신의 스텁을 WEAK 기능으로 표시하므로 사용자의 우선 순위가 높아집니다. 그러나 링커가 예상 한대로 처리기의 표준 이름 (예 : Reset_Handler, NMI_Handler, WWDG_IRQHandler 등)을 사용해야합니다. 자세한 내용은 CMSIS docs 및 소스 파일을 참조하십시오.

주의 : C++로 컴파일하는 경우주의해야 할 점은 extern "C" 마커를 추가하는 것입니다. 그렇지 않으면 링커에서 핸들러를 볼 수 없습니다.

+0

이고르, 감사합니다. 당신 말이 맞아요. 가장 좋은 해결책은 각 컴파일러에 대한 별도의 헤더 파일입니다. 나는 링커 파일에서 올바른 섹션 이름을 찾았습니다 - ".cs3.interrupt_vector"하지만 링커는 SCB가 생성 된 후 내 벡터 선언을 배치합니다. –

+0

필자는 Keil ARM 6.6 및 Cortex M7 용 GCC 6과 동일한 "vectors.c/h"파일을 사용하여 C++ 프로젝트를 만들었습니다. Keil 컴파일러 (uVision을 통해 호출 됨 - 전용 호언 장담이 필요함)에는 미리 정의 된 섹션 (예 : RESET)이 있으므로 GCC 링커 스크립트를 변경하여 일치시킵니다. 더 어려운 부분은 스택을 동일하게 설정하는 것입니다. 그걸별로 분류하지 않았습니다. – Flip