sync
sync
This guy hasn't written anything yet

注册于 2 years ago

回答
139
文章
3
关注者
3

我也刚测试了libmodbus,rtu没有问题,tcp有一点问题,楼主自己配置好串口,使用list_device看一下系统里面启用uart2没有,如果列表里面没有,就需要自己添加下了

我也遇到这个问题了,最终大家是怎么解决的呢?

楼主位是不是少张图片?我测试libmodbus也是tcp连接失败,需要修改哪里呢?

    本帖最后由 sync 于 2019-7-29 11:06 编辑


直接下载使用ENV配置后,keil工程下不会自己加入对应的网口eth的驱动文件,需要自己手动加入下,就ok了------------
我用的stm32f407-st-discovery目录下文件,没注意到楼主用的目录和我的不一样,有可能不是这个原因了

给自己的帖子 结个尾,上面的程序后面仍然工作不稳定,因工作原因,放置了好久了。
这几天有空重新下载了RtThread 后,重新测试这个tcpserv发现比之前运行好多了,对比文件发现,bsp\stm32\libraries\HAL_Drivers\drv_eth.c 文件更新过,之前
程序网口只能握手10Mbps还是半双工
[D/drv.emac] link up
[D/drv.emac] 10Mbps
[D/drv.emac] half-duplex
现在状态正常了如下:
[D/drv.emac] link up
[D/drv.emac] 100Mbps
[D/drv.emac] full-duplex
目前长时间测试tcpserv未发现线程有死机情况:)

关注下 ,也求个lwip 和rtt 能长时间稳定运行的例子

