rt-thread+lwip ENET_RXD0信号到 recvfrom 时延到ms 实时?

发布于 2020-01-14 17:21:12    浏览:640
    本帖最后由 parkin 于 2020-1-14 17:24 编辑


开发环境:
RT-Thread: v4.0.2(master)
SOC: i.MX RT1050
Board: 野火 RT1052

系统环境:
lwip(2.0.2) + 测试程序(接收(recvfrom)到数据后马上输出IO信号)

测试方法:
探头一:ENET_RXD0引脚
探头二:IO信号引脚
测试这两个信号的时延

目的:网卡接收到数据后立即进行业务处理,这个过程中的时延在us级,抖动控制在100us内

现象:目前经过测试发现时延最高到9ms, 最低时延为97us

问题:如果使“最高时延-最低时延<=100us”

查看更多

12 个回答
parkin
parkin 2020-01-15
This guy hasn't written anything yet
自顶,不要沉下去:lol
parkin
parkin 2020-01-16
This guy hasn't written anything yet
自顶,不要沉下去:)
aozima
aozima 2020-01-16
拒绝白嫖,拒绝键盘侠!
UDP的话,直接放中断里面的去处理吧。
原来的驱动接收队列也要做一下修改,为了实时性就要损失些性能。
bernard
bernard 2020-01-16
This guy hasn't written anything yet
为了考虑实时性,还是需要做更多的一些特殊考虑的。例如如果是任务中处理,则这个任务的优先级;如果是在中断中处理,则这个中断的 优先级。

离开这些谈实时性,是不现实的
parkin
parkin 2020-01-16
This guy hasn't written anything yet
    本帖最后由 parkin 于 2020-1-16 14:45 编辑


aozima 发表于 2020-1-16 10:00
UDP的话,直接放中断里面的去处理吧。
原来的驱动接收队列也要做一下修改,为了实时性就要损失些性能。 ...

谢谢你的回复,
首先,请问你说的“直接放中断中处理”,意思是不使用lwip组件,直接中断处理接收?
然后,如果我使用lwip组件,我又该如何使接收实时呢?
为了实时性,损失吞吐量,性能都没关系。
目前我还在分析 lwip 的源码,有以下发现
1.rtthread 的 邮箱在调度上对于实时性影响不大,没有有超过百us
2.线程的优先级会影响邮箱接收,需要调整其为最高优先级
3.LWIP_SO_RCVBUF也应该对实时性有影响。我计划取消该功能。
4系统启动后 lwip 会创建一个 tcpip 线程,这个县城启动后每间隔1s就会请求邮箱数据,暂时猜测UDP没有使用到 tcpip 线程。我打算关闭它。
如果您有好的建议,请回复。谢谢。
parkin
parkin 2020-01-16
This guy hasn't written anything yet
bernard 发表于 2020-1-16 13:23
为了考虑实时性,还是需要做更多的一些特殊考虑的。例如如果是任务中处理,则这个任务的优先级;如果是在中 ...


首先,谢谢你的回复。
我这边使用的是UDP协议,只要解析UDP数据就可以了。其中你们所说中断中处理,我不太明白,可否详细说明。目前我有一些结果,请看 #6 楼我的回复。
bernard
bernard 2020-01-16
This guy hasn't written anything yet
parkin 发表于 2020-1-16 14:43
首先,谢谢你的回复。
我这边使用的是UDP协议,只要解析UDP数据就可以了。其中你们所说中断中处理,我不 ...


因为是UDP协议,最简单的方法就是绕过协议栈(或者旁路掉),然后在中断中进行处理(最好是预先把报文准备好,发送数据报文的过程是通过DMA完成),这样接收到EMAC接收中断,就判断下是否是自己的报文,是,则按照预备好的报文稍微做一定调整,然后压到DMA中发出去。

如果中断还有可能被抢占,那就调整中断优先级,甚至是说整个系统运行过程中,这个EMAC中断都不屏蔽,可以持续去响应。这个时候实时性就是最棒的了,比得上(什么事都不干的)裸机了

以前还真这么整过,然后其他的,TCP连接照样交给lwIP去处理,上层跑个web server都没问题
parkin
parkin 2020-01-17
This guy hasn't written anything yet
    本帖最后由 parkin 于 2020-1-17 11:05 编辑


bernard 发表于 2020-1-16 14:56
因为是UDP协议,最简单的方法就是绕过协议栈(或者旁路掉),然后在中断中进行处理(最好是预先把报文准 ...

rt_mb_send(&eth_rx_thread_mb, (rt_uint32_t)dev);    
<_enet_rx_callback
<_enet_callback //存储在 imxrt_eth_device.enet_handle
<_enet_config ENET_SetCallback
handle->callback(base, handle, kENET_RxEvent, handle->userData);

以上是我追踪 rt-thread 的以太网中断处理执行树,您说的在中断中处理,可否像以下这样:
接收:在 eth_device_ready 函数中,直接判断是否是我想要的数据, 是,则发送一个邮箱,而我的接收线程直接去读取邮箱。
发送:直接调用驱动 drv_eth.c 驱动程序的 rt_imxrt_eth_tx 帧发送函数。

我还有一个问题。lwip中是哪个地方影响了实时接收呢? 我想应该可以使用 lwip 并达到实时的效果吧。

目前我测试到 LOCK_TCPIP_CORE() 这个地方了,在这个宏调用之前,实时性很好,在这个宏调用之后,就会有ms级抖动
您那里有解析 IP UDP 协议数据的相关资料或者链接吗?
bernard
bernard 2020-01-17
This guy hasn't written anything yet
例如这个是EMAC的中断服务例程,大致的程序会是:

void emac_isr()
{
uint8_t * p = emac_fetch_buffer();
if (p[x] = MAGIC)
{
emac_tx(your_packet, size);
}
else
{
device_ready();
}
}
parkin
parkin 2020-02-28
This guy hasn't written anything yet
bernard 发表于 2020-1-17 15:25
例如这个是EMAC的中断服务例程,大致的程序会是:

void emac_isr()


谢谢你给我的帮助, 这个问题, 我按照你的方式解决了,
1.在lwip 接手的地方拷贝数据并发送到了我的业务线程中.
2.自己实现了arp, udp部分协议栈, 实测性能还不错, 抖动在50us以内

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
640

发布
问题

分享
好友

手机
浏览

扫码手机浏览