我很难理解如何在Contiki中编写异步发送/接收。假设我正在使用xmac层,或任何基于packetbuf
的层。我正在发送消息或数据包列表。我开始使用void(*send)(mac_callback_t sent_callback, void *ptr)
发送消息。这将获取global
缓冲区packetbuf
中的消息,并尝试发送它。同时,在发送未决(例如,等待另一台设备唤醒或确认传输)的同时,该设备从第三台设备接收数据包。
此数据包是否会覆盖packetbuf
中等待发送的数据包?我该如何处理?
我以为您可能无法尝试发送数据包并侦听传入的数据包,但是有一个明显的死锁:两个设备同时向彼此发送消息。
我正在将更高级别的路由层移植到Contiki。这是我要移植到的第二个操作系统,但是以前的操作系统没有对传入和传出数据包使用单个缓冲区。
答案 0 :(得分:1)
packetbuf
是用于短期数据和元数据存储的空间。它的用途不是阻塞时间超过几个计时器滴答声的代码。如果您不能立即通过send()
函数发送数据包,请不要在此处阻止!您需要在将来安排计时器回调并返回MAC_TX_DEFERRED
。要在send()
的两次调用之间存储数据包数据,请使用queuebuf
模块。
接收和发送都只有一个packetbuf
的事实并不是问题,因为无线电无论如何都是半双工通信介质。它不能同时发送和接收数据。同样,首先将接收到的数据包存储在无线电芯片的内存中:它不会覆盖packetbuf
。 Contiki中断处理程序类似地永远不会直接写入packetbuf
。他们只是唤醒了rx处理程序进程,该进程将从无线电芯片中获取数据包并将其放入packetbuf
中。由于一个进程无法意外中断另一个进程,因此此操作是安全的:要发送数据包的进程不能中断读取另一个数据包的进程。
总而言之,建议是:
packetbuf
的内容会在Contiki流程上下文中产生执行时被保存。如果需要,请序列化为queuebuf
。packetbuf
。