Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 硅实验室:编译器优化错误?_C_Optimization_Microcontroller_32 Bit - Fatal编程技术网

C 硅实验室:编译器优化错误?

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; . .

我使用的是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;
    .
    .
    .
    // 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;
.
.
.