rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size)
{
register rt_ubase_t temp;
struct rt_mq_message *msg;
/* greater than one message size */
if (size > mq->msg_size) return -RT_ERROR;
#ifdef RT_USING_HOOK
if (rt_object_put_hook != RT_NULL) rt_object_put_hook(&(mq->parent.parent));
#endif
/* disable interrupt */
temp = rt_hw_interrupt_disable();
/* get a free list, there must be an empty item */
msg = (struct rt_mq_message*)mq->msg_queue_free;
/* message queue is full */
if (msg == RT_NULL)
{
/* enable interrupt */
rt_hw_interrupt_enable(temp);
return -RT_EFULL;
}
/* move free list pointer */
mq->msg_queue_free = msg->next;
/* enable interrupt */
rt_hw_interrupt_enable(temp);
/* copy buffer */
rt_memcpy(msg + 1, buffer, size);
/* disable interrupt */
temp = rt_hw_interrupt_disable();
/* link msg to message queue */
if (mq->msg_queue_tail != RT_NULL)
{
/* if the tail exists, */
((struct rt_mq_message*)mq->msg_queue_tail)->next = msg; //这里指定tail的下个msg
}
/* the msg is the new tail of list, the next shall be NULL */
msg->next = RT_NULL;
/* set new tail */
mq->msg_queue_tail = msg; //这里怎么又把msg替代tail呢?
/* if the head is empty, set head */
if (mq->msg_queue_head == RT_NULL)mq->msg_queue_head = msg; //如果head,tail都为空,那么msg不是占用两个空间?
/* increase message entry */
mq->entry ++;
/* resume suspended thread */
if( !rt_list_isempty(&mq->parent.suspend_thread) )
{
rt_ipc_object_resume(&(mq->parent));
/* enable interrupt */
rt_hw_interrupt_enable(temp);
rt_schedule();
return RT_EOK;
}
/* enable interrupt */
rt_hw_interrupt_enable(temp);
return RT_EOK;
}
这个函数用中断开启和屏蔽很多次啊,能不能优化一下。