串口接收数据时候栈溢出Possible IDATA stack overflow detected
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;
}
}
当我的代码离开仿真器,单独跑时候,所有的灯会闪动,查阅代码应该是进入了断言了,之后系统自己复位了
注意有没有很多的局部变量需要压栈,看起来是堆栈溢出。
楼主的问题解决了吗?我也入到这种问题