【问题标题】:Is UDP interrupts-proof?UDP 防中断吗?
【发布时间】:2013-06-11 18:32:45
【问题描述】:

一个简单的问题:Arduino 上的中断是否会以任何方式干扰通过 UDP 发送和接收数据报?还是数据在某种缓冲区中“等待”?

如果对答案有用,我正在通过 TP-LINK WR702N Nano 在联想 X201 上使用带有以太网屏蔽的 Arduino Mega 上的 UDP 库和 Qt 的 QUdpSocket。

谢谢, 神秘先生

【问题讨论】:

  • 更新您的帖子以指明您用于以太网连接的硬件。
  • 完成。我不知道它是特定于设备的,除了中断部分。不应该是协议吗?
  • 作为一个协议,它不会关心诸如中断之类的东西。因此它将取决于设备、平台、操作系统等。目前尚不清楚您正在寻找什么样的答案 - 并且 TCP/IP 堆栈的处理方式大不相同,例如一个Arduino和一个运行例如的盒子Linux。

标签: qt udp arduino interrupt ethernet


【解决方案1】:

Arduino 以太网扩展板基于 Wiznet W5100 芯片,该芯片包含一个 16k 缓冲区,用于 Rx 和 Tx 缓冲区data sheet。该芯片实现了协议栈,这意味着数据包的接收和传输独立于 Arduino 主板芯片。对于任何实际数量的数据传输,主芯片上的中断或任务都不会干扰网络堆栈。如果您正在传输 16k 规模的数据并且无法跟上,那么您可能会开始丢失数据。

Arduino wifi shield 实际上包含一个比 Arduino 本身“更大”的微控制器,它也可以缓冲以太网流量。以太网芯片成本与 Arduino 一样高的部分原因是它们承担了大部分工作负载。

思考“中断会打断什么”这个问题?是个好问题。您可以确保 loop() 中的所有内容都将在任何时候中断,或者更好地考虑每个可能的时间点。中断不在 C++ 代码级别发生,而是在机器代码级别发生。在任何 C++ 代码行的中间,您都应该预期会发生中断。因此,与 loop() 代码共享变量的中断处理程序需要仔细考虑。例如,如果您的 loop() 包含

y = 3 + 4*x * 5 * x*x;

并且中断处理程序修改了全局变量 x,y 的值可能会以一些不可能的值结束。如果你的 loop() 中有操作需要防止中断,你可以禁用中断

see noInterupts()

【讨论】:

  • 很好的答案,除了谢谢你,我无话可说!
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多