嵌入式消息邮箱、消息队列验证C源代码

嵌入式消息邮箱、消息队列验证源代码贴制如下:

//****************************************************************************************//

#include <stdio.h>
#include <unistd.h>
#include "includes.h"

//定义任务堆栈大小
#define TASK_STACKSIZE 2048

//定义各任务堆栈
OS_STK start_task_stk[TASK_STACKSIZE];
OS_STK mail_sender_stk[TASK_STACKSIZE];
OS_STK mail_receiver_stk[TASK_STACKSIZE];
OS_STK msg_sender_stk[TASK_STACKSIZE];
OS_STK msg_receiver_stk[TASK_STACKSIZE];

//分配各任务优先级
#define START_TASK_PRIORITY         1
#define MAIL_SENDER_PRIORITY        2
#define MAIL_RECEIVER_PRIORITY      3
#define MSG_SENDER_PRIORITY         4
#define MSG_RECEIVER_PRIORITY       5

//定义1个邮箱
OS_EVENT  *mailbox;

//定义消息队列 (msgqueue)
#define     QUEUE_SIZE  10                  //消息队列大小
OS_EVENT    *msgqueue;                      //消息队列事件指针
void        *msgqueueTbl[QUEUE_SIZE];       //队列缓冲区

//用于发送消息队列的数据
INT32U      data_arr[QUEUE_SIZE] = {0,1,2,3,4,5,6,7,8,9};

//局部函数声明
int initOSDataStructs(void);            //初始化邮箱和消息队列的数据结构
int initCreateTasks(void);              //初始化任务

//邮箱部分
//邮件发送任务: 每隔2s将当前时间发送给mailbox
void MailSend(void* pdata)
{
    INT32U time;
    while (1)
    {
        OSTimeDlyHMSM(0, 0, 2, 0);
        time = OSTimeGet();
        //把消息发送到mailbox
        OSMboxPost(mailbox,(void *)&time);
        printf("Task send the message: %lu in mailbox\n",time);
    }
}

//邮件接收任务
void MailReceiver(void* pdata)
{
    INT8U return_code = OS_NO_ERR;
    INT32U *mbox_contents;              //指向邮件内容的指针
    while (1)
    {
        //从mailbox接收邮件,如果邮箱为空,则一直等待
        mbox_contents = (INT32U *)OSMboxPend(mailbox, 0, &return_code);
        printf("Task get the message: %lu in mailbox\n",(*mbox_contents));
        OSTimeDlyHMSM(0, 0, 1, 0);
    }
}

//消息队列部分
//发送消息任务: 将消息通过消息队列发送给所有等待消息的任务,当队列满时,延时2s
void MsgSender(void* pdata)
{
    INT8U  send_cnt = 0;    //定义发送计数器,用于循环发送数组中的数据
    OS_Q_DATA queue_data;   //存放消息队列的事件控制块中的信息
    while (1)
    {
        OSQQuery(msgqueue, &queue_data);    //查询消息队列的信息
        if(queue_data.OSNMsgs < QUEUE_SIZE) //查询消息队列是否已满
        {
            //消息队列未满时,将消息发送到消息队列
            OSQPost(msgqueue,(void *)&data_arr[send_cnt]);
            if(send_cnt == QUEUE_SIZE-1)
                send_cnt = 0;
            else
                send_cnt++;
        }
        else
        {
            //消息队列已满,延时2s
            OSTimeDlyHMSM(0, 0, 2, 0);
        }
    }
}

//消息接收任务:每200ms接收一次消息队列的消息
void MsgReceiver(void* pdata)
{
    INT8U return_code = OS_NO_ERR;
    INT32U *msg_rec;                           //存储接收到的消息
    while (1)
    {   //到msgqueue接收消息,如果消息队列为空,则一直等待
        msg_rec = (INT32U *)OSQPend(msgqueue, 0, &return_code);
        printf("Receive message: %lu \n",*msg_rec);
        OSTimeDlyHMSM(0, 0, 0, 20);   //延时200ms
    }
}

//初始化各子任务
void  start_task(void* pdata)
{
    //初始化消息队列和邮箱的数据结构
    initOSDataStructs();
    //创建子任务
    initCreateTasks();
    OSTaskDel(OS_PRIO_SELF);
    while (1);
}

int initOSDataStructs(void)
{   //初始化邮箱的数据结构
    mailbox = OSMboxCreate((void *)NULL);
    //初始化消息队列的数据结构
    msgqueue = OSQCreate(&msgqueueTbl[0], QUEUE_SIZE);
    return 0;
}

int initCreateTasks(void)
{

    //创建MailSender任务
    OSTaskCreateExt(MailSend,
                             NULL,
                             &mail_sender_stk[TASK_STACKSIZE-1],
                             MAIL_SENDER_PRIORITY,
                             MAIL_SENDER_PRIORITY,
                             mail_sender_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);

    //创建MAILReceiver任务
    OSTaskCreateExt(MailReceiver,
                             NULL,
                             &mail_receiver_stk[TASK_STACKSIZE-1],
                             MAIL_RECEIVER_PRIORITY,
                             MAIL_RECEIVER_PRIORITY,
                             mail_receiver_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
    //创建MsgSender任务
    OSTaskCreateExt(MsgSender,
                             NULL,
                             &msg_sender_stk[TASK_STACKSIZE-1],
                             MSG_SENDER_PRIORITY,
                             MSG_SENDER_PRIORITY,
                             msg_sender_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);

    //创建MsgReceiver任务
    OSTaskCreateExt(MsgReceiver,
                             NULL,
                             &msg_receiver_stk[TASK_STACKSIZE-1],
                             MSG_RECEIVER_PRIORITY,
                             MSG_RECEIVER_PRIORITY,
                             msg_receiver_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);

    return 0;
}

//main函数
int main (void)
{
    //创建父任务
    OSTaskCreateExt(start_task,
                             NULL,
                             &start_task_stk[TASK_STACKSIZE-1],
                             START_TASK_PRIORITY,
                             START_TASK_PRIORITY,
                             start_task_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
    OSStart();  //启动uCOSII系统
    return 0;
}

//****************************************************************************************//

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mingrizhiguang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值