搜索
bottom↓
回复: 14

以太网无协议栈即裸帧收发模式时,如何数据缓冲区结构?

[复制链接]

出5入4汤圆

发表于 2022-11-16 09:08:55 来自手机 | 显示全部楼层 |阅读模式
100汤圆
最新有个项目采用MCU+无操作系统+无TCPIP协议栈,以太网接收报文的处理不知道如何做到高效,因为报文有长有短,偶尔可能一大波报文发过来。为了过滤报文,后续会继续研究一下外设,把mac过滤加上,这样能过滤掉不少无关的报文。缓冲区的设计思路有如下:
1、以太网2层报文,长度最大1500,那就搞个UINT8 rxbuf[1500][N],N设置为10,这样就能缓存10条报文,然后做成环形缓冲的那种方式进行存、取。这个办法有缺点,如果以太网很多短报文,我这里直接每条报文预留了1500字节,完全是浪费。如果是CAN报文倒是可以用用
2、不搞二维数组,而是一维的,比如UINT8 rxbuf[20*1024],来一条,就放在上一条的尾部。本质上也是环形方式存取,但是每一帧报文的头尾就相连了,直接解析估计不行,因为二层以太网帧,TYPE字段实际是长度 or 类型,如果是类型,那就只能一层层去剥开,获取整个报文的长度了。除非再搞个报文info结构体,对应一条报文的起始索引,和长度
不行了,脑子想不到什么高效的办法了,各位有谁做过类似的设计吗?一起交流一下啊

最佳答案

查看完整内容

一般外设那边不是有内部的ram专门保存这个数据的吗??没有的话,就指定一个循环buffer使用DMA搬数据,然后在接收到一帧数据之后,在中断里获取有效数据的长度,将数据搬到另外一个更大的循环buffer里。接下来想怎么处理都可以了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2022-11-16 09:08:56 | 显示全部楼层
一般外设那边不是有内部的ram专门保存这个数据的吗??没有的话,就指定一个循环buffer使用DMA搬数据,然后在接收到一帧数据之后,在中断里获取有效数据的长度,将数据搬到另外一个更大的循环buffer里。接下来想怎么处理都可以了。

出0入442汤圆

发表于 2022-11-16 09:13:56 来自手机 | 显示全部楼层
自己在包前面加上帧头识别码和长度字段。。参见rtl8139硬件。

出100入312汤圆

发表于 2022-11-16 09:15:49 | 显示全部楼层
参考lwip或uip怎么处理的

出0入4汤圆

发表于 2022-11-16 09:38:11 | 显示全部楼层
关注         

出0入22汤圆

发表于 2022-11-16 11:04:28 | 显示全部楼层
用链表比较合适,比如来了如下数据:
1,1000
2,20
3,1000
4,50
5,100
这样在接收的时候,定义一个结构体,内有4个值,
1,起始地址
2,长度,
3,下一个结构体地址
4,当前数据状态(已接收,已释放,已处理。。。)
在处理的时候,处理完数据即可释放当前内存,
当处理线程处理完所有数据后,整个内存空间都释放了。
如果没处理完,比如处理到3的时候,又来了一个,那么可以判断前面的已经处理的,再次利用其空间。
这样,可以把空间利用率做的比较好。
只是代码很麻烦。

出40入42汤圆

发表于 2022-11-16 11:05:03 | 显示全部楼层
这个要看应用场景,如果比较复杂,最好还是上标准的tcp/ip协议比较好
自己定义的协议,考虑不周全的话,接入公网就是灾难

出5入4汤圆

 楼主| 发表于 2022-11-16 11:43:58 来自手机 | 显示全部楼层
xinyou 发表于 2022-11-16 09:58
一般外设那边不是有内部的ram专门保存这个数据的吗??没有的话,就指定一个循环buffer使用DMA搬数据,然后 ...
(引用自5楼)

这个mcu的enet和mp157很像,外设有自己的dma,具体的没时间看,现在提供的demo读出来就是一帧数据

出5入4汤圆

 楼主| 发表于 2022-11-16 11:46:22 来自手机 | 显示全部楼层
zxq6 发表于 2022-11-16 11:04
用链表比较合适,比如来了如下数据:
1,1000
2,20

(引用自6楼)

中断函数里面申请内存,效率怎么样?我从来没有在频繁调用的中断里面动态申请内存的经历

出5入4汤圆

 楼主| 发表于 2022-11-16 11:48:48 来自手机 | 显示全部楼层
落叶知秋 发表于 2022-11-16 11:05
这个要看应用场景,如果比较复杂,最好还是上标准的tcp/ip协议比较好
自己定义的协议,考虑不周全的话,接 ...

(引用自7楼)

不接公网,都是一个系统内部的设备,但是对方设备有tcpip协议栈,我们规定只能裸机没办法

出105入79汤圆

发表于 2022-11-16 12:09:55 | 显示全部楼层
stm32生成的只能缓存4条,数据一多就死机了。10条是比较能扛的。

出5入0汤圆

发表于 2022-11-16 12:26:29 | 显示全部楼层
落叶知秋 发表于 2022-11-16 11:05
这个要看应用场景,如果比较复杂,最好还是上标准的tcp/ip协议比较好
自己定义的协议,考虑不周全的话,接 ...
(引用自7楼)

你说的接入公网是指有独立公网IP地址的设备吗,大部分应用场合的设备不都是局域网内的吗,经过路由器后再到公网进行寻址。

出0入22汤圆

发表于 2022-11-16 12:35:52 | 显示全部楼层
tim4146 发表于 2022-11-16 11:46
中断函数里面申请内存,效率怎么样?我从来没有在频繁调用的中断里面动态申请内存的经历 ...
(引用自9楼)

这个方式不需要申请,直接判断地址和内存状态即可使用。

出0入0汤圆

发表于 2022-11-16 14:57:29 来自手机 | 显示全部楼层
网络芯片 一般都是长度+内容 然后环形挨着存的。

出0入0汤圆

发表于 2022-11-17 14:06:11 | 显示全部楼层
使用环形队列,然后采用变长的方式进行存取就好了,如果还要更加稳定就自行加上帧头进行读取判断,另一个就是使用动态内存分配加指针链表
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 09:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表