2017-06-04 99 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,

嵌入式/电子系统工程师。