2017-06-04 95 views
1

我有麻煩得到一段代碼工作,我有一個代碼使用本地緩衝區的功能, 當本地緩衝區初始化,然後我得到異常,但只是宣佈沒有任何初始化它工作正常,我不明白爲什麼。 我也增加了鏈接器中的堆棧大小,但似乎這不是問題。整個緩衝區initalization導致異常

注意:我正在編譯支持整個緩衝區初始化的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個字節的緩存失敗,一個例外,因爲錯誤的編譯器alignement。 這是通過添加錯誤堆棧的編譯選項並在硬件中激活正確的標誌來解決的。

Nabil,

嵌入式/電子系統工程師。