c - 如果在待发送期间有传入数据包,packetbuf 如何在 ContikiOS 中工作?

标签 c embedded iot contiki

我无法理解如何在 Contiki 中编写异步发送/接收。假设我使用 xmac 层或任何基于 packetbuf 的层。我正在发送一条消息或一个数据包列表。我开始使用 void(*send)(mac_callback_t sent_callback, void *ptr) 发送消息。这将获取 global 缓冲区 packetbuf 中的消息,并尝试发送它。同时,当发送挂起时(例如等待其他设备唤醒或确认传输),该设备从第三个设备接收数据包。

此数据包会覆盖 packetbuf 中等待发送的数据包吗?我应该如何处理这个问题?

我想也许你不能尝试发送数据包并监听传入的数据包,但是存在明显的死锁:2 个设备同时向彼此发送消息。

我正在将更高级别的路由层移植到 Contiki。这是我将其移植到的第二个操作系统,但之前的操作系统没有对传入和传出数据包使用单个缓冲区。

最佳答案

packetbuf 是用于短期数据和元数据存储的空间。它不适用于阻塞时间超过几个计时器滴答的代码。如果您无法立即从 send() 函数发送数据包,请不要阻塞!您需要安排将来的计时器回调并返回MAC_TX_DEFERRED。要在 send() 调用之间存储数据包数据,请使用 queuebuf 模块。

事实上,接收和发送都有一个packetbuf,这不是问题,因为 radio 无论如何都是半双工通信介质。它不能同时发送和接收数据。同样,接收到的数据包首先存储在 radio 芯片的内存中:它不会覆盖packetbuf。同样,Contiki 中断处理程序从不直接写入 packetbuf。它们只是唤醒 rx 处理程序进程,该进程从 radio 芯片获取数据包并将其放入 packetbuf 中。由于一个进程不会意外中断另一个进程,因此此操作是安全的:想要发送数据包的进程无法中断正在读取另一个数据包的进程。

总而言之,建议是:

  1. 不要在 Contiki 进程上下文中阻塞(这是编程此操作系统时的通用规则,并非针对此问题)。
  2. 请勿期望在 Contiki 进程上下文中生成执行时保存 packetbuf 的内容。如果需要,请序列化到 queuebuf
  3. 不要从中断上下文访问packetbuf

关于c - 如果在待发送期间有传入数据包,packetbuf 如何在 ContikiOS 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795401/

相关文章:

objective-c - 从文本字段求解数学方程

c - 如何在 C win32 控制台应用程序 EXE 文件中保存包含的库

r - R 是否可嵌入

c - 正确使用 fgets()

azure - 如何通过具有 Iot Edge Runtime 的另一台设备配置 Azure Iot 设备?

cloud - Bluemix 上是否有用于 Watson IBM IoT 服务的 CLI?

安卓 AllJoyn : Connection with second machine gives error of BusAttachement

c - 为什么循环在结束之前就停止了?

c - ncurses LINES 和 COLS 为 0?

c - 使用 C union 到数据中的 "reserve"空间 - 合理吗?