嵌入式技术论坛
直播中

hsdou月半

8年用户 485经验值
擅长:MEMS/传感技术
私信 关注
[问答]

使用freemodbus时断言想查是什么原因

使用freemodbus时断言 RT_ASSERT( eRcvState == STATE_RX_IDLE ). 想查是什么原因, 故将此断言屏蔽, 然后添加打印信息

BOOL
xMBRTUTransmitFSM( void )
{
BOOL xNeedPoll = FALSE;
//RT_ASSERT( eRcvState == STATE_RX_IDLE );
rt_enter_critical();
if((int)eRcvState != 1)
{
rt_kprintf("r%xr",(int)eSndState);
if((int)eRcvState != 1)
{
rt_kprintf("c%dc",(int)eRcvState);
}
}
rt_exit_critical();
switch ( eSndState )
{
/* We should not get a transmitter event if the transmitter is in

idle state. /
case STATE_TX_IDLE:
/
enable receiver/disable transmitter. /
vMBPortSerialEnable( TRUE, FALSE );
break;
case STATE_TX_XMIT:
/
check if we are finished. */
if( usSndBufferCount != 0 )
{
xMBPortSerialPutByte( ( CHAR )pucSndBufferCur );
pucSndBufferCur++; /
next byte in sendbuffer. /
usSndBufferCount--;
}
else
{
xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
/
Disable transmitter. This prevents another transmit buffer
empty interrupt. */
vMBPortSerialEnable( TRUE, FALSE );
eSndState = STATE_TX_IDLE;
}
break;
}
return xNeedPoll;
}
但是发现很奇怪的现象, 如图:

1.jpg

但是从逻辑上分析, 进入时eRcvState一定为1.

想问下什么情况会出现此现象.

加了临界区, 所以应该没有别的线程能改, 然后查了所有线程的内存, 没有溢出现象

回帖(2)

刘勇

2022-11-23 10:42:49
eRcvState 发生变化的函数只有 xMBRTUReceiveFSM 和 xMBRTUTimerT35Expired,
在这两个函数里加打印看看出问题前后, eRcvState 是在哪发生变化的,再具体分析吧
举报

hsdou月半

2022-11-23 10:42:57
怎么说呢, 随意改的内容, 如加个全局变量啥的, 就在其他地方进入断言, 如串口RT_ASSERT(serial != RT_NULL);, 但是同样, 加入if后, serial是有地址的, 且地址是正确的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分