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

时间:2018-08-11 00:19:49

标签: c embedded iot contiki

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

此数据包是否会覆盖packetbuf中等待发送的数据包?我该如何处理?

我以为您可能无法尝试发送数据包并侦听传入的数据包,但是有一个明显的死锁:两个设备同时向彼此发送消息。

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

1 个答案:

答案 0 :(得分:1)

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

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

总而言之,建议是:

  1. 请勿在Contiki进程上下文中阻塞(这是对此OS进行编程时的通用规则,并非特定于此问题)。
  2. 不要期望packetbuf的内容会在Contiki流程上下文中产生执行时被保存。如果需要,请序列化为queuebuf
  3. 请勿从中断上下文访问packetbuf