C 代码----在MCU中构建消息队列

7 篇文章 0 订阅
1 篇文章 0 订阅

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


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值