动手写简单的嵌入式操作系统二
作者:网络转载 发布时间:[ 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;
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11