C 代码----在MCU中构建消息队列
2012-03-12 20:14
330 查看
MCU的WHILE(1)就是个操作系统。资源有限啊,怎么统一规划、调度各种中断源呢,贴一下自己经常用的一个消息队列。
//头文件uMsg.h
#ifndef _U_MSG_H_
#define _U_MSG_H_
#include "uGlobe.h"
#define Err_Msg_Full -1
#define Err_Msg_Empty -2
#define Max_QueueMsg_Size 64
typedef struct Msg_
{
UINT msg;
UINT wparam;
int lparam;
}Msg;
typedef struct QueueMsg_
{
UINT write_pos;
UINT read_pos;
UINT count;
Msg item[Max_QueueMsg_Size];
}QueueMsg;
//extern QueueMsg g_QueueMsg; //全局消息队列
void InitQueueMsg(void); //初始化消息队列
char PostMsg(Msg* item); //发送消息到队列
char PickMsg(Msg* item); //获取一条消息
#endif
//c文件
#include "uMsg.h"
QueueMsg g_QueueMsg; //全局消息队列
#define Max_QueueMsg_Size 64
void InitQueueMsg(void) //初始化消息队列
{
g_QueueMsg.write_pos = 0;
g_QueueMsg.read_pos = 0;
g_QueueMsg.count = 0;
}
static char QueueFull() //消息队列满
{
return (g_QueueMsg.write_pos + 1) % Max_QueueMsg_Size == g_QueueMsg.read_pos;
}
static char QueueEmpty() //消息队列空
{
return g_QueueMsg.read_pos == g_QueueMsg.write_pos;
}
char PostMsg(Msg* item) //发送消息到队列
{
if(QueueFull())
return 0;
else
{
g_QueueMsg.item[g_QueueMsg.write_pos].msg = item->msg;
g_QueueMsg.item[g_QueueMsg.write_pos].wparam = item->wparam;
g_QueueMsg.item[g_QueueMsg.write_pos].lparam = item->lparam;
g_QueueMsg.write_pos = (g_QueueMsg.write_pos + 1) % Max_QueueMsg_Size;
return 1;
}
}
char PickMsg(Msg* item) //获取一条消息
{
if(QueueEmpty())
return 0;
else
{
item->msg = g_QueueMsg.item[g_QueueMsg.read_pos].msg;
item->wparam = g_QueueMsg.item[g_QueueMsg.read_pos].wparam;
item->lparam = g_QueueMsg.item[g_QueueMsg.read_pos].lparam;
g_QueueMsg.read_pos = (g_QueueMsg.read_pos + 1) % Max_QueueMsg_Size; //移动尾指针
return 1;
}
}
//头文件uMsg.h
#ifndef _U_MSG_H_
#define _U_MSG_H_
#include "uGlobe.h"
#define Err_Msg_Full -1
#define Err_Msg_Empty -2
#define Max_QueueMsg_Size 64
typedef struct Msg_
{
UINT msg;
UINT wparam;
int lparam;
}Msg;
typedef struct QueueMsg_
{
UINT write_pos;
UINT read_pos;
UINT count;
Msg item[Max_QueueMsg_Size];
}QueueMsg;
//extern QueueMsg g_QueueMsg; //全局消息队列
void InitQueueMsg(void); //初始化消息队列
char PostMsg(Msg* item); //发送消息到队列
char PickMsg(Msg* item); //获取一条消息
#endif
//c文件
#include "uMsg.h"
QueueMsg g_QueueMsg; //全局消息队列
#define Max_QueueMsg_Size 64
void InitQueueMsg(void) //初始化消息队列
{
g_QueueMsg.write_pos = 0;
g_QueueMsg.read_pos = 0;
g_QueueMsg.count = 0;
}
static char QueueFull() //消息队列满
{
return (g_QueueMsg.write_pos + 1) % Max_QueueMsg_Size == g_QueueMsg.read_pos;
}
static char QueueEmpty() //消息队列空
{
return g_QueueMsg.read_pos == g_QueueMsg.write_pos;
}
char PostMsg(Msg* item) //发送消息到队列
{
if(QueueFull())
return 0;
else
{
g_QueueMsg.item[g_QueueMsg.write_pos].msg = item->msg;
g_QueueMsg.item[g_QueueMsg.write_pos].wparam = item->wparam;
g_QueueMsg.item[g_QueueMsg.write_pos].lparam = item->lparam;
g_QueueMsg.write_pos = (g_QueueMsg.write_pos + 1) % Max_QueueMsg_Size;
return 1;
}
}
char PickMsg(Msg* item) //获取一条消息
{
if(QueueEmpty())
return 0;
else
{
item->msg = g_QueueMsg.item[g_QueueMsg.read_pos].msg;
item->wparam = g_QueueMsg.item[g_QueueMsg.read_pos].wparam;
item->lparam = g_QueueMsg.item[g_QueueMsg.read_pos].lparam;
g_QueueMsg.read_pos = (g_QueueMsg.read_pos + 1) % Max_QueueMsg_Size; //移动尾指针
return 1;
}
}
相关文章推荐
- PTA 7-7(排序) Windows消息队列(25 分) 25分代码 优先队列
- 高可用消息队列服务构建-RABBITMQ
- activeMQ消息队列之JMS基础(附了一些代码帮助理解前期可跳过)
- 基于Linux的消息队列及多线程编程实现的聊天室(二)代码分析
- [示例] -- redis作为消息队列实现代码
- 进程间通信使用消息队列的试验代码与总结
- [代码笔记] python 之 堆栈与队列 _使用推导式构建
- PHP版 RabbitMQ小技巧(一)用代码获得服务器上的消息队列名
- RabbitMQ 消息队列(centos安装与php下代码测试)
- 深入理解FreeRTOS的任务机制和消息队列+附完整项目代码
- 进程间通信:消息队列(代码实现)
- 进程间通信:消息队列(代码实现)
- Netty构建分布式消息队列实现原理浅析
- 基于TableStore(表格存储)构建简易海量Topic消息队列
- 一些实用代码 消息队列 和 反解openIds
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
- Java利用Redis实现消息队列的示例代码
- 练习代码,写个消息队列发送接收
- 使用Redis构建消息队列和发布订阅系统