微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > 串口接收数据时候栈溢出Possible IDATA stack overflow detected

串口接收数据时候栈溢出Possible IDATA stack overflow detected

时间:12-23 整理:3721RD 点击:

TI:

   你好,我最近调串口发现个问题

程序带仿真器运行,我不断往串口里面发数据,当数据量大时候

程序就停了,提示Warning: Possible IDATA stack overflow detected. Reset target to re-enable overflow check

我尝试着吧IDATA的大小从0xc0改到0xD6出现这种问题的概率小了一些

到我往串口里输数据的时候,输入字符量小的时很多次后才发生

当我我往串口里输数据,数据量很大的时候,一下子就发生了,

请问这种问题有什么好的解决方法?

这是我接收中断函数源码:我仔细核对过每个osal_mem_alloc,osal_mem_free他们确实是成对的

void UART_RX_IRQ(uint8 port, uint8 event)
{
    //串口各种中断全在这里

    (void)port;
    uint8 *Pbuf_RX=NULL;
    uint16 tempLenofRXdata;
    char *pstr1="EEOR_CMD!";
    if (Frame_Fill_Ok == TRUE)
    {
        ASSERT_REPORT( 0 );
      
    }


    switch (event)
    {


    case HAL_UART_RX_FULL:
        ASSERT_REPORT( 0 );
        break;


    case HAL_UART_RX_ABOUT_FULL:
        if (Hal_UART_RxBufLen (port) == 0)
        {
            ASSERT_REPORT( 0 );
            
        }
        tempLenofRXdata = Hal_UART_RxBufLen (port);
        Pbuf_RX = (uint8 *)osal_mem_alloc(tempLenofRXdata);

        if (HalUARTRead(port, Pbuf_RX, tempLenofRXdata) != tempLenofRXdata)
        {
            ASSERT_REPORT(0);
        }

        if (Pbuf_RX[0] == '#' && Pbuf_RX[1] == '@')
        {
            if (Pbuf_RX[tempLenofRXdata - 1] == '*')
            {
                if (P_A_frame_Head == P_A_frame_Current && Frame_Fill_Ok == false)
                {
                    //这是正确的情况,说明当前存储的数据是0
                    osal_memcpy(P_A_frame_Head, Pbuf_RX, tempLenofRXdata);
                    P_A_frame_Current += tempLenofRXdata;
                    Frame_Fill_Ok = true;
                    osal_set_event(ztAPP_task_id, Receive_A_Complete_Frame_EVT);
                }
                else
                {
                    //不可能事件
                    ASSERT_REPORT( 0 );
                }
            }
            else
            {
                osal_memcpy(P_A_frame_Current, Pbuf_RX, tempLenofRXdata);
                P_A_frame_Current += tempLenofRXdata;
                Frame_Fill_Ok = false;


            }

        }
        else
        {
            if (Pbuf_RX[tempLenofRXdata - 1] == '*')
            {
                osal_memcpy(P_A_frame_Current, Pbuf_RX, tempLenofRXdata);
                P_A_frame_Current += tempLenofRXdata;
                Frame_Fill_Ok = TRUE;
                osal_set_event(ztAPP_task_id, Receive_A_Complete_Frame_EVT);

            }
            else
            {
                osal_memcpy(P_A_frame_Current, Pbuf_RX, tempLenofRXdata);
                P_A_frame_Current += tempLenofRXdata;
                Frame_Fill_Ok = false;



            }


        }
        osal_mem_free(Pbuf_RX);
        Pbuf_RX = NULL;



        break;



    case HAL_UART_RX_TIMEOUT:
        if (Hal_UART_RxBufLen (port) == 0)
        {
            ASSERT_REPORT( 0 );
           
        }
        tempLenofRXdata = Hal_UART_RxBufLen (port);
        Pbuf_RX = (uint8 *)osal_mem_alloc(tempLenofRXdata);
        if(Pbuf_RX==NULL)
        {return;
        }

        if (HalUARTRead(port, Pbuf_RX, tempLenofRXdata) != tempLenofRXdata)
        {
            ASSERT_REPORT(0);
        }
        if (Pbuf_RX[0] == '#' && Pbuf_RX[1] == '@')
        {
            if (Pbuf_RX[tempLenofRXdata - 1] == '*')
            {
                if (P_A_frame_Head == P_A_frame_Current && Frame_Fill_Ok == false)
                {
                    //这是正确的情况,说明当前存储的数据是0
                    osal_memcpy(P_A_frame_Head, Pbuf_RX, tempLenofRXdata);
                    P_A_frame_Current += tempLenofRXdata;
                    Frame_Fill_Ok = true;
                    osal_set_event(ztAPP_task_id, Receive_A_Complete_Frame_EVT);
                }
                else
                {
                    //不可能事件
                    ASSERT_REPORT( 0 );
                }

            }
            else
            {
                ASSERT_REPORT(0);
            }
        }
        else
        {
            if (Pbuf_RX[tempLenofRXdata - 1] == '*')
            {
                if (P_A_frame_Head != P_A_frame_Current && Frame_Fill_Ok == false)
                {
                    osal_memcpy(P_A_frame_Current, Pbuf_RX, tempLenofRXdata);
                    P_A_frame_Current += tempLenofRXdata;
                    Frame_Fill_Ok = true;
                    osal_set_event(ztAPP_task_id, Receive_A_Complete_Frame_EVT);

                }
                else
                {
                    ASSERT_REPORT(0);
                }
            }
            else
            {//这个时间是有可能发生的比如顺便输入个什么东西,都不会以*结尾的
               //ASSERT_REPORT(0);
              pError_string=(uint8 *)pstr1;
              len_of_Error_string=strlen(pstr1);
              osal_start_timerEx(ztAPP_task_id, Error_Detect, 50);
            }
        }
        osal_mem_free(Pbuf_RX);
        Pbuf_RX = NULL;

        break;




    case HAL_UART_TX_FULL:
        Flage_TXBuf_Ready = false;
        break;



    case HAL_UART_TX_EMPTY:
        Flage_TXBuf_Ready = TRUE;
        break;
    default:
        break;
    }

}

当我的代码离开仿真器,单独跑时候,所有的灯会闪动,查阅代码应该是进入了断言了,之后系统自己复位了

注意有没有很多的局部变量需要压栈,看起来是堆栈溢出。

楼主的问题解决了吗?我也入到这种问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top