2013-10-08 71 views
3

我是ARM編程新手,我正在使用CoIDE,我試圖用C++編寫一些應用程序來從8個通道讀取P​​WM。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(); 

程序進入。

我在my.st.com上發現了一個主題here,並試圖在「鏈接」和「編譯」部分添加「--specs = nano.specs」到「Misc Controls」,但沒有任何更改。

+0

通常,對於'new()'可能沒有合適的實現,只有這樣一個小型RAM受限設備。不知道你提到的IDE,但你應該研究你的實際工具鏈是如何配置的。當你到達'Default_Handler()'時,這意味着你被困在一些'異常'中。你使用RTOS,如果是的話,哪一個? –

+0

@ g-makulik,不,我不知道。你能幫我找到另一種方式嗎?是全局變量還是全部配置在'void main'中,因爲我無法在構造函數中填充數組,因爲在過程結束時對象將被銷燬。 –

+0

什麼是你的(十字)工具鏈? GCC? (對不起,我不知道'--specs = nano。specs'將與您的IDE /工具鏈一起使用) –

回答

1

顯然,您的活動GCC工具鏈newlib存根不支持使用低級動態內存分配(malloc(),free()等)。對於C++綁定,使用new()delete()可能會在運行時引發默認的「異常」處理程序。

細節取決於隨配置提供的newlib存根。請注意,您可以使用自己的實現覆蓋存根函數。

您將在本文中找到一些有用的附加提示:Building GCC 4.7.1 ARM cross toolchain on Suse 12.2

1

爲了支持新/刪除和GCC與當時newlib C庫,你必須實現_sbrk_r()系統調用存根的malloc /免費,並分配一個區域的堆內存。通常後者是通過鏈接器腳本完成的,但您也可以簡單地分配一個大的靜態數組。但是,可以編寫智能鏈接器腳本,以便堆棧在靜態對象和系統堆棧分配後自動使用所有可用內存。

可以在Bill Gatliff's site上找到示例sbrk_r()實現(以及用於支持流庫I/O等庫功能的其他系統調用存根)。如果您正在使用CoOS或任何其他多任務操作系統或執行程序,並且打算從多個線程分配,則還需要實現__malloc_lock()__malloc_unlock()

您的代碼以Default_Handler結尾,因爲new需要在發生故障時拋出異常並且您沒有明確的try/catch塊。如果您寧願擁有malloc()樣式語義,並在失敗時簡單地返回null,則可以使用new (std::nothrow)