2013-10-08 9 views
3

ARM 프로그래밍에서 새로 생겼습니다. CoIDE를 사용 중이며, C++에서 8 채널 PWM을 읽는 응용 프로그램을 작성하려고합니다.STM32 C++ operator new (CoIDE)

제 문제는 연산자 new을 사용하고 있습니다. 내가 쓰는 경우 :

RxPort rxPort = RxPort(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3, RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn); 

그것을 잘 작동하지만, 내가 쓰는 경우 : 첫 번째 줄 이후

static void Default_Handler(void) 
{ 
    /* Go into an infinite loop. */ 
    while (1) 
    { 
    } 
} 

:

RxPort* rxPort1 = new RxPort; 
rxPort1->setTimerParameters(RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn); 
rxPort1->setGPIOParameters(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3); 
rxPort1->init(); 

프로그램에 간다.

here my.st.com에서 하나의 항목을 찾았으며 "링크"및 "컴파일"섹션의 "기타 컨트롤"에 "--specs = nano.specs"를 추가하려고했지만 아무 것도 변경되지 않았습니다.

+0

보통 작고 RAM이 제한적인 장치로 'new()'에 대한 적절한 구현이 없을 수 있습니다. 언급 한 IDE에 대해 모르겠지만 실제 툴체인 구성 방법을 조사해야합니다. 'Default_Handler() '에 도달하면 이것은 당신이 어떤'예외 '에 빠져 있음을 의미합니다. RTOS를 사용하고 있습니까, 그렇다면 어느 것입니까? –

+0

@ g-makulik, 아니요, 아닙니다. 다른 방법을 찾도록 도와 주시겠습니까? 프로 시저가 끝나면 개체가 파괴되므로 전역 변수 나 전역 변수를 'void main'에 구성합니까? 왜냐하면 배열에 객체를 채울 수 없기 때문입니다. –

+0

(십자가) 툴체인은 무엇입니까? GCC? (미안,'--specs = nano가 뭔지 모르겠다.specs'는 IDE/Toolchain을 의미합니다) –

답변

1

당신의 활성 GCC toolchain newlib 스텁은 저수준 동적 메모리 할당 (malloc(), free(), 등등)의 사용을 지원하지 않습니다. C++ 바인딩에 대해 new() 또는 delete()을 사용하면 런타임에 기본 '예외'처리기가 발생할 수 있습니다.

자세한 내용은 구성과 함께 제공되는 newlib 스텁에 따라 다릅니다. 독자적인 구현으로 스텁 함수를 오버라이드 할 수 있습니다.

이 문서에 몇 가지 유용한 추가 힌트를 찾을 수 있습니다

: Building GCC 4.7.1 ARM cross toolchain on Suse 12.2

1

새로운 지원하기/삭제 한 다음 C 라이브러리 NEWLIB, 당신은 _sbrk_r() 콜 스텁을 구현해야와 GCC에서의 malloc/무료 및 할당 지역 힙에 대한 메모리. 일반적으로 후자는 링커 스크립트를 통해 수행되지만 간단히 큰 정적 배열을 할당 할 수도 있습니다. 그러나 정적 객체 및 시스템 스택 할당 후에 사용 가능한 모든 메모리를 힙에서 자동으로 사용하도록 스마트 링커 스크립트를 작성할 수 있습니다.

sbrk_r() 구현 예 (스트림 I/O와 같은 라이브러리 기능을 지원하는 다른 syscall 스텁)은 Bill Gatliff's site에서 찾을 수 있습니다. CoOS 또는 다른 멀티 태스킹 OS 또는 경영진을 사용하고 있고 다중 스레드에서 할당하려는 경우 __malloc_lock()__malloc_unlock()도 구현해야합니다. new이 실패 할 때 예외를 발생하는 데 필요한 당신이 명시 적 try/catch 블록을 가지고 있지 않기 때문에

코드는 Default_Handler에 끝났다. malloc() 스타일 의미를 갖고 단순히 실패 할 경우 null을 반환하려면 new (std::nothrow)을 사용할 수 있습니다.