2017-06-04 1 views
1

ローカルバッファが初期化されたときに、ローカルバッファを持つ関数を使用してコードを作成しましたが、例外が発生しましたが、初期化せずに宣言したときそれはうまく動作し、私はなぜ理解できません。 リンカのスタックサイズも増やしましたが、これは問題ではないようです。バッファ全体の初期化で例外が発生する

NB:バッファ初期化全体をサポートするc99/c11コンパイルオプションでコンパイルしています。あなたの答えのための

#define UDS_SRV_CFG2_MAX 20 

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) { 

    tUdsStatus eUdsStatus; 
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX] = { 0 }; // this leads to exception 
    //... 
} 

NCS_PRI_FCT tUdsStatus UDS_RdbiManagement(u16 *puwLen, u8 *aubUdsData) { 

    tUdsStatus eUdsStatus; 
    u8 ubTableCfgIdx[UDS_SRV_CFG2_MAX]; // code works fine here 
    // ... 
} 
+1

"c99/c11コンパイルオプションでコンパイル"することはできません。あなたはC99モードでビルドするか、*または* C11モードでビルドします。両方を行うことはできませんが、それらは相互に排他的です。 –

+0

「バッファ全体の初期化」とはどういう意味ですか? C(C89、C99、C11)では部分的な初期化はありません。オブジェクトは初期化されていないか、または完全に(すべての作業バイト)初期化されています。 – pmg

+0

そして* *あなたは例外を受け取りますか? 'UDS_RdbiManagement'が呼び出されたら?どこか別の場所? *あなたの*コードでクラッシュが発生する場所を特定するためにデバッガを使用していますか? –

答えて

1

まあおかげプラットフォームのスタックアライメントが4bytsているので、問題は20バイトのバッファは、テストが、15バイトのバッファを渡し、例外につながるInfactはスタック・アライメント、だったので例外で失敗しました間違ったコンパイラの整列の問題。 これは、misalign stackのコンパイルオプションを追加し、ハードウェアに正しいフラグを付けることによって解決されました。

Nabil、

エンベデッド/電子システムエンジニア。

関連する問題