您的位置:首页 > 编程语言

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: