6

Raisonance の Ride7/Codesourcery (別名 Sourcery CodeBench Lite) を、ベアメタル HMI プラットフォームを開発する STM32F4 ボードと共に使用しています。

このシステムでは 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 に答える