2013-10-08 130 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)