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;
}
}