networking - 嵌入式 IP 堆栈 : is it okay/accepted to have asynchronous sending?

标签 networking embedded ip microcontroller avr

我正在尝试为 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。假设我想向某个我不知道链接地址的 IP 发送一个 UDP 数据包。在发送我的数据包之前,必须发送 ARP 请求。如果 UDP 数据包在 ARP 回复之前进入怎么办?它必须由我的 UDP 回调处理,但是如果我想从这个回调发送一些东西怎么办?我还在在这里等待 ARP 回复。这种阻塞机制肯定是不对的。

我的问题是:可以/接受异步发送吗? 因此,如果我想发送一些东西,我会为发送函数提供一个回调,并在可能发送 UDP 数据包时调用它。这样,一切都是事件驱动的。

最佳答案

至于异步发送是否“可以接受”,我无法想象为什么会出现问题,只要您可以在代码大小要求中实现它。

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

关于networking - 嵌入式 IP 堆栈 : is it okay/accepted to have asynchronous sending?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548903/

相关文章:

c - 如何知道应用程序的启动点

sockets - 使用辅助 IP 地址连接套接字

amazon-web-services - 在 AWS 实例中运行的 Elasticsearch 不可访问

networking - NetfilterQueue 实现

python - ConnectionRefused 是做什么的?

php - 如何使用 Moodle 站点库添加更多 Mnet 服务

c++ - iptables C++ 控制

jakarta-ee - 选择嵌入式EJB 3.x容器以在Tomcat上运行Java EE 5应用

将结构成员写入内存的通用接口(interface)模式?

android - 如何在我的 PC 上运行 Apache Tomcat Web 服务器并从真正的 Android 设备访问?