我无法理解如何在 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
中。由于一个进程不会意外中断另一个进程,因此此操作是安全的:想要发送数据包的进程无法中断正在读取另一个数据包的进程。
总而言之,建议是:
- 不要在 Contiki 进程上下文中阻塞(这是编程此操作系统时的通用规则,并非针对此问题)。
- 请勿期望在 Contiki 进程上下文中生成执行时保存
packetbuf
的内容。如果需要,请序列化到queuebuf
。 - 不要从中断上下文访问
packetbuf
。
关于c - 如果在待发送期间有传入数据包,packetbuf 如何在 ContikiOS 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51795401/