3

我是 ARM 编程的新手,我正在使用 CoIDE,我正在尝试用 C++ 编写一些应用程序来从 8 个通道读取 PWM。

我的问题是使用运算符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);

它工作正常,但如果我写:

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();

程序转到:

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

在第一行之后。

我在 my.st.com here上找到了一个主题,并尝试将“--specs=nano.specs”添加到“链接”和“编译”部分的“杂项控制”中,但没有任何变化。

4

2 回答 2

2

为了在 GCC 中使用 newlib C 库支持 new/delete 和 malloc/free,您必须实现_sbrk_r()syscalls 存根,并为堆分配一块内存区域。通常后者是通过链接描述文件完成的,但您也可以简单地分配一个大型静态数组。然而,可以编写一个智能链接器脚本,以便在静态对象和系统堆栈分配后堆自动使用所有可用内存。

可以在Bill Gatliff 的网站上找到一个示例sbrk_r()实现(以及用于支持流 I/O 等库功能的其他系统调用存根)。如果您使用 CoOS 或任何其他多任务操作系统或执行程序,并且打算从多个线程进行分配,您也需要实现。__malloc_lock()__malloc_unlock()

您的代码最终出现,Default_Handler因为new当它失败并且您没有显式try/catch块时需要抛出异常。如果您希望拥有malloc()样式语义并在失败时简单地返回 null,则可以使用new (std::nothrow).

于 2013-10-15T19:40:53.373 回答
1

显然,您的活动 GCC 工具链 newlib 存根不支持使用低级动态内存分配(malloc(),free()等)。使用new()delete()用于 C++ 绑定可能会在运行时引发默认的“异常”处理程序。

详细信息取决于您的配置提供的 newlib 存根。请注意,您可以使用自己的实现覆盖存根函数。

您将在本文中找到一些有用的附加提示:在 Suse 12.2 上构建 GCC 4.7.1 ARM 交叉工具链

于 2013-10-08T22:22:52.740 回答