6

我正在使用 Raisonance 的 Ride7/Codesourcery(又名 Sourcery CodeBench Lite)和 STM32F4 板来开发裸机 HMI 平台。

我将在这个系统中使用 C++ 异常,但是我抛出的任何异常都以写入 stderr 的“递归调用终止”错误结束。

重现问题的代码:(main.cpp)

int main(void)
{
    try {
        throw 1;
    }
    catch (...) {
        printf("caught");
    }
}

我已经尝试过 Raisonance 和其他来源的解决方案,但没有收到任何可行的帮助。

潜在问题/解决方案 1:

我在其他论坛上问过,他们提到我需要在我的启动程序集文件中调用静态结构来初始化展开表(至少我认为他们在谈论),但我不知道如何做到这一点。

潜在问题/解决方案 2

我还在 binutils/gas 中发现了一个错误,这可能是我的问题的根源(http://sourceware.org/bugzilla/show_bug.cgi?id=13449)。我一直在尝试使用此补丁构建我自己的工具链版本,但这正在变成一个自己的项目,并且尚未成功。

问题

我是否需要在代码中做一些事情来利用 C++ 异常,或者这可能是工具链中的错误?如果是前者,请详细说明。

4

1 回答 1

2

经过一些不必要的说服后,Raisonance 最终通过修改他们的默认链接器脚本解决了问题。发布整个链接器脚本对我来说可能是不合法的,但这是人们需要知道的知识

将此添加到 .text 部分

*(.eh_frame)

添加这些部分(根据您在链接描述文件中设置的内存块命名YourMemory 。我的是Flash

.ARM.extab :
{
    *(.ARM.extab* .gnu.linkonce.armextab.*)
} >YourMemory

.ARM :
{
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
} >YourMemory

确保此行出现在 bss 部分

*(.bss*)

在这个任务中,我遇到了以下有用的资源

于 2012-08-31T01:29:41.350 回答