动手写简单的嵌入式操作系统二
作者:网络转载 发布时间:[ 2013/8/15 12:21:07 ] 推荐标签:
任务间如何通讯呢?可以用消息队列来实现。为什么要用消息队列?
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传它。
下面是一个简单的实现,很容易看懂
/*用于对于的标记消息队列是否使用*/
uint8 MsgQueueFlag[MAX_QUEUE_NUMBER];
/*实际的所有消息队列*/
OS_Q MsgQueue[MAX_QUEUE_NUMBER];
/*
* 创建消息队列
*/
OS_Q* OSQCreate()
{
OS_CPU_SR cpu_sr = 0;
uint32 index;
OS_ENTER_CRITICAL();
for(index=0;index<MAX_QUEUE_NUMBER;index++)
{
/*该消息队列未被使用*/
if (MsgQueueFlag[index]==0)
{
MsgQueueFlag[index]=1;
/*该队列首尾初始化*/
MsgQueue[index].front=NULL;
MsgQueue[index].rear=NULL;
OS_EXIT_CRITICAL();
return &(MsgQueue[index]);
}
}
OS_EXIT_CRITICAL();
return (OS_Q*)NULL;
}
/*
*删除消息队列
*/
int8 OSQDelate(OS_Q* q)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
/*信号量不存在*/
if (q == NULL)
{
OS_EXIT_CRITICAL();
return OS_Err;
}
/*队列指针越界*/
if ((( q-MsgQueue ) < 0)||(( q-MsgQueue ) > (MAX_QUEUE_NUMBER-1)))
{
OS_EXIT_CRITICAL();
return OS_Err;
}
/*将标记位置0*/
MsgQueueFlag[q-MsgQueue] = (uint8)0;
OS_EXIT_CRITICAL();
return OS_OK;
}
/*
*发送一个消息
*该函数可用在中断函数中
*/
int8 OSQPost(OS_Q* q,OS_MSG msg)
{
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
if (q == NULL)
{
OS_EXIT_CRITICAL();
return OS_Err;
}
if ((( q-MsgQueue ) < 0)||(( q-MsgQueue ) > (MAX_QUEUE_NUMBER-1)))
{
OS_EXIT_CRITICAL();
return OS_Err;
}
if((q->rear+1)%MAX_MSG_NUMBER==q->front)
{
OS_EXIT_CRITICAL();
return OS_Err;
}
else
{
q->msgQueue[q->rear]=msg;
q->rear=(q->rear+1)%MAX_MSG_NUMBER;
OS_EXIT_CRITICAL();
return OS_OK;
}
}

sales@spasvo.com