支持下,本来使用RT-Thread是因为,扩展插件多,结果里面还是有好多坑要跳,比自己用裸机跑省不了多少时间:(

小ARM菜菜 发表于 2015-5-30 22:43
我把TCPIP线程和网络的应用线程的优先级调整后OK。
这个问题可能就是之前有人说的TCPIP线程挂起在op_comple ...


我也遇到tcpip线程超时挂起问题,挂起后不会再继续执行,导致erx接收的数据,不停的申请内存,最后就是tcpip_inpkt函数里面的
 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
这句会申请内存失败
因为tcpip线程始终无法执行。
不知道如何处理了。。。。

    本帖最后由 sync 于 2019-2-27 17:01 编辑


删除重复信息

    本帖最后由 sync 于 2019-2-27 17:01 编辑


调试中发现eth_rx_thread_entry函数里面,判断接收到邮箱eth_rx_thread_mb以后,p仍然是null呢?
1551257604(1).png

串口打印信息如下:
rtx_mb_ok:0
r_p :Null
rtx_mb_ok:0
r_p :Null
rtx_mb_ok:0
r_p :Null
rtx_mb_ok:0
rtx: S_m_Ok // 注释:这个信息是device->netif->input(p, device->netif)打印出来的
r_p :Null
rtx_mb_ok:0
ethernetif_input: Input error
ethernetif_input: Input error
ethernetif_input: Input error
ethernetif_input: Input error
ethernetif_input: Input error
偶然性的一次,不影响通讯,如果像上面连续几次,就会出现故障,造成tcpserv通讯异常,无法ping通了

独角戏 发表于 2019-2-26 23:09
我用的是bsp/stm32/libraries/templates/stm32f10x的bsp,应该是新的吧
再说,这个问题和bsp没关系吧,主 ...


问题没有解决,自己对lwip也不是很熟悉,tcpserv只要是长时间测试,都会出现问题,我感觉是办公室路由器的问题,正常测试下,我发的数据包都不大,200ms数据发送间隔应该问题。出问题时,f407网口应该接收了比较多的数据,这个应该是路由器发的。

eth接收函数,之前裸机下 执行的是 HAL_ETH_GetReceivedFrame,RTT下使用中断,执行的是 HAL_ETH_GetReceivedFrame_IT(&EthHandle);
另外就是rtt使用了接收线程,根据邮箱来读取eth数据,
暂时测试发现LOG_D("receive frame faild")的原因是EthHandle.RxDesc.Status中的ETH_DMARXDESC_OWN一直为1.
年后再继续调了,暂时就到这里,多谢大家了

zhifou 发表于 2019-1-30 11:50
这种是否先找个完全已有BSP的开发板来验证比较好些?


不同开发板使用的驱动都是rt-thread-master\bsp\stm32\libraries\HAL_Drivers目录下的,使用的是同一个文件了,目前测试的情况是不稳定,也不是不能工作,很郁闷了。。。

    本帖最后由 sync 于 2019-1-30 11:35 编辑


rt_stm32_eth_rx里面的
dmarxdesc->Status |= ETH_DMARXDESC_OWN;
这句话是啥意思呢?我将其注销掉的话,会有其他影响吗?
注销掉就没再发生receive frame faild错了。
    for (i = 0; i < EthHandle.RxFrameInfos.SegCount; i++)
{
// dmarxdesc->Status |= ETH_DMARXDESC_OWN;
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
}
注销掉,会有另外的错误
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 60
ethernetif_input: Input error
[D/drv.emac] receive frame len : 60
ethernetif_input: Input error
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 60
ethernetif_input: Input error
[D/drv.emac] receive frame len : 60
ethernetif_input: Input error
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 342
ethernetif_input: Input error
[D/drv.emac] receive frame len : 60
ethernetif_input: Input error





    本帖最后由 sync 于 2019-1-30 11:19 编辑


使用的drv_eth.c的版本
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-11-19 SummerGift first version
* 2018-12-25 zylx fix some bugs
*/

#include "board.h"
#include "drv_config.h"
#include
#include "lwipopts.h"
#include "drv_eth.h"
问题应该就 出在rt_stm32_eth_rx函数里面
struct pbuf *rt_stm32_eth_rx(rt_device_t dev)
{

struct pbuf *p = NULL;
struct pbuf *q = NULL;
HAL_StatusTypeDef state;
uint16_t len = 0;
uint8_t *buffer;
__IO ETH_DMADescTypeDef *dmarxdesc;
uint32_t bufferoffset = 0;
uint32_t payloadoffset = 0;
uint32_t byteslefttocopy = 0;
uint32_t i = 0;

/* Get received frame */
state = HAL_ETH_GetReceivedFrame_IT(&EthHandle);
if (state != HAL_OK)
{
printf("state = %d\r\n",state);
LOG_D("receive frame faild");
return NULL;
}

/* Obtain the size of the packet and put it into the "len" variable. */
len = EthHandle.RxFrameInfos.length;
buffer = (uint8_t *)EthHandle.RxFrameInfos.buffer;

LOG_D("receive frame len : %d", len);

if (len > 0)
{
/* We allocate a pbuf chain of pbufs from the Lwip buffer pool */
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
}

#ifdef ETH_RX_DUMP
dump_hex(buffer, p->tot_len);
#endif

if (p != NULL)
{
dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
bufferoffset = 0;
for (q = p; q != NULL; q = q->next)
{
byteslefttocopy = q->len;
payloadoffset = 0;

/* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size*/
while ((byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE)
{
/* Copy data to pbuf */
memcpy((uint8_t *)((uint8_t *)q->payload + payloadoffset), (uint8_t *)((uint8_t *)buffer + bufferoffset), (ETH_RX_BUF_SIZE - bufferoffset));

/* Point to next descriptor */
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
buffer = (uint8_t *)(dmarxdesc->Buffer1Addr);

byteslefttocopy = byteslefttocopy - (ETH_RX_BUF_SIZE - bufferoffset);
payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset);
bufferoffset = 0;
}
/* Copy remaining data in pbuf */
memcpy((uint8_t *)((uint8_t *)q->payload + payloadoffset), (uint8_t *)((uint8_t *)buffer + bufferoffset), byteslefttocopy);
bufferoffset = bufferoffset + byteslefttocopy;
}
}

/* Release descriptors to DMA */
/* Point to first descriptor */
dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
/* Set Own bit in Rx descriptors: gives the buffers back to DMA */
for (i = 0; i < EthHandle.RxFrameInfos.SegCount; i++)
{
dmarxdesc->Status |= ETH_DMARXDESC_OWN;
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
}

/* Clear Segment_Count */
EthHandle.RxFrameInfos.SegCount = 0;

/* When Rx Buffer unavailable flag is set: clear it and resume reception */
if ((EthHandle.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
{
/* Clear RBUS ETHERNET DMA flag */
EthHandle.Instance->DMASR = ETH_DMASR_RBUS;
/* Resume DMA reception */
EthHandle.Instance->DMARPDR = 0;
}

return p;
}




调试发现每次发生 LOG_D("receive frame faild");错误的时候
HAL_ETH_GetReceivedFrame_IT中的heth->RxDesc->Status状态是 0x80400320
也就是((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) 不成立

回到
顶部

发布
问题

投诉
建议