C 硅实验室:编译器优化错误?
我使用的是Silicon Labs BGM111-A模块,带有初学者工具包,对于我的项目,我需要使用UART。 在应用程序开始时,我初始化UART并使用驱动程序功能启动接收:C 硅实验室:编译器优化错误?,c,optimization,microcontroller,32-bit,C,Optimization,Microcontroller,32 Bit,我使用的是Silicon Labs BGM111-A模块,带有初学者工具包,对于我的项目,我需要使用UART。 在应用程序开始时,我初始化UART并使用驱动程序功能启动接收: . . . static UARTDRV_HandleData_t handleDataUart; . . . void IPP_Init(te_INIT_STATEs init_state) { Ecode_t res; UARTDRV_InitUart_t initData; . .
.
.
.
static UARTDRV_HandleData_t handleDataUart;
.
.
.
void IPP_Init(te_INIT_STATEs init_state)
{
Ecode_t res;
UARTDRV_InitUart_t initData;
.
.
.
// Initialize driver handle
res=UARTDRV_InitUart(&handleDataUart,&initData);
//Start receive 1 byte at time.
res=UARTDRV_Receive(&handleDataUart,&pktBufRx[iPktBufRx],1,IPP_ReceivedData);
.
.
.
}
如果我在Simplication Studio中将编译器优化设置为“无(-O0)”,一切正常,但如果我将优化设置为“优化更多(-O2)”,则当检查“handle”参数(handleDataUart指针)是否为空时,“UARTDRV_InitUart”函数将在开头退出:
我注意到(通过观察“handle”参数的地址),当优化为“-O2”时,“handle”的地址为“$R6”(CPU寄存器),否则在优化为“-O0”时,地址为RAM位置。这可能是问题所在吗
这是一个编译器错误,或者我必须编辑我的代码?当代码在优化标志更改后崩溃时,通常意味着代码中存在问题。主函数中的
handleDataUart
在哪里初始化?您正在传递&handleDataUart
,它是静态变量的地址。不能为空。您是否已检查主例程中此指针的值?如果您对其进行了反汇编,是否也对主例程进行了反汇编,以查看在传递参数时是否使用了R6?handleDataUart
通过UARTDRV\u InitUart
结构进行初始化handleDataUart
是静态的
,指针不能为空,但UARTDRV_InitUart
函数由silicon labs实现。R6仅在传递参数时使用。正如您可能已经注意到的,指针上的typedef非常混乱。猜测可能是程序中的某个地方出现了内存损坏错误,导致堆栈崩溃。当您启用优化时,编译器可能会内联函数调用,这意味着参数的堆栈分配可能不会在函数调用期间发生,而是更早发生,让程序的其余部分有更多的时间在堆栈上存储&handleDataUart
的点和handle==NULL
代码之间调试。不太可能的原因是堆栈溢出。尝试在启用优化的情况下调试代码,并按照反汇编进行操作。
Ecode_t UARTDRV_InitUart(UARTDRV_Handle_t handle,
const UARTDRV_InitUart_t *initData)
{
Ecode_t retVal;
CORE_DECLARE_IRQ_STATE;
USART_InitAsync_TypeDef usartInit = USART_INITASYNC_DEFAULT;
if (handle == NULL) {
return ECODE_EMDRV_UARTDRV_ILLEGAL_HANDLE;
.
.
.