运维开发网

网络 – 嵌入式IP堆栈:是否可以接受异步发送?

运维开发网 https://www.qedev.com 2020-07-05 20:29 出处:网络 作者:运维开发网整理
我正在尝试为8位AVR MCU实现一个非常小的IP堆栈.我不希望它支持TCP,因为它真的太大而且我不需要它,而是UDP(当然还有ARP和ICMP). 我希望堆栈代码适合16 kiB的ROM和1 kiB的RAM,当然要为应用程序留出尽可能多的空间.我使用基于ENC28J60的板进行PHY / MAC管理,它具有内部8 kiB RX / TX循环缓冲区.当数据包到达此芯片时,它会将它们一个接一个地写入
我正在尝试为8位AVR MCU实现一个非常小的IP堆栈.我不希望它支持TCP,因为它真的太大而且我不需要它,而是UDP(当然还有ARP和ICMP).

我希望堆栈代码适合16 kiB的ROM和1 kiB的RAM,当然要为应用程序留出尽可能多的空间.我使用基于ENC28J60的板进行PHY / MAC管理,它具有内部8 kiB RX / TX循环缓冲区.当数据包到达此芯片时,它会将它们一个接一个地写入RX缓冲区,但不会覆盖最旧的数据包.最旧的指针由指针指向,当用户完成读取时,指针必须更新以指向下一个数据包.当新数据包到达时,它还会在其中一个引脚上发送中断.

对于RX部分,我想像lwIP那样工作:当我们收到一个中断(保存它的地址和大小)时,表示新数据包已准备就绪,但只有当用户调用我们的IP堆栈功能时才继续它.这应该没问题;如果用户没有经常调用我们的函数,新的到达数据包将被丢弃,就是这样.用户为堆栈提供UDP回调.

现在,问题在于TX.假设我想将UDP数据包发送到某些IP,我不知道链接地址.在发送数据包之前必须发送ARP请求.如果UDP数据包在ARP回复之前进入该怎么办?它必须由我的UDP回调处理,但如果我想从此回调发送一些内容怎么办?我还在等待ARP回复.确定这种阻塞机制是不对的.

我的问题是:是否可以/接受异步发送?因此,如果我想发送一些内容,我提供带有回调的send函数,并在发送UDP数据包时调用它.这样,一切都是事件驱动的.

至于异步发送是否“可接受”,我无法想象为什么它会成为一个问题,只要你能在你的代码大小要求中实现它.

至于实现这种方案的最佳方式,我不知道你想要支持多大的数据包大小(我猜的比理论上的最大值64K要少很多),但我会分配一个发送缓冲区的环每当负责实际发送到硬件的进程运行其循环/中断/无论什么时,它都会检查每个实时缓冲区的ARP状态(有ARP条目,ARP请求未完成,ARP请求超时,没有ARP条目或未完成请求)并采取适当的措施(分别:推送到具有适当MAC的硬件,跳过这一次,丢弃,发送ARP请求).您可以在每次更新ARP表时触发此发送例程以便您可以满足任何必要的实时要求(尽管有些人会认为以太网不是并且永远不会是真正具有实时功能的系统,但那是另一个不介意火焰战争的论坛的话题.

0

精彩评论

暂无评论...
验证码 换一张
取 消