邮箱
- 邮箱的工作原理:
- 相较于其他IPC的特点:
- 数据交互功能
- 开销低,效率高
- 邮箱控制块:
struct rt_mailbox { struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint32_t *msg_pool; /**< start address of message buffer 邮件缓冲区地址*/ rt_uint16_t size; /**< size of message pool 容量*/ rt_uint16_t entry; /**< index of messages in msg_pool 邮件数目*/ rt_uint16_t in_offset; /**< input offset of the message buffer 邮箱的进偏移*/ rt_uint16_t out_offset; /**< output offset of the message buffer */ rt_list_t suspend_sender_thread; /**< sender thread suspended on this mailbox 邮箱满时,挂起的发送线程*/ }; typedef struct rt_mailbox *rt_mailbox_t;
-
两种发送函数的区别再有邮箱可能会满时。
/* 当数据的值小于四个字节,可以直接写入value,若大于4字节,要把数据的指针传给value。 如果邮箱满了,返回值会报错。 */ rt_err_t rt_mb_send(rt_mailbox_t mb, rt_uint32_t value); /*当邮箱满了,使用这个函数,线程可以等 可能造成阻塞,不能放在中断 */ rt_err_t rt_mb_send_wait(rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout);
消息队列
- 消息队列是对邮箱的扩展,消息队列能接收来自线程和中断的不同长度的消息,并把消息缓存在内存空间里,其他消息可以从消息队列里读取相应的消息,并进行处理。
- 特点:支持紧急消息
- 控制块
struct rt_messagequeue { struct rt_ipc_object parent; /**< inherit from ipc_object */ void *msg_pool; /**< start address of message queue 指向供给消息的地址*/ rt_uint16_t msg_size; /**< message size of each message 消息的长度,以4字节对齐*/ rt_uint16_t max_msgs; /**< max number of messages max_msgs=msg_pool/(msg_size+4) 因为存放消息的是循环列表,所以需要4字节存指针*/ rt_uint16_t entry; /**< index of messages in the queue 消息个数,进入+1,出去-1*/ void *msg_queue_head; /**< list head 第一条消息*/ void *msg_queue_tail; /**< list tail */ void *msg_queue_free; /**< pointer indicated the free node of queue 未被使用的消息框*/ }; typedef struct rt_messagequeue *rt_mq_t;