c++ - STM32 C++ 运算符 new (CoDE)

标签 c++ gcc embedded stm32 newlib

我是 ARM 编程的新手,我正在使用 CoIDE,我正在尝试用 C++ 编写一些应用程序来从 8 个 channel 读取 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”添加到“Link”和“Compile”部分的“Misc Controls”,但没有任何变化。

最佳答案

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

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

你的代码在 Default_Handler 中结束,因为 new 需要在它失败时抛出异常,而你没有明确的 try/catch block 。如果您更愿意使用 malloc() 风格的语义并简单地在失败时返回 null,您可以使用 new (std::nothrow) .

关于c++ - STM32 C++ 运算符 new (CoDE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258847/

相关文章:

c - mongo c 驱动程序更新嵌套数组

c - Omap 5912 的 IDE 和开发工具

sqlite3 列类型

embedded - 何时对嵌入式系统使用窗口看门狗

c++ - 我在滥用 `const` 吗?

c++ - 指向错误元素的列表迭代器

c++ - c++套接字io客户端无法读取使用来自另一个客户端的广播从节点服务器发送的数据

c++ - 我如何使用 try...catch 来捕获浮点错误?

c - 获取正确的参数指针

c++ - 私有(private)静态成员可以用作其类的成员函数的默认参数吗